@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.
- package/README.md +177 -0
- package/dashboard/assets/index-CThBrI8x.js +248 -0
- package/dashboard/assets/index-SAFC7f6i.css +32 -0
- package/dashboard/assets/wasm/qodalis_cli_wasm_bg.wasm +0 -0
- package/dashboard/index.html +14 -0
- package/dist/auth/auth-controller.d.ts +5 -1
- package/dist/auth/auth-controller.d.ts.map +1 -1
- package/dist/auth/auth-controller.js +35 -5
- package/dist/auth/auth-controller.js.map +1 -1
- package/dist/auth/auth-middleware.d.ts +2 -1
- package/dist/auth/auth-middleware.d.ts.map +1 -1
- package/dist/auth/auth-middleware.js +35 -1
- package/dist/auth/auth-middleware.js.map +1 -1
- package/dist/auth/auth-provider.d.ts +33 -0
- package/dist/auth/auth-provider.d.ts.map +1 -0
- package/dist/auth/auth-provider.js +16 -0
- package/dist/auth/auth-provider.js.map +1 -0
- package/dist/auth/jwt-service.d.ts +12 -2
- package/dist/auth/jwt-service.d.ts.map +1 -1
- package/dist/auth/jwt-service.js +11 -2
- package/dist/auth/jwt-service.js.map +1 -1
- package/dist/cli-admin-builder.d.ts +42 -9
- package/dist/cli-admin-builder.d.ts.map +1 -1
- package/dist/cli-admin-builder.js +71 -49
- package/dist/cli-admin-builder.js.map +1 -1
- package/dist/controllers/plugins-controller.d.ts.map +1 -1
- package/dist/controllers/plugins-controller.js +1 -2
- package/dist/controllers/plugins-controller.js.map +1 -1
- package/dist/controllers/status-controller.d.ts +1 -0
- package/dist/controllers/status-controller.d.ts.map +1 -1
- package/dist/controllers/status-controller.js.map +1 -1
- package/dist/controllers/ws-clients-controller.d.ts +1 -0
- package/dist/controllers/ws-clients-controller.d.ts.map +1 -1
- package/dist/controllers/ws-clients-controller.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/services/admin-config.d.ts +15 -3
- package/dist/services/admin-config.d.ts.map +1 -1
- package/dist/services/admin-config.js +15 -3
- package/dist/services/admin-config.js.map +1 -1
- package/dist/services/admin-theme.d.ts +31 -0
- package/dist/services/admin-theme.d.ts.map +1 -0
- package/dist/services/admin-theme.js +94 -0
- package/dist/services/admin-theme.js.map +1 -0
- package/dist/services/dashboard-dir.d.ts +10 -0
- package/dist/services/dashboard-dir.d.ts.map +1 -0
- package/dist/services/dashboard-dir.js +51 -0
- package/dist/services/dashboard-dir.js.map +1 -0
- package/dist/services/log-ring-buffer.d.ts +6 -0
- package/dist/services/log-ring-buffer.d.ts.map +1 -1
- package/dist/services/log-ring-buffer.js +13 -0
- package/dist/services/log-ring-buffer.js.map +1 -1
- package/dist/services/module-registry.d.ts +12 -7
- package/dist/services/module-registry.d.ts.map +1 -1
- package/dist/services/module-registry.js +22 -10
- package/dist/services/module-registry.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- 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
|
|
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
|
-
//
|
|
126
|
-
|
|
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.
|
|
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 {
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAA0E;AAE1E,4DAA8D;AAC9D,4DAA8D;
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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 +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":";;
|
|
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 +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":";;
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,
|
|
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
|
|
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":";;;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,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;
|
|
1
|
+
{"version":3,"file":"admin-config.js","sourceRoot":"","sources":["../../services/admin-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|