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

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 (60) hide show
  1. package/README.md +177 -0
  2. package/dashboard/assets/index-CThBrI8x.js +248 -0
  3. package/dashboard/assets/index-SAFC7f6i.css +32 -0
  4. package/dashboard/assets/wasm/qodalis_cli_wasm_bg.wasm +0 -0
  5. package/dashboard/index.html +14 -0
  6. package/dist/auth/auth-controller.d.ts +5 -1
  7. package/dist/auth/auth-controller.d.ts.map +1 -1
  8. package/dist/auth/auth-controller.js +35 -5
  9. package/dist/auth/auth-controller.js.map +1 -1
  10. package/dist/auth/auth-middleware.d.ts +2 -1
  11. package/dist/auth/auth-middleware.d.ts.map +1 -1
  12. package/dist/auth/auth-middleware.js +35 -1
  13. package/dist/auth/auth-middleware.js.map +1 -1
  14. package/dist/auth/auth-provider.d.ts +33 -0
  15. package/dist/auth/auth-provider.d.ts.map +1 -0
  16. package/dist/auth/auth-provider.js +16 -0
  17. package/dist/auth/auth-provider.js.map +1 -0
  18. package/dist/auth/jwt-service.d.ts +12 -2
  19. package/dist/auth/jwt-service.d.ts.map +1 -1
  20. package/dist/auth/jwt-service.js +11 -2
  21. package/dist/auth/jwt-service.js.map +1 -1
  22. package/dist/cli-admin-builder.d.ts +42 -9
  23. package/dist/cli-admin-builder.d.ts.map +1 -1
  24. package/dist/cli-admin-builder.js +71 -49
  25. package/dist/cli-admin-builder.js.map +1 -1
  26. package/dist/controllers/plugins-controller.d.ts.map +1 -1
  27. package/dist/controllers/plugins-controller.js +1 -2
  28. package/dist/controllers/plugins-controller.js.map +1 -1
  29. package/dist/controllers/status-controller.d.ts +1 -0
  30. package/dist/controllers/status-controller.d.ts.map +1 -1
  31. package/dist/controllers/status-controller.js.map +1 -1
  32. package/dist/controllers/ws-clients-controller.d.ts +1 -0
  33. package/dist/controllers/ws-clients-controller.d.ts.map +1 -1
  34. package/dist/controllers/ws-clients-controller.js.map +1 -1
  35. package/dist/index.d.ts +3 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +7 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/services/admin-config.d.ts +15 -3
  40. package/dist/services/admin-config.d.ts.map +1 -1
  41. package/dist/services/admin-config.js +15 -3
  42. package/dist/services/admin-config.js.map +1 -1
  43. package/dist/services/admin-theme.d.ts +31 -0
  44. package/dist/services/admin-theme.d.ts.map +1 -0
  45. package/dist/services/admin-theme.js +94 -0
  46. package/dist/services/admin-theme.js.map +1 -0
  47. package/dist/services/dashboard-dir.d.ts +10 -0
  48. package/dist/services/dashboard-dir.d.ts.map +1 -0
  49. package/dist/services/dashboard-dir.js +51 -0
  50. package/dist/services/dashboard-dir.js.map +1 -0
  51. package/dist/services/log-ring-buffer.d.ts +6 -0
  52. package/dist/services/log-ring-buffer.d.ts.map +1 -1
  53. package/dist/services/log-ring-buffer.js +13 -0
  54. package/dist/services/log-ring-buffer.js.map +1 -1
  55. package/dist/services/module-registry.d.ts +12 -7
  56. package/dist/services/module-registry.d.ts.map +1 -1
  57. package/dist/services/module-registry.js +22 -10
  58. package/dist/services/module-registry.js.map +1 -1
  59. package/dist/tsconfig.tsbuildinfo +1 -1
  60. package/package.json +6 -2
@@ -45,7 +45,8 @@ const ws_clients_controller_1 = require("./controllers/ws-clients-controller");
45
45
  const module_registry_1 = require("./services/module-registry");
46
46
  const log_ring_buffer_1 = require("./services/log-ring-buffer");
47
47
  const admin_config_1 = require("./services/admin-config");
48
- const fs_1 = require("fs");
48
+ const dashboard_dir_1 = require("./services/dashboard-dir");
49
+ const admin_theme_1 = require("./services/admin-theme");
49
50
  const path_1 = require("path");
50
51
  const crypto = __importStar(require("crypto"));
51
52
  /**
@@ -68,6 +69,37 @@ class CliAdminBuilder {
68
69
  _registeredJobs = 0;
69
70
  _dashboardDir;
70
71
  _enabledFeatures = [];
72
+ _authProvider;
73
+ _theme = (0, admin_theme_1.validateAdminTheme)(undefined);
74
+ /**
75
+ * Set the dashboard's color scheme: the mode (`dark`, `light` or `system`)
76
+ * and color overrides per scheme. Tokens left out keep the dashboard
77
+ * defaults. Values must be plain CSS colors (hex, rgb()/hsl()/oklch(...)
78
+ * or a named color); anything else throws here.
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * builder.setTheme({
83
+ * mode: 'system',
84
+ * light: { primary: '#2a6bba', background: '#f1f6fa' },
85
+ * dark: { primary: '#4f9be0', background: '#0d1823' },
86
+ * });
87
+ * ```
88
+ */
89
+ setTheme(theme) {
90
+ this._theme = (0, admin_theme_1.validateAdminTheme)(theme);
91
+ return this;
92
+ }
93
+ /**
94
+ * Authenticate the dashboard through the users plugin
95
+ * (`usersPlugin.serverAuth`): login uses the users auth service and
96
+ * requires the `admin:access` permission (`admin` has it via `*`). The
97
+ * static credentials are then ignored.
98
+ */
99
+ setAuthProvider(provider) {
100
+ this._authProvider = provider;
101
+ return this;
102
+ }
71
103
  /**
72
104
  * Set admin credentials.
73
105
  */
@@ -104,33 +136,42 @@ class CliAdminBuilder {
104
136
  * Build the admin plugin, returning the Express router and auth middleware.
105
137
  */
106
138
  build(deps) {
107
- const { registry, eventSocketManager, builder, broadcastFn } = deps;
139
+ const { registry, eventSocketManager, builder, executor, broadcastFn } = deps;
140
+ if (!this._authProvider && this._config.usesDefaultCredentials()) {
141
+ console.warn('[qcli-admin] WARNING: Using default admin credentials. Set QCLI_ADMIN_USERNAME and QCLI_ADMIN_PASSWORD environment variables.');
142
+ }
108
143
  // Resolve JWT secret: explicit > env var > random
109
144
  const secret = this._jwtSecret
110
145
  ?? process.env.QCLI_ADMIN_JWT_SECRET
111
146
  ?? crypto.randomBytes(32).toString('hex');
112
147
  // Create services
113
148
  const moduleRegistry = new module_registry_1.ModuleRegistry(registry, builder);
149
+ // Register the module registry as a processor filter so that
150
+ // disabled modules' commands are blocked at execution time.
151
+ if (executor) {
152
+ executor.addFilter(moduleRegistry);
153
+ }
114
154
  const logBuffer = new log_ring_buffer_1.LogRingBuffer();
115
155
  const broadcast = broadcastFn ?? ((msg) => eventSocketManager.broadcastMessage(msg));
116
156
  logBuffer.setBroadcastFn(broadcast);
117
157
  logBuffer.interceptConsole();
118
158
  // Create auth middleware
119
- const authMiddleware = (0, auth_middleware_1.createAuthMiddleware)(secret);
159
+ const authMiddleware = (0, auth_middleware_1.createAuthMiddleware)(secret, this._authProvider);
120
160
  // Create main router
121
161
  const router = (0, express_1.Router)();
122
162
  // Auth routes (login is unauthenticated, /me requires auth)
123
- const authResult = (0, auth_controller_1.createAuthController)(this._config, secret);
163
+ const authResult = (0, auth_controller_1.createAuthController)(this._config, secret, this._authProvider);
124
164
  router.use('/auth', authResult.router);
125
- // Apply auth middleware to all routes below
126
- router.use(authMiddleware);
165
+ // Auth is applied per admin route group (not router-wide): this router
166
+ // is mounted at the shared /api/v1/qcli prefix, so an unscoped
167
+ // `router.use(authMiddleware)` would reject requests meant for other
168
+ // plugins mounted at the same prefix (e.g. the users plugin).
127
169
  // Status
128
170
  const registeredJobs = this._registeredJobs;
129
171
  const enabledFeatures = this._enabledFeatures;
130
172
  const hasFilesystem = !!(builder.fileStorageProvider || builder.fileSystemOptions);
131
173
  const statusDeps = {
132
174
  getActiveWsConnections: () => eventSocketManager.getClients().length,
133
- // TODO: expose getActiveShellSessions() on CliEventSocketManager
134
175
  getActiveShellSessions: () => 0,
135
176
  getRegisteredCommands: () => registry.processors.length,
136
177
  getRegisteredJobs: () => registeredJobs,
@@ -145,18 +186,25 @@ class CliAdminBuilder {
145
186
  return features;
146
187
  },
147
188
  };
148
- router.use('/status', (0, status_controller_1.createStatusController)(statusDeps));
189
+ router.use('/status', authMiddleware, (0, status_controller_1.createStatusController)(statusDeps));
149
190
  // Plugins
150
- router.use('/plugins', (0, plugins_controller_1.createPluginsController)(moduleRegistry));
191
+ router.use('/plugins', authMiddleware, (0, plugins_controller_1.createPluginsController)(moduleRegistry));
151
192
  // Config
152
- router.use('/config', (0, config_controller_1.createConfigController)(this._config));
193
+ router.use('/config', authMiddleware, (0, config_controller_1.createConfigController)(this._config));
153
194
  // Logs
154
- router.use('/logs', (0, logs_controller_1.createLogsController)(logBuffer));
195
+ router.use('/logs', authMiddleware, (0, logs_controller_1.createLogsController)(logBuffer));
155
196
  // WebSocket clients
156
- router.use('/ws/clients', (0, ws_clients_controller_1.createWsClientsController)(eventSocketManager));
197
+ router.use('/ws/clients', authMiddleware, (0, ws_clients_controller_1.createWsClientsController)(eventSocketManager));
157
198
  // Dashboard SPA static file serving
158
199
  const dashboardRouter = (0, express_1.Router)();
159
- const dashboardDistDir = this._resolveDashboardDir();
200
+ const dashboardDistDir = (0, dashboard_dir_1.resolveDashboardDir)(this._dashboardDir);
201
+ // Color scheme, read by the dashboard before its first render (public,
202
+ // like the dashboard itself: the login page uses it too)
203
+ const themeJson = JSON.stringify(this._theme);
204
+ dashboardRouter.get('/theme.json', (_req, res) => {
205
+ res.set('Cache-Control', 'no-cache');
206
+ res.type('application/json').send(themeJson);
207
+ });
160
208
  if (dashboardDistDir) {
161
209
  dashboardRouter.use((0, express_1.static)(dashboardDistDir));
162
210
  // SPA fallback: serve index.html for all non-file routes
@@ -175,7 +223,16 @@ class CliAdminBuilder {
175
223
  clearInterval(authResult.cleanupInterval);
176
224
  logBuffer.restoreConsole();
177
225
  };
178
- return { router, dashboardRouter, authMiddleware, logBuffer, dispose };
226
+ return {
227
+ prefix: '/api/v1/qcli',
228
+ dashboardPrefix: '/qcli/admin',
229
+ router,
230
+ dashboardRouter,
231
+ authMiddleware,
232
+ logBuffer,
233
+ publicRoutes: ['POST /api/v1/qcli/auth/login'],
234
+ dispose,
235
+ };
179
236
  }
180
237
  /**
181
238
  * Set the path to the dashboard dist directory.
@@ -185,41 +242,6 @@ class CliAdminBuilder {
185
242
  this._dashboardDir = dir;
186
243
  return this;
187
244
  }
188
- /**
189
- * Resolve the dashboard dist directory. Looks for:
190
- * 1. Explicitly set path
191
- * 2. @qodalis/cli-server-dashboard/dist (npm package)
192
- * 3. Relative paths from this file and cwd (development)
193
- */
194
- _resolveDashboardDir() {
195
- // Explicit override
196
- if (this._dashboardDir && (0, fs_1.existsSync)(this._dashboardDir)) {
197
- return (0, path_1.resolve)(this._dashboardDir);
198
- }
199
- // Try bundled dashboard directory (embedded in this package)
200
- const bundledPath = (0, path_1.resolve)(__dirname, '..', 'dashboard');
201
- if ((0, fs_1.existsSync)(bundledPath))
202
- return bundledPath;
203
- // Try resolving from node_modules (published package — legacy fallback)
204
- try {
205
- const pkgDir = require.resolve('@qodalis/cli-server-dashboard/package.json');
206
- const distDir = (0, path_1.join)(pkgDir, '..', 'dist');
207
- if ((0, fs_1.existsSync)(distDir))
208
- return (0, path_1.resolve)(distDir);
209
- }
210
- catch {
211
- // Package not installed
212
- }
213
- // Try relative path from this file (development)
214
- const devPath = (0, path_1.resolve)(__dirname, '../../../../cli-server-dashboard/dist');
215
- if ((0, fs_1.existsSync)(devPath))
216
- return devPath;
217
- // Try relative path from cwd (workspace root)
218
- const cwdPath = (0, path_1.resolve)(process.cwd(), '../cli-server-dashboard/dist');
219
- if ((0, fs_1.existsSync)(cwdPath))
220
- return cwdPath;
221
- return null;
222
- }
223
245
  }
224
246
  exports.CliAdminBuilder = CliAdminBuilder;
225
247
  //# sourceMappingURL=cli-admin-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-admin-builder.js","sourceRoot":"","sources":["../cli-admin-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-admin-builder.js","sourceRoot":"","sources":["../cli-admin-builder.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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,CAoB9E"}
@@ -21,8 +21,7 @@ function createPluginsController(moduleRegistry) {
21
21
  res.status(404).json({ error: `Module '${id}' not found` });
22
22
  return;
23
23
  }
24
- const { warning, ...moduleInfo } = result;
25
- res.json(warning ? { ...moduleInfo, warning } : moduleInfo);
24
+ res.json(result);
26
25
  });
27
26
  return router;
28
27
  }
@@ -1 +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"}
1
+ {"version":3,"file":"plugins-controller.js","sourceRoot":"","sources":["../../controllers/plugins-controller.ts"],"names":[],"mappings":";;AAUA,0DAoBC;AA9BD,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,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { Router } from 'express';
2
+ /** Dependencies injected into the status controller for runtime metrics. */
2
3
  export interface StatusDeps {
3
4
  getActiveWsConnections: () => number;
4
5
  getActiveShellSessions: () => number;
@@ -1 +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"}
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,4EAA4E;AAC5E,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"}
@@ -1 +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"}
1
+ {"version":3,"file":"status-controller.js","sourceRoot":"","sources":["../../controllers/status-controller.ts"],"names":[],"mappings":";;AAmBA,wDAuBC;AA1CD,qCAAoD;AAWpD,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"}
@@ -1,4 +1,5 @@
1
1
  import { Router } from 'express';
2
+ /** Dependency providing access to connected WebSocket client metadata. */
2
3
  export interface WsClientsDeps {
3
4
  getClients: () => Array<{
4
5
  id: string;
@@ -1 +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"}
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,0EAA0E;AAC1E,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"}
@@ -1 +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"}
1
+ {"version":3,"file":"ws-clients-controller.js","sourceRoot":"","sources":["../../controllers/ws-clients-controller.ts"],"names":[],"mappings":";;AAkBA,8DAQC;AA1BD,qCAAoD;AAYpD;;;;;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"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,10 @@
1
- export { CliAdminBuilder, CliAdminBuildDeps, CliAdminPluginResult } from './cli-admin-builder';
1
+ export { CliAdminBuilder, CliAdminBuildDeps, CliAdminPluginResult, IExecutorLike } from './cli-admin-builder';
2
2
  export { LogRingBuffer, LogEntry, LogQueryParams, LogQueryResult } from './services/log-ring-buffer';
3
3
  export { ModuleRegistry, ModuleInfo, IRegistryLike, IBuilderLike } from './services/module-registry';
4
4
  export { AdminConfig, AdminCredentials, ConfigSection } from './services/admin-config';
5
5
  export { signToken, verifyToken, JwtPayload } from './auth/jwt-service';
6
6
  export { AuthControllerResult } from './auth/auth-controller';
7
7
  export { createAuthMiddleware, AuthenticatedRequest } from './auth/auth-middleware';
8
+ export { AdminAuthProvider, ADMIN_ACCESS_PERMISSION } from './auth/auth-provider';
9
+ export { AdminTheme, AdminThemeColors, AdminThemeDocument, AdminThemeMode, AdminThemeToken, ADMIN_THEME_TOKENS, isThemeColor, validateAdminTheme, } from './services/admin-theme';
8
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9G,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;AACpF,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EACH,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GACrB,MAAM,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createAuthMiddleware = exports.verifyToken = exports.signToken = exports.AdminConfig = exports.ModuleRegistry = exports.LogRingBuffer = exports.CliAdminBuilder = void 0;
3
+ exports.validateAdminTheme = exports.isThemeColor = exports.ADMIN_THEME_TOKENS = exports.ADMIN_ACCESS_PERMISSION = exports.createAuthMiddleware = exports.verifyToken = exports.signToken = exports.AdminConfig = exports.ModuleRegistry = exports.LogRingBuffer = exports.CliAdminBuilder = void 0;
4
4
  var cli_admin_builder_1 = require("./cli-admin-builder");
5
5
  Object.defineProperty(exports, "CliAdminBuilder", { enumerable: true, get: function () { return cli_admin_builder_1.CliAdminBuilder; } });
6
6
  var log_ring_buffer_1 = require("./services/log-ring-buffer");
@@ -14,4 +14,10 @@ Object.defineProperty(exports, "signToken", { enumerable: true, get: function ()
14
14
  Object.defineProperty(exports, "verifyToken", { enumerable: true, get: function () { return jwt_service_1.verifyToken; } });
15
15
  var auth_middleware_1 = require("./auth/auth-middleware");
16
16
  Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_middleware_1.createAuthMiddleware; } });
17
+ var auth_provider_1 = require("./auth/auth-provider");
18
+ Object.defineProperty(exports, "ADMIN_ACCESS_PERMISSION", { enumerable: true, get: function () { return auth_provider_1.ADMIN_ACCESS_PERMISSION; } });
19
+ var admin_theme_1 = require("./services/admin-theme");
20
+ Object.defineProperty(exports, "ADMIN_THEME_TOKENS", { enumerable: true, get: function () { return admin_theme_1.ADMIN_THEME_TOKENS; } });
21
+ Object.defineProperty(exports, "isThemeColor", { enumerable: true, get: function () { return admin_theme_1.isThemeColor; } });
22
+ Object.defineProperty(exports, "validateAdminTheme", { enumerable: true, get: function () { return admin_theme_1.validateAdminTheme; } });
17
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;AAAA,yDAA8G;AAArG,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;AAC7B,sDAAkF;AAAtD,wHAAA,uBAAuB,OAAA;AACnD,sDASgC;AAH5B,iHAAA,kBAAkB,OAAA;AAClB,2GAAA,YAAY,OAAA;AACZ,iHAAA,kBAAkB,OAAA"}
@@ -1,10 +1,9 @@
1
- /**
2
- * Admin configuration — reads credentials and settings from environment variables.
3
- */
1
+ /** Admin username/password pair. */
4
2
  export interface AdminCredentials {
5
3
  username: string;
6
4
  password: string;
7
5
  }
6
+ /** A single configuration setting exposed by the admin dashboard. */
8
7
  export interface ConfigEntry {
9
8
  key: string;
10
9
  value: string | number | boolean | string[];
@@ -12,23 +11,36 @@ export interface ConfigEntry {
12
11
  description: string;
13
12
  mutable: boolean;
14
13
  }
14
+ /** A named group of configuration entries (e.g. "server", "auth", "custom"). */
15
15
  export interface ConfigSection {
16
16
  name: string;
17
17
  mutable: boolean;
18
18
  settings: ConfigEntry[];
19
19
  }
20
+ /**
21
+ * Manages admin credentials and mutable runtime settings.
22
+ * Reads defaults from environment variables on construction.
23
+ */
20
24
  export declare class AdminConfig {
21
25
  private _username;
22
26
  private _password;
23
27
  private _jwtSecret;
24
28
  private readonly _mutableSettings;
25
29
  constructor();
30
+ /** True while the well-known `admin` / `admin` credentials are in effect. */
31
+ usesDefaultCredentials(): boolean;
32
+ /** Override the admin username and password. */
26
33
  setCredentials(username: string, password: string): void;
34
+ /** Set the JWT signing secret explicitly. */
27
35
  setJwtSecret(secret: string): void;
28
36
  get jwtSecret(): string | undefined;
37
+ /** Validate credentials using timing-safe comparison. */
29
38
  validateCredentials(username: string, password: string): boolean;
39
+ /** Return all configuration sections (server, auth, custom) for the dashboard. */
30
40
  getConfigSections(): ConfigSection[];
41
+ /** Return a shallow copy of all mutable (custom) settings. */
31
42
  getMutableSettings(): Record<string, unknown>;
43
+ /** Merge the provided key-value pairs into mutable settings. */
32
44
  updateMutableSettings(values: Record<string, unknown>): void;
33
45
  }
34
46
  //# sourceMappingURL=admin-config.d.ts.map
@@ -1 +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"}
1
+ {"version":3,"file":"admin-config.d.ts","sourceRoot":"","sources":["../../services/admin-config.ts"],"names":[],"mappings":"AAYA,oCAAoC;AACpC,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,qEAAqE;AACrE,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,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,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;;IAQhE,6EAA6E;IAC7E,sBAAsB,IAAI,OAAO;IAIjC,gDAAgD;IAChD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxD,6CAA6C;IAC7C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,yDAAyD;IACzD,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAOhE,kFAAkF;IAClF,iBAAiB,IAAI,aAAa,EAAE;IAsCpC,8DAA8D;IAC9D,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAI7C,gEAAgE;IAChE,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAG/D"}
@@ -11,6 +11,10 @@ function safeCompare(a, b) {
11
11
  const hashB = (0, crypto_1.createHash)('sha256').update(b).digest();
12
12
  return (0, crypto_1.timingSafeEqual)(hashA, hashB);
13
13
  }
14
+ /**
15
+ * Manages admin credentials and mutable runtime settings.
16
+ * Reads defaults from environment variables on construction.
17
+ */
14
18
  class AdminConfig {
15
19
  _username;
16
20
  _password;
@@ -20,26 +24,31 @@ class AdminConfig {
20
24
  this._username = process.env.QCLI_ADMIN_USERNAME ?? 'admin';
21
25
  this._password = process.env.QCLI_ADMIN_PASSWORD ?? 'admin';
22
26
  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
  }
28
+ /** True while the well-known `admin` / `admin` credentials are in effect. */
29
+ usesDefaultCredentials() {
30
+ return this._username === 'admin' && this._password === 'admin';
31
+ }
32
+ /** Override the admin username and password. */
27
33
  setCredentials(username, password) {
28
34
  this._username = username;
29
35
  this._password = password;
30
36
  }
37
+ /** Set the JWT signing secret explicitly. */
31
38
  setJwtSecret(secret) {
32
39
  this._jwtSecret = secret;
33
40
  }
34
41
  get jwtSecret() {
35
42
  return this._jwtSecret;
36
43
  }
44
+ /** Validate credentials using timing-safe comparison. */
37
45
  validateCredentials(username, password) {
38
46
  // Evaluate both comparisons to avoid short-circuit timing leaks
39
47
  const usernameMatch = safeCompare(username, this._username);
40
48
  const passwordMatch = safeCompare(password, this._password);
41
49
  return usernameMatch && passwordMatch;
42
50
  }
51
+ /** Return all configuration sections (server, auth, custom) for the dashboard. */
43
52
  getConfigSections() {
44
53
  const customEntries = Object.entries(this._mutableSettings).map(([key, val]) => ({
45
54
  key,
@@ -74,14 +83,17 @@ class AdminConfig {
74
83
  },
75
84
  ];
76
85
  }
86
+ /** Return a shallow copy of all mutable (custom) settings. */
77
87
  getMutableSettings() {
78
88
  return { ...this._mutableSettings };
79
89
  }
90
+ /** Merge the provided key-value pairs into mutable settings. */
80
91
  updateMutableSettings(values) {
81
92
  Object.assign(this._mutableSettings, values);
82
93
  }
83
94
  }
84
95
  exports.AdminConfig = AdminConfig;
96
+ /** Infer the ConfigEntry type string from a runtime value. */
85
97
  function inferType(val) {
86
98
  if (typeof val === 'boolean')
87
99
  return 'boolean';
@@ -1 +1 @@
1
- {"version":3,"file":"admin-config.js","sourceRoot":"","sources":["../../services/admin-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-config.js","sourceRoot":"","sources":["../../services/admin-config.ts"],"names":[],"mappings":";;;AAAA,mCAAqD;AAErD;;;GAGG;AACH,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACrC,MAAM,KAAK,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACtD,OAAO,IAAA,wBAAe,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC;AAwBD;;;GAGG;AACH,MAAa,WAAW;IACZ,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,UAAU,CAAqB;IACtB,gBAAgB,GAA4B,EAAE,CAAC;IAEhE;QACI,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC;QAC5D,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC;QAC5D,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACxD,CAAC;IAED,6EAA6E;IAC7E,sBAAsB;QAClB,OAAO,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC;IACpE,CAAC;IAED,gDAAgD;IAChD,cAAc,CAAC,QAAgB,EAAE,QAAgB;QAC7C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,6CAA6C;IAC7C,YAAY,CAAC,MAAc;QACvB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED,yDAAyD;IACzD,mBAAmB,CAAC,QAAgB,EAAE,QAAgB;QAClD,gEAAgE;QAChE,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,aAAa,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,OAAO,aAAa,IAAI,aAAa,CAAC;IAC1C,CAAC;IAED,kFAAkF;IAClF,iBAAiB;QACb,MAAM,aAAa,GAAkB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAC1E,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YACb,GAAG;YACH,KAAK,EAAE,GAA2C;YAClD,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;YACpB,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,IAAI;SAChB,CAAC,CACL,CAAC;QAEF,OAAO;YACH;gBACI,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE;oBACN,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE;oBAClG,EAAE,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE;oBAClH,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE;oBACzH,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE;iBAChG;aACJ;YACD;gBACI,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE;oBACN,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE;oBACzG,EAAE,GAAG,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sCAAsC,EAAE,OAAO,EAAE,KAAK,EAAE;iBACxL;aACJ;YACD;gBACI,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,aAAa;aAC1B;SACJ,CAAC;IACN,CAAC;IAED,8DAA8D;IAC9D,kBAAkB;QACd,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACxC,CAAC;IAED,gEAAgE;IAChE,qBAAqB,CAAC,MAA+B;QACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;CACJ;AAxFD,kCAwFC;AAED,8DAA8D;AAC9D,SAAS,SAAS,CAAC,GAAY;IAC3B,IAAI,OAAO,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAC1C,OAAO,QAAQ,CAAC;AACpB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Color scheme of the admin dashboard. The dashboard reads it from
3
+ * `GET /qcli/admin/theme.json` before its first render; every token left out
4
+ * keeps the dashboard's default (see the README for the list and defaults).
5
+ */
6
+ /** Color tokens of the dashboard, the same names on every server. */
7
+ export declare const ADMIN_THEME_TOKENS: readonly ["primary", "primaryHover", "onPrimary", "accent", "background", "backgroundAccent", "sidebar", "surface", "popover", "control", "controlHover", "border", "overlay", "heading", "text", "muted", "subtle", "success", "warning", "error", "info"];
8
+ export type AdminThemeToken = (typeof ADMIN_THEME_TOKENS)[number];
9
+ /** Overrides for one scheme: any subset of the tokens, as CSS colors. */
10
+ export type AdminThemeColors = Partial<Record<AdminThemeToken, string>>;
11
+ /** `dark` (default), `light`, or `system` to follow the browser's preference. */
12
+ export type AdminThemeMode = 'dark' | 'light' | 'system';
13
+ export interface AdminTheme {
14
+ mode?: AdminThemeMode;
15
+ dark?: AdminThemeColors;
16
+ light?: AdminThemeColors;
17
+ }
18
+ /** What `theme.json` returns: the validated theme with the mode filled in. */
19
+ export interface AdminThemeDocument {
20
+ mode: AdminThemeMode;
21
+ dark: AdminThemeColors;
22
+ light: AdminThemeColors;
23
+ }
24
+ /** True when `value` is a color the dashboard accepts. */
25
+ export declare function isThemeColor(value: unknown): value is string;
26
+ /**
27
+ * Validates a theme and returns the document served as `theme.json`.
28
+ * Throws on an unknown mode or token, or a value that is not a plain color.
29
+ */
30
+ export declare function validateAdminTheme(theme: AdminTheme | undefined | null): AdminThemeDocument;
31
+ //# sourceMappingURL=admin-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-theme.d.ts","sourceRoot":"","sources":["../../services/admin-theme.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,6PAsBrB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,yEAAyE;AACzE,MAAM,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC;AAExE,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEzD,MAAM,WAAW,UAAU;IACvB,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,gBAAgB,CAAC;CAC3B;AAiBD,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAI5D;AAyBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,kBAAkB,CAc3F"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * Color scheme of the admin dashboard. The dashboard reads it from
4
+ * `GET /qcli/admin/theme.json` before its first render; every token left out
5
+ * keeps the dashboard's default (see the README for the list and defaults).
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ADMIN_THEME_TOKENS = void 0;
9
+ exports.isThemeColor = isThemeColor;
10
+ exports.validateAdminTheme = validateAdminTheme;
11
+ /** Color tokens of the dashboard, the same names on every server. */
12
+ exports.ADMIN_THEME_TOKENS = [
13
+ 'primary',
14
+ 'primaryHover',
15
+ 'onPrimary',
16
+ 'accent',
17
+ 'background',
18
+ 'backgroundAccent',
19
+ 'sidebar',
20
+ 'surface',
21
+ 'popover',
22
+ 'control',
23
+ 'controlHover',
24
+ 'border',
25
+ 'overlay',
26
+ 'heading',
27
+ 'text',
28
+ 'muted',
29
+ 'subtle',
30
+ 'success',
31
+ 'warning',
32
+ 'error',
33
+ 'info',
34
+ ];
35
+ const MODES = ['dark', 'light', 'system'];
36
+ const TOKENS = new Set(exports.ADMIN_THEME_TOKENS);
37
+ const MAX_COLOR_LENGTH = 100;
38
+ /**
39
+ * Accepted color syntax: a hex color, a color function with plain numeric
40
+ * arguments, or a named color. Nothing that could end the declaration
41
+ * (`;`, `{`, `}`, quotes) or load anything (`url(`, `var(`) gets through.
42
+ */
43
+ const COLOR_PATTERNS = [
44
+ /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i,
45
+ /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch)\([0-9a-z.,%+\-\s/]*\)$/i,
46
+ /^[a-z]{3,30}$/i,
47
+ ];
48
+ /** True when `value` is a color the dashboard accepts. */
49
+ function isThemeColor(value) {
50
+ if (typeof value !== 'string')
51
+ return false;
52
+ const v = value.trim();
53
+ return v.length > 0 && v.length <= MAX_COLOR_LENGTH && COLOR_PATTERNS.some((p) => p.test(v));
54
+ }
55
+ function validateColors(colors, scheme) {
56
+ if (colors === undefined || colors === null)
57
+ return {};
58
+ if (typeof colors !== 'object' || Array.isArray(colors)) {
59
+ throw new Error(`Invalid admin theme: "${scheme}" must be an object of colors`);
60
+ }
61
+ const result = {};
62
+ for (const [key, value] of Object.entries(colors)) {
63
+ if (!TOKENS.has(key)) {
64
+ throw new Error(`Invalid admin theme: unknown token "${scheme}.${key}" (expected one of ${exports.ADMIN_THEME_TOKENS.join(', ')})`);
65
+ }
66
+ if (value === undefined || value === null)
67
+ continue;
68
+ if (!isThemeColor(value)) {
69
+ throw new Error(`Invalid admin theme color for "${scheme}.${key}": ${JSON.stringify(value)} (use a hex, rgb()/hsl()/oklch() or named color)`);
70
+ }
71
+ result[key] = value.trim();
72
+ }
73
+ return result;
74
+ }
75
+ /**
76
+ * Validates a theme and returns the document served as `theme.json`.
77
+ * Throws on an unknown mode or token, or a value that is not a plain color.
78
+ */
79
+ function validateAdminTheme(theme) {
80
+ const t = (theme ?? {});
81
+ if (typeof t !== 'object' || Array.isArray(t)) {
82
+ throw new Error('Invalid admin theme: expected an object');
83
+ }
84
+ const mode = t.mode ?? 'dark';
85
+ if (typeof mode !== 'string' || !MODES.includes(mode)) {
86
+ throw new Error(`Invalid admin theme mode ${JSON.stringify(mode)} (expected dark, light or system)`);
87
+ }
88
+ return {
89
+ mode: mode,
90
+ dark: validateColors(t.dark, 'dark'),
91
+ light: validateColors(t.light, 'light'),
92
+ };
93
+ }
94
+ //# sourceMappingURL=admin-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-theme.js","sourceRoot":"","sources":["../../services/admin-theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Resolve the dashboard dist directory. Looks for:
3
+ * 1. The explicitly set path
4
+ * 2. The sibling cli-server-dashboard repo (development), so a fresh build is served
5
+ * 3. The dashboard bundled into this package (copy-dashboard)
6
+ * 4. ../cli-server-dashboard/dist relative to the working directory
7
+ * 5. @qodalis/cli-server-dashboard/dist (npm package)
8
+ */
9
+ export declare function resolveDashboardDir(explicitDir?: string, moduleDir?: string, cwd?: string): string | null;
10
+ //# sourceMappingURL=dashboard-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-dir.d.ts","sourceRoot":"","sources":["../../services/dashboard-dir.ts"],"names":[],"mappings":"AAyBA;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAC/B,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,GAAE,MAAkB,EAC7B,GAAG,GAAE,MAAsB,GAC5B,MAAM,GAAG,IAAI,CAcf"}