@qodalis/cli-server-plugin-admin 1.0.0-beta.1

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.
Files changed (54) hide show
  1. package/dist/auth/auth-controller.d.ts +15 -0
  2. package/dist/auth/auth-controller.d.ts.map +1 -0
  3. package/dist/auth/auth-controller.js +90 -0
  4. package/dist/auth/auth-controller.js.map +1 -0
  5. package/dist/auth/auth-middleware.d.ts +17 -0
  6. package/dist/auth/auth-middleware.d.ts.map +1 -0
  7. package/dist/auth/auth-middleware.js +35 -0
  8. package/dist/auth/auth-middleware.js.map +1 -0
  9. package/dist/auth/jwt-service.d.ts +15 -0
  10. package/dist/auth/jwt-service.d.ts.map +1 -0
  11. package/dist/auth/jwt-service.js +55 -0
  12. package/dist/auth/jwt-service.js.map +1 -0
  13. package/dist/cli-admin-builder.d.ts +85 -0
  14. package/dist/cli-admin-builder.d.ts.map +1 -0
  15. package/dist/cli-admin-builder.js +225 -0
  16. package/dist/cli-admin-builder.js.map +1 -0
  17. package/dist/controllers/config-controller.d.ts +11 -0
  18. package/dist/controllers/config-controller.d.ts.map +1 -0
  19. package/dist/controllers/config-controller.js +31 -0
  20. package/dist/controllers/config-controller.js.map +1 -0
  21. package/dist/controllers/logs-controller.d.ts +11 -0
  22. package/dist/controllers/logs-controller.d.ts.map +1 -0
  23. package/dist/controllers/logs-controller.js +32 -0
  24. package/dist/controllers/logs-controller.js.map +1 -0
  25. package/dist/controllers/plugins-controller.d.ts +11 -0
  26. package/dist/controllers/plugins-controller.d.ts.map +1 -0
  27. package/dist/controllers/plugins-controller.js +29 -0
  28. package/dist/controllers/plugins-controller.js.map +1 -0
  29. package/dist/controllers/status-controller.d.ts +16 -0
  30. package/dist/controllers/status-controller.d.ts.map +1 -0
  31. package/dist/controllers/status-controller.js +33 -0
  32. package/dist/controllers/status-controller.js.map +1 -0
  33. package/dist/controllers/ws-clients-controller.d.ts +17 -0
  34. package/dist/controllers/ws-clients-controller.d.ts.map +1 -0
  35. package/dist/controllers/ws-clients-controller.js +18 -0
  36. package/dist/controllers/ws-clients-controller.js.map +1 -0
  37. package/dist/index.d.ts +8 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +17 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/services/admin-config.d.ts +34 -0
  42. package/dist/services/admin-config.d.ts.map +1 -0
  43. package/dist/services/admin-config.js +94 -0
  44. package/dist/services/admin-config.js.map +1 -0
  45. package/dist/services/log-ring-buffer.d.ts +52 -0
  46. package/dist/services/log-ring-buffer.d.ts.map +1 -0
  47. package/dist/services/log-ring-buffer.js +119 -0
  48. package/dist/services/log-ring-buffer.js.map +1 -0
  49. package/dist/services/module-registry.d.ts +54 -0
  50. package/dist/services/module-registry.d.ts.map +1 -0
  51. package/dist/services/module-registry.js +84 -0
  52. package/dist/services/module-registry.js.map +1 -0
  53. package/dist/tsconfig.tsbuildinfo +1 -0
  54. package/package.json +44 -0
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLogsController = createLogsController;
4
+ const express_1 = require("express");
5
+ /**
6
+ * Creates the logs controller router.
7
+ *
8
+ * Routes:
9
+ * - GET / — query log entries with optional filtering
10
+ * Query params: level, search, limit, offset
11
+ */
12
+ function createLogsController(logBuffer) {
13
+ const router = (0, express_1.Router)();
14
+ router.get('/', (req, res) => {
15
+ const level = req.query.level;
16
+ const search = req.query.search;
17
+ const limit = req.query.limit ? parseInt(req.query.limit, 10) : undefined;
18
+ if (limit !== undefined && isNaN(limit)) {
19
+ res.status(400).json({ error: 'limit must be a valid integer' });
20
+ return;
21
+ }
22
+ const offset = req.query.offset ? parseInt(req.query.offset, 10) : undefined;
23
+ if (offset !== undefined && isNaN(offset)) {
24
+ res.status(400).json({ error: 'offset must be a valid integer' });
25
+ return;
26
+ }
27
+ const result = logBuffer.query({ level, search, limit, offset });
28
+ res.json(result);
29
+ });
30
+ return router;
31
+ }
32
+ //# sourceMappingURL=logs-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-controller.js","sourceRoot":"","sources":["../../controllers/logs-controller.ts"],"names":[],"mappings":";;AAUA,oDAsBC;AAhCD,qCAAoD;AAGpD;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,SAAwB;IACzD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAQ,EAAE;QAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAA2B,CAAC;QACpD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAA4B,CAAC;QACtD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAe,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpF,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;YACjE,OAAO;QACX,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC,CAAC;YAClE,OAAO;QACX,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Router } from 'express';
2
+ import { ModuleRegistry } from '../services/module-registry';
3
+ /**
4
+ * Creates the plugins controller router.
5
+ *
6
+ * Routes:
7
+ * - GET / — list all registered modules
8
+ * - POST /:id/toggle — toggle a module enabled/disabled
9
+ */
10
+ export declare function createPluginsController(moduleRegistry: ModuleRegistry): Router;
11
+ //# sourceMappingURL=plugins-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins-controller.d.ts","sourceRoot":"","sources":["../../controllers/plugins-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,cAAc,EAAE,cAAc,GAAG,MAAM,CAqB9E"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPluginsController = createPluginsController;
4
+ const express_1 = require("express");
5
+ /**
6
+ * Creates the plugins controller router.
7
+ *
8
+ * Routes:
9
+ * - GET / — list all registered modules
10
+ * - POST /:id/toggle — toggle a module enabled/disabled
11
+ */
12
+ function createPluginsController(moduleRegistry) {
13
+ const router = (0, express_1.Router)();
14
+ router.get('/', (_req, res) => {
15
+ res.json(moduleRegistry.list());
16
+ });
17
+ router.post('/:id/toggle', (req, res) => {
18
+ const { id } = req.params;
19
+ const result = moduleRegistry.toggle(id);
20
+ if (!result) {
21
+ res.status(404).json({ error: `Module '${id}' not found` });
22
+ return;
23
+ }
24
+ const { warning, ...moduleInfo } = result;
25
+ res.json(warning ? { ...moduleInfo, warning } : moduleInfo);
26
+ });
27
+ return router;
28
+ }
29
+ //# sourceMappingURL=plugins-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins-controller.js","sourceRoot":"","sources":["../../controllers/plugins-controller.ts"],"names":[],"mappings":";;AAUA,0DAqBC;AA/BD,qCAAoD;AAGpD;;;;;;GAMG;AACH,SAAgB,uBAAuB,CAAC,cAA8B;IAClE,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QACnD,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,GAAY,EAAE,GAAa,EAAQ,EAAE;QAC7D,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;YAC5D,OAAO;QACX,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC;QAC1C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { Router } from 'express';
2
+ export interface StatusDeps {
3
+ getActiveWsConnections: () => number;
4
+ getActiveShellSessions: () => number;
5
+ getRegisteredCommands: () => number;
6
+ getRegisteredJobs: () => number;
7
+ getEnabledFeatures: () => string[];
8
+ }
9
+ /**
10
+ * Creates the status controller router.
11
+ *
12
+ * Routes:
13
+ * - GET / — server status overview
14
+ */
15
+ export declare function createStatusController(deps: StatusDeps): Router;
16
+ //# sourceMappingURL=status-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-controller.d.ts","sourceRoot":"","sources":["../../controllers/status-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAEpD,MAAM,WAAW,UAAU;IACvB,sBAAsB,EAAE,MAAM,MAAM,CAAC;IACrC,sBAAsB,EAAE,MAAM,MAAM,CAAC;IACrC,qBAAqB,EAAE,MAAM,MAAM,CAAC;IACpC,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,MAAM,EAAE,CAAC;CACtC;AAID;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAuB/D"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStatusController = createStatusController;
4
+ const express_1 = require("express");
5
+ const startedAt = new Date().toISOString();
6
+ /**
7
+ * Creates the status controller router.
8
+ *
9
+ * Routes:
10
+ * - GET / — server status overview
11
+ */
12
+ function createStatusController(deps) {
13
+ const router = (0, express_1.Router)();
14
+ router.get('/', (_req, res) => {
15
+ const mem = process.memoryUsage();
16
+ res.json({
17
+ uptimeSeconds: Math.floor(process.uptime()),
18
+ startedAt,
19
+ memoryUsageMb: Math.round((mem.rss / 1024 / 1024) * 100) / 100,
20
+ cpuUsagePercent: null,
21
+ platform: 'node',
22
+ platformVersion: process.version,
23
+ activeWsConnections: deps.getActiveWsConnections(),
24
+ activeShellSessions: deps.getActiveShellSessions(),
25
+ registeredCommands: deps.getRegisteredCommands(),
26
+ registeredJobs: deps.getRegisteredJobs(),
27
+ os: process.platform,
28
+ enabledFeatures: deps.getEnabledFeatures(),
29
+ });
30
+ });
31
+ return router;
32
+ }
33
+ //# sourceMappingURL=status-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-controller.js","sourceRoot":"","sources":["../../controllers/status-controller.ts"],"names":[],"mappings":";;AAkBA,wDAuBC;AAzCD,qCAAoD;AAUpD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAE3C;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,IAAgB;IACnD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QACnD,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAElC,GAAG,CAAC,IAAI,CAAC;YACL,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3C,SAAS;YACT,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAC9D,eAAe,EAAE,IAAI;YACrB,QAAQ,EAAE,MAAM;YAChB,eAAe,EAAE,OAAO,CAAC,OAAO;YAChC,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,EAAE;YAClD,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,EAAE;YAClD,kBAAkB,EAAE,IAAI,CAAC,qBAAqB,EAAE;YAChD,cAAc,EAAE,IAAI,CAAC,iBAAiB,EAAE;YACxC,EAAE,EAAE,OAAO,CAAC,QAAQ;YACpB,eAAe,EAAE,IAAI,CAAC,kBAAkB,EAAE;SAC7C,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Router } from 'express';
2
+ export interface WsClientsDeps {
3
+ getClients: () => Array<{
4
+ id: string;
5
+ connectedAt: string;
6
+ remoteAddress: string;
7
+ type: string;
8
+ }>;
9
+ }
10
+ /**
11
+ * Creates the WebSocket clients controller router.
12
+ *
13
+ * Routes:
14
+ * - GET / — list connected WebSocket clients
15
+ */
16
+ export declare function createWsClientsController(deps: WsClientsDeps): Router;
17
+ //# sourceMappingURL=ws-clients-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-clients-controller.d.ts","sourceRoot":"","sources":["../../controllers/ws-clients-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,MAAM,KAAK,CAAC;QACpB,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACN;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAQrE"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createWsClientsController = createWsClientsController;
4
+ const express_1 = require("express");
5
+ /**
6
+ * Creates the WebSocket clients controller router.
7
+ *
8
+ * Routes:
9
+ * - GET / — list connected WebSocket clients
10
+ */
11
+ function createWsClientsController(deps) {
12
+ const router = (0, express_1.Router)();
13
+ router.get('/', (_req, res) => {
14
+ res.json(deps.getClients());
15
+ });
16
+ return router;
17
+ }
18
+ //# sourceMappingURL=ws-clients-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-clients-controller.js","sourceRoot":"","sources":["../../controllers/ws-clients-controller.ts"],"names":[],"mappings":";;AAiBA,8DAQC;AAzBD,qCAAoD;AAWpD;;;;;GAKG;AACH,SAAgB,yBAAyB,CAAC,IAAmB;IACzD,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QACnD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { CliAdminBuilder, CliAdminBuildDeps, CliAdminPluginResult } from './cli-admin-builder';
2
+ export { LogRingBuffer, LogEntry, LogQueryParams, LogQueryResult } from './services/log-ring-buffer';
3
+ export { ModuleRegistry, ModuleInfo, IRegistryLike, IBuilderLike } from './services/module-registry';
4
+ export { AdminConfig, AdminCredentials, ConfigSection } from './services/admin-config';
5
+ export { signToken, verifyToken, JwtPayload } from './auth/jwt-service';
6
+ export { AuthControllerResult } from './auth/auth-controller';
7
+ export { createAuthMiddleware, AuthenticatedRequest } from './auth/auth-middleware';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAuthMiddleware = exports.verifyToken = exports.signToken = exports.AdminConfig = exports.ModuleRegistry = exports.LogRingBuffer = exports.CliAdminBuilder = void 0;
4
+ var cli_admin_builder_1 = require("./cli-admin-builder");
5
+ Object.defineProperty(exports, "CliAdminBuilder", { enumerable: true, get: function () { return cli_admin_builder_1.CliAdminBuilder; } });
6
+ var log_ring_buffer_1 = require("./services/log-ring-buffer");
7
+ Object.defineProperty(exports, "LogRingBuffer", { enumerable: true, get: function () { return log_ring_buffer_1.LogRingBuffer; } });
8
+ var module_registry_1 = require("./services/module-registry");
9
+ Object.defineProperty(exports, "ModuleRegistry", { enumerable: true, get: function () { return module_registry_1.ModuleRegistry; } });
10
+ var admin_config_1 = require("./services/admin-config");
11
+ Object.defineProperty(exports, "AdminConfig", { enumerable: true, get: function () { return admin_config_1.AdminConfig; } });
12
+ var jwt_service_1 = require("./auth/jwt-service");
13
+ Object.defineProperty(exports, "signToken", { enumerable: true, get: function () { return jwt_service_1.signToken; } });
14
+ Object.defineProperty(exports, "verifyToken", { enumerable: true, get: function () { return jwt_service_1.verifyToken; } });
15
+ var auth_middleware_1 = require("./auth/auth-middleware");
16
+ Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_middleware_1.createAuthMiddleware; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AAAA,yDAA+F;AAAtF,oHAAA,eAAe,OAAA;AACxB,8DAAqG;AAA5F,gHAAA,aAAa,OAAA;AACtB,8DAAqG;AAA5F,iHAAA,cAAc,OAAA;AACvB,wDAAuF;AAA9E,2GAAA,WAAW,OAAA;AACpB,kDAAwE;AAA/D,wGAAA,SAAS,OAAA;AAAE,0GAAA,WAAW,OAAA;AAE/B,0DAAoF;AAA3E,uHAAA,oBAAoB,OAAA"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Admin configuration — reads credentials and settings from environment variables.
3
+ */
4
+ export interface AdminCredentials {
5
+ username: string;
6
+ password: string;
7
+ }
8
+ export interface ConfigEntry {
9
+ key: string;
10
+ value: string | number | boolean | string[];
11
+ type: 'string' | 'number' | 'boolean' | 'string[]';
12
+ description: string;
13
+ mutable: boolean;
14
+ }
15
+ export interface ConfigSection {
16
+ name: string;
17
+ mutable: boolean;
18
+ settings: ConfigEntry[];
19
+ }
20
+ export declare class AdminConfig {
21
+ private _username;
22
+ private _password;
23
+ private _jwtSecret;
24
+ private readonly _mutableSettings;
25
+ constructor();
26
+ setCredentials(username: string, password: string): void;
27
+ setJwtSecret(secret: string): void;
28
+ get jwtSecret(): string | undefined;
29
+ validateCredentials(username: string, password: string): boolean;
30
+ getConfigSections(): ConfigSection[];
31
+ getMutableSettings(): Record<string, unknown>;
32
+ updateMutableSettings(values: Record<string, unknown>): void;
33
+ }
34
+ //# sourceMappingURL=admin-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-config.d.ts","sourceRoot":"","sources":["../../services/admin-config.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC;IAC5C,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;;IAYhE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxD,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOhE,iBAAiB,IAAI,aAAa,EAAE;IAsCpC,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI7C,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAG/D"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdminConfig = void 0;
4
+ const crypto_1 = require("crypto");
5
+ /**
6
+ * Timing-safe string comparison. Hashes both strings with SHA-256
7
+ * to normalize length, then uses timingSafeEqual.
8
+ */
9
+ function safeCompare(a, b) {
10
+ const hashA = (0, crypto_1.createHash)('sha256').update(a).digest();
11
+ const hashB = (0, crypto_1.createHash)('sha256').update(b).digest();
12
+ return (0, crypto_1.timingSafeEqual)(hashA, hashB);
13
+ }
14
+ class AdminConfig {
15
+ _username;
16
+ _password;
17
+ _jwtSecret;
18
+ _mutableSettings = {};
19
+ constructor() {
20
+ this._username = process.env.QCLI_ADMIN_USERNAME ?? 'admin';
21
+ this._password = process.env.QCLI_ADMIN_PASSWORD ?? 'admin';
22
+ this._jwtSecret = process.env.QCLI_ADMIN_JWT_SECRET;
23
+ if (this._username === 'admin' && this._password === 'admin') {
24
+ console.warn('[qcli-admin] WARNING: Using default admin credentials. Set QCLI_ADMIN_USERNAME and QCLI_ADMIN_PASSWORD environment variables.');
25
+ }
26
+ }
27
+ setCredentials(username, password) {
28
+ this._username = username;
29
+ this._password = password;
30
+ }
31
+ setJwtSecret(secret) {
32
+ this._jwtSecret = secret;
33
+ }
34
+ get jwtSecret() {
35
+ return this._jwtSecret;
36
+ }
37
+ validateCredentials(username, password) {
38
+ // Evaluate both comparisons to avoid short-circuit timing leaks
39
+ const usernameMatch = safeCompare(username, this._username);
40
+ const passwordMatch = safeCompare(password, this._password);
41
+ return usernameMatch && passwordMatch;
42
+ }
43
+ getConfigSections() {
44
+ const customEntries = Object.entries(this._mutableSettings).map(([key, val]) => ({
45
+ key,
46
+ value: val,
47
+ type: inferType(val),
48
+ description: '',
49
+ mutable: true,
50
+ }));
51
+ return [
52
+ {
53
+ name: 'server',
54
+ mutable: false,
55
+ settings: [
56
+ { key: 'platform', value: 'node', type: 'string', description: 'Server platform', mutable: false },
57
+ { key: 'platformVersion', value: process.version, type: 'string', description: 'Node.js version', mutable: false },
58
+ { key: 'nodeEnv', value: process.env.NODE_ENV ?? 'development', type: 'string', description: 'NODE_ENV', mutable: false },
59
+ { key: 'pid', value: process.pid, type: 'number', description: 'Process ID', mutable: false },
60
+ ],
61
+ },
62
+ {
63
+ name: 'auth',
64
+ mutable: false,
65
+ settings: [
66
+ { key: 'username', value: this._username, type: 'string', description: 'Admin username', mutable: false },
67
+ { key: 'jwtSecretConfigured', value: !!this._jwtSecret || !!process.env.QCLI_ADMIN_JWT_SECRET, type: 'boolean', description: 'Whether JWT secret is explicitly set', mutable: false },
68
+ ],
69
+ },
70
+ {
71
+ name: 'custom',
72
+ mutable: true,
73
+ settings: customEntries,
74
+ },
75
+ ];
76
+ }
77
+ getMutableSettings() {
78
+ return { ...this._mutableSettings };
79
+ }
80
+ updateMutableSettings(values) {
81
+ Object.assign(this._mutableSettings, values);
82
+ }
83
+ }
84
+ exports.AdminConfig = AdminConfig;
85
+ function inferType(val) {
86
+ if (typeof val === 'boolean')
87
+ return 'boolean';
88
+ if (typeof val === 'number')
89
+ return 'number';
90
+ if (Array.isArray(val))
91
+ return 'string[]';
92
+ return 'string';
93
+ }
94
+ //# sourceMappingURL=admin-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-config.js","sourceRoot":"","sources":["../../services/admin-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Circular buffer capturing application logs for the admin dashboard.
3
+ */
4
+ export interface LogEntry {
5
+ timestamp: string;
6
+ level: 'INFO' | 'WARN' | 'ERROR' | 'DEBUG';
7
+ message: string;
8
+ source: string;
9
+ }
10
+ export interface LogQueryParams {
11
+ level?: string;
12
+ search?: string;
13
+ limit?: number;
14
+ offset?: number;
15
+ }
16
+ export interface LogQueryResult {
17
+ entries: LogEntry[];
18
+ total: number;
19
+ }
20
+ export declare class LogRingBuffer {
21
+ private readonly _buffer;
22
+ private readonly _capacity;
23
+ private _head;
24
+ private _count;
25
+ private _broadcastFn?;
26
+ private _origLog?;
27
+ private _origWarn?;
28
+ private _origError?;
29
+ constructor(capacity?: number);
30
+ setBroadcastFn(fn: (message: Record<string, unknown>) => void): void;
31
+ /**
32
+ * Add a log entry to the buffer.
33
+ */
34
+ push(entry: LogEntry): void;
35
+ /**
36
+ * Query the buffer with optional filtering and pagination.
37
+ */
38
+ query(params?: LogQueryParams): LogQueryResult;
39
+ /**
40
+ * Return all entries in chronological order.
41
+ */
42
+ private getAll;
43
+ /**
44
+ * Intercept console.log, console.warn, and console.error to capture logs.
45
+ */
46
+ interceptConsole(): void;
47
+ /**
48
+ * Restore original console methods.
49
+ */
50
+ restoreConsole(): void;
51
+ }
52
+ //# sourceMappingURL=log-ring-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-ring-buffer.d.ts","sourceRoot":"","sources":["../../services/log-ring-buffer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,QAAQ;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,YAAY,CAAC,CAA6C;IAElE,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,SAAS,CAAC,CAAsB;IACxC,OAAO,CAAC,UAAU,CAAC,CAAuB;gBAE9B,QAAQ,SAAO;IAK3B,cAAc,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,IAAI;IAIpE;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAgB3B;;OAEG;IACH,KAAK,CAAC,MAAM,GAAE,cAAmB,GAAG,cAAc;IAqBlD;;OAEG;IACH,OAAO,CAAC,MAAM;IAWd;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAoCxB;;OAEG;IACH,cAAc,IAAI,IAAI;CAKzB"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * Circular buffer capturing application logs for the admin dashboard.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LogRingBuffer = void 0;
7
+ class LogRingBuffer {
8
+ _buffer;
9
+ _capacity;
10
+ _head = 0;
11
+ _count = 0;
12
+ _broadcastFn;
13
+ _origLog;
14
+ _origWarn;
15
+ _origError;
16
+ constructor(capacity = 1000) {
17
+ this._capacity = capacity;
18
+ this._buffer = new Array(capacity);
19
+ }
20
+ setBroadcastFn(fn) {
21
+ this._broadcastFn = fn;
22
+ }
23
+ /**
24
+ * Add a log entry to the buffer.
25
+ */
26
+ push(entry) {
27
+ entry.level = entry.level.toUpperCase();
28
+ this._buffer[this._head] = entry;
29
+ this._head = (this._head + 1) % this._capacity;
30
+ if (this._count < this._capacity) {
31
+ this._count++;
32
+ }
33
+ if (this._broadcastFn) {
34
+ this._broadcastFn({
35
+ type: 'log:entry',
36
+ ...entry,
37
+ });
38
+ }
39
+ }
40
+ /**
41
+ * Query the buffer with optional filtering and pagination.
42
+ */
43
+ query(params = {}) {
44
+ const { level, search, limit = 100, offset = 0 } = params;
45
+ let entries = this.getAll();
46
+ if (level) {
47
+ const upperLevel = level.toUpperCase();
48
+ entries = entries.filter((e) => e.level === upperLevel);
49
+ }
50
+ if (search) {
51
+ const lower = search.toLowerCase();
52
+ entries = entries.filter((e) => e.message.toLowerCase().includes(lower));
53
+ }
54
+ const total = entries.length;
55
+ const paged = entries.slice(offset, offset + limit);
56
+ return { entries: paged, total };
57
+ }
58
+ /**
59
+ * Return all entries in chronological order.
60
+ */
61
+ getAll() {
62
+ if (this._count < this._capacity) {
63
+ return this._buffer.slice(0, this._count);
64
+ }
65
+ // Buffer has wrapped — read from head to end, then start to head
66
+ return [
67
+ ...this._buffer.slice(this._head),
68
+ ...this._buffer.slice(0, this._head),
69
+ ];
70
+ }
71
+ /**
72
+ * Intercept console.log, console.warn, and console.error to capture logs.
73
+ */
74
+ interceptConsole() {
75
+ this._origLog = console.log;
76
+ this._origWarn = console.warn;
77
+ this._origError = console.error;
78
+ console.log = (...args) => {
79
+ this.push({
80
+ timestamp: new Date().toISOString(),
81
+ level: 'INFO',
82
+ message: args.map(String).join(' '),
83
+ source: 'console',
84
+ });
85
+ this._origLog.apply(console, args);
86
+ };
87
+ console.warn = (...args) => {
88
+ this.push({
89
+ timestamp: new Date().toISOString(),
90
+ level: 'WARN',
91
+ message: args.map(String).join(' '),
92
+ source: 'console',
93
+ });
94
+ this._origWarn.apply(console, args);
95
+ };
96
+ console.error = (...args) => {
97
+ this.push({
98
+ timestamp: new Date().toISOString(),
99
+ level: 'ERROR',
100
+ message: args.map(String).join(' '),
101
+ source: 'console',
102
+ });
103
+ this._origError.apply(console, args);
104
+ };
105
+ }
106
+ /**
107
+ * Restore original console methods.
108
+ */
109
+ restoreConsole() {
110
+ if (this._origLog)
111
+ console.log = this._origLog;
112
+ if (this._origWarn)
113
+ console.warn = this._origWarn;
114
+ if (this._origError)
115
+ console.error = this._origError;
116
+ }
117
+ }
118
+ exports.LogRingBuffer = LogRingBuffer;
119
+ //# sourceMappingURL=log-ring-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-ring-buffer.js","sourceRoot":"","sources":["../../services/log-ring-buffer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { ICliModule, ICliCommandProcessor } from '@qodalis/cli-server-abstractions';
2
+ /**
3
+ * Provides information about a tracked module for the admin dashboard.
4
+ */
5
+ export interface ModuleInfo {
6
+ id: string;
7
+ name: string;
8
+ version: string;
9
+ description: string;
10
+ author: string;
11
+ enabled: boolean;
12
+ processorCount: number;
13
+ processors: string[];
14
+ }
15
+ /**
16
+ * Registry interface for the CliBuilder — the admin plugin only needs
17
+ * register/unregister capabilities.
18
+ */
19
+ export interface IRegistryLike {
20
+ register(processor: ICliCommandProcessor): void;
21
+ readonly processors: ReadonlyArray<ICliCommandProcessor>;
22
+ }
23
+ /**
24
+ * Registry interface for the CliBuilder — the admin plugin reads modules from it.
25
+ */
26
+ export interface IBuilderLike {
27
+ readonly modules: ReadonlyArray<ICliModule>;
28
+ readonly fileStorageProvider?: unknown;
29
+ readonly fileSystemOptions?: unknown;
30
+ }
31
+ /**
32
+ * Tracks registered CLI modules and allows toggling them on/off.
33
+ */
34
+ export declare class ModuleRegistry {
35
+ private readonly _tracked;
36
+ private readonly _registry;
37
+ private readonly _builder;
38
+ constructor(registry: IRegistryLike, builder: IBuilderLike);
39
+ /**
40
+ * List all tracked modules with their current status.
41
+ */
42
+ list(): ModuleInfo[];
43
+ /**
44
+ * Toggle a module's enabled/disabled state.
45
+ * When disabled, its processors are removed from the command registry.
46
+ * When enabled, they are re-registered.
47
+ */
48
+ toggle(id: string): (ModuleInfo & {
49
+ warning?: string;
50
+ }) | undefined;
51
+ private moduleId;
52
+ private toInfo;
53
+ }
54
+ //# sourceMappingURL=module-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-registry.d.ts","sourceRoot":"","sources":["../../services/module-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAEpF;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AAQD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;CAC5D;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CACxC;AAED;;GAEG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAE5B,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY;IAe1D;;OAEG;IACH,IAAI,IAAI,UAAU,EAAE;IAepB;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,UAAU,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS;IAsBnE,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,MAAM;CAcjB"}