@qodalis/cli-server-plugin-admin 1.0.0-beta.1 → 1.0.0-beta.13
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 +226 -0
- package/dashboard/assets/index-BVWEEAZ_.js +248 -0
- package/dashboard/assets/index-DDYjltKc.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 +11 -2
- package/dist/auth/auth-controller.d.ts.map +1 -1
- package/dist/auth/auth-controller.js +59 -6
- 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 +64 -1
- package/dist/auth/auth-middleware.js.map +1 -1
- package/dist/auth/auth-provider.d.ts +42 -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 +49 -9
- package/dist/cli-admin-builder.d.ts.map +1 -1
- package/dist/cli-admin-builder.js +87 -51
- 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 +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/services/admin-config.d.ts +32 -3
- package/dist/services/admin-config.d.ts.map +1 -1
- package/dist/services/admin-config.js +56 -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 +20 -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
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { Router, RequestHandler } from 'express';
|
|
2
|
+
import { ICliProcessorFilter } from '@qodalis/cli-server-abstractions';
|
|
3
|
+
import { AdminAuthProvider } from './auth/auth-provider';
|
|
2
4
|
import { WsClientsDeps } from './controllers/ws-clients-controller';
|
|
3
5
|
import { IRegistryLike, IBuilderLike } from './services/module-registry';
|
|
4
6
|
import { LogRingBuffer } from './services/log-ring-buffer';
|
|
7
|
+
import { AdminTheme } from './services/admin-theme';
|
|
8
|
+
/** Executor-like interface — the admin plugin only needs to register filters. */
|
|
9
|
+
export interface IExecutorLike {
|
|
10
|
+
addFilter(filter: ICliProcessorFilter): void;
|
|
11
|
+
}
|
|
5
12
|
export interface CliAdminBuildDeps {
|
|
6
13
|
/** The command registry instance. */
|
|
7
14
|
registry: IRegistryLike;
|
|
@@ -11,18 +18,26 @@ export interface CliAdminBuildDeps {
|
|
|
11
18
|
};
|
|
12
19
|
/** The CLI builder instance (for reading modules). */
|
|
13
20
|
builder: IBuilderLike;
|
|
21
|
+
/** The command executor service — used to register the module filter for plugin toggling. */
|
|
22
|
+
executor?: IExecutorLike;
|
|
14
23
|
/** Optional broadcast function override for log events. */
|
|
15
24
|
broadcastFn?: (message: Record<string, unknown>) => void;
|
|
16
25
|
}
|
|
17
26
|
export interface CliAdminPluginResult {
|
|
18
|
-
/**
|
|
27
|
+
/** Default mount prefix for the API router. */
|
|
28
|
+
prefix: '/api/v1/qcli';
|
|
29
|
+
/** Default mount prefix for the dashboard SPA. */
|
|
30
|
+
dashboardPrefix: '/qcli/admin';
|
|
31
|
+
/** Express router for admin API endpoints. */
|
|
19
32
|
router: Router;
|
|
20
|
-
/** Express router serving the SPA
|
|
33
|
+
/** Express router serving the SPA. */
|
|
21
34
|
dashboardRouter: Router;
|
|
22
35
|
/** The auth middleware, in case you need to protect additional routes. */
|
|
23
36
|
authMiddleware: RequestHandler;
|
|
24
37
|
/** The log ring buffer, in case you need to push entries programmatically. */
|
|
25
38
|
logBuffer: LogRingBuffer;
|
|
39
|
+
/** Routes that stay public when the users plugin protects the server. */
|
|
40
|
+
publicRoutes: string[];
|
|
26
41
|
/** Clean up timers and restore console. Call when shutting down. */
|
|
27
42
|
dispose: () => void;
|
|
28
43
|
}
|
|
@@ -46,6 +61,38 @@ export declare class CliAdminBuilder {
|
|
|
46
61
|
private _registeredJobs;
|
|
47
62
|
private _dashboardDir?;
|
|
48
63
|
private _enabledFeatures;
|
|
64
|
+
private _authProvider?;
|
|
65
|
+
private _theme;
|
|
66
|
+
/**
|
|
67
|
+
* Set the dashboard's color scheme: the mode (`dark`, `light` or `system`)
|
|
68
|
+
* and color overrides per scheme. Tokens left out keep the dashboard
|
|
69
|
+
* defaults. Values must be plain CSS colors (hex, rgb()/hsl()/oklch(...)
|
|
70
|
+
* or a named color); anything else throws here.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```ts
|
|
74
|
+
* builder.setTheme({
|
|
75
|
+
* mode: 'system',
|
|
76
|
+
* light: { primary: '#2a6bba', background: '#f1f6fa' },
|
|
77
|
+
* dark: { primary: '#4f9be0', background: '#0d1823' },
|
|
78
|
+
* });
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
setTheme(theme: AdminTheme): CliAdminBuilder;
|
|
82
|
+
/**
|
|
83
|
+
* Authenticate the dashboard through the users plugin
|
|
84
|
+
* (`usersPlugin.serverAuth`): login uses the users auth service and
|
|
85
|
+
* requires the `admin:access` permission (`admin` has it via `*`). The
|
|
86
|
+
* static credentials are then ignored.
|
|
87
|
+
*/
|
|
88
|
+
setAuthProvider(provider: AdminAuthProvider): CliAdminBuilder;
|
|
89
|
+
/**
|
|
90
|
+
* Where the host application signs users in, shown by the dashboard in external
|
|
91
|
+
* sign-in mode (the users plugin with an external auth adapter) and returned by
|
|
92
|
+
* `GET /api/v1/qcli/auth/mode`. An absolute `http(s)` URL or a root-relative path
|
|
93
|
+
* (`/sign-in`); anything else (e.g. `javascript:` or `//host`) makes `build()` throw.
|
|
94
|
+
*/
|
|
95
|
+
setSignInUrl(url: string | undefined): CliAdminBuilder;
|
|
49
96
|
/**
|
|
50
97
|
* Set admin credentials.
|
|
51
98
|
*/
|
|
@@ -74,12 +121,5 @@ export declare class CliAdminBuilder {
|
|
|
74
121
|
* If not set, the builder will try to resolve it automatically.
|
|
75
122
|
*/
|
|
76
123
|
setDashboardDir(dir: string): CliAdminBuilder;
|
|
77
|
-
/**
|
|
78
|
-
* Resolve the dashboard dist directory. Looks for:
|
|
79
|
-
* 1. Explicitly set path
|
|
80
|
-
* 2. @qodalis/cli-server-dashboard/dist (npm package)
|
|
81
|
-
* 3. Relative paths from this file and cwd (development)
|
|
82
|
-
*/
|
|
83
|
-
private _resolveDashboardDir;
|
|
84
124
|
}
|
|
85
125
|
//# sourceMappingURL=cli-admin-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-admin-builder.d.ts","sourceRoot":"","sources":["../cli-admin-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAA2B,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"cli-admin-builder.d.ts","sourceRoot":"","sources":["../cli-admin-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAA2B,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAoC,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAGzG,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAA6B,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAC/F,OAAO,EAAkB,aAAa,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,OAAO,EAAE,UAAU,EAA0C,MAAM,wBAAwB,CAAC;AAI5F,iFAAiF;AACjF,MAAM,WAAW,aAAa;IAC1B,SAAS,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,iBAAiB;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,aAAa,CAAC;IACxB,0CAA0C;IAC1C,kBAAkB,EAAE,aAAa,GAAG;QAChC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC5D,CAAC;IACF,sDAAsD;IACtD,OAAO,EAAE,YAAY,CAAC;IACtB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC5D;AAED,MAAM,WAAW,oBAAoB;IACjC,+CAA+C;IAC/C,MAAM,EAAE,cAAc,CAAC;IACvB,kDAAkD;IAClD,eAAe,EAAE,aAAa,CAAC;IAC/B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,cAAc,EAAE,cAAc,CAAC;IAC/B,8EAA8E;IAC9E,SAAS,EAAE,aAAa,CAAC;IACzB,yEAAyE;IACzE,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oEAAoE;IACpE,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,aAAa,CAAC,CAAoB;IAC1C,OAAO,CAAC,MAAM,CAAqD;IAEnE;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe;IAK5C;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,iBAAiB,GAAG,eAAe;IAK7D;;;;;OAKG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,eAAe;IAKtD;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe;IAKnE;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe;IAM7C;;OAEG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe;IAKjD;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,eAAe;IAKvD;;OAEG;IACH,KAAK,CAAC,IAAI,EAAE,iBAAiB,GAAG,oBAAoB;IA2HpD;;;OAGG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;CAIhD"}
|
|
@@ -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,47 @@ 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
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Where the host application signs users in, shown by the dashboard in external
|
|
105
|
+
* sign-in mode (the users plugin with an external auth adapter) and returned by
|
|
106
|
+
* `GET /api/v1/qcli/auth/mode`. An absolute `http(s)` URL or a root-relative path
|
|
107
|
+
* (`/sign-in`); anything else (e.g. `javascript:` or `//host`) makes `build()` throw.
|
|
108
|
+
*/
|
|
109
|
+
setSignInUrl(url) {
|
|
110
|
+
this._config.signInUrl = url;
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
71
113
|
/**
|
|
72
114
|
* Set admin credentials.
|
|
73
115
|
*/
|
|
@@ -104,59 +146,79 @@ class CliAdminBuilder {
|
|
|
104
146
|
* Build the admin plugin, returning the Express router and auth middleware.
|
|
105
147
|
*/
|
|
106
148
|
build(deps) {
|
|
107
|
-
const { registry, eventSocketManager, builder, broadcastFn } = deps;
|
|
149
|
+
const { registry, eventSocketManager, builder, executor, broadcastFn } = deps;
|
|
150
|
+
this._config.validate();
|
|
151
|
+
// Read on every request: the users plugin sets it when it is mounted (possibly after this build).
|
|
152
|
+
const isExternal = () => !!builder.serverOptions?.externalAuthentication;
|
|
153
|
+
if (!this._authProvider && this._config.usesDefaultCredentials()) {
|
|
154
|
+
console.warn('[qcli-admin] WARNING: Using default admin credentials. Set QCLI_ADMIN_USERNAME and QCLI_ADMIN_PASSWORD environment variables.');
|
|
155
|
+
}
|
|
108
156
|
// Resolve JWT secret: explicit > env var > random
|
|
109
157
|
const secret = this._jwtSecret
|
|
110
158
|
?? process.env.QCLI_ADMIN_JWT_SECRET
|
|
111
159
|
?? crypto.randomBytes(32).toString('hex');
|
|
112
160
|
// Create services
|
|
113
161
|
const moduleRegistry = new module_registry_1.ModuleRegistry(registry, builder);
|
|
162
|
+
// Register the module registry as a processor filter so that
|
|
163
|
+
// disabled modules' commands are blocked at execution time.
|
|
164
|
+
if (executor) {
|
|
165
|
+
executor.addFilter(moduleRegistry);
|
|
166
|
+
}
|
|
114
167
|
const logBuffer = new log_ring_buffer_1.LogRingBuffer();
|
|
115
168
|
const broadcast = broadcastFn ?? ((msg) => eventSocketManager.broadcastMessage(msg));
|
|
116
169
|
logBuffer.setBroadcastFn(broadcast);
|
|
117
170
|
logBuffer.interceptConsole();
|
|
118
171
|
// Create auth middleware
|
|
119
|
-
const authMiddleware = (0, auth_middleware_1.createAuthMiddleware)(secret);
|
|
172
|
+
const authMiddleware = (0, auth_middleware_1.createAuthMiddleware)(secret, this._authProvider, isExternal);
|
|
120
173
|
// Create main router
|
|
121
174
|
const router = (0, express_1.Router)();
|
|
122
175
|
// Auth routes (login is unauthenticated, /me requires auth)
|
|
123
|
-
const authResult = (0, auth_controller_1.createAuthController)(this._config, secret);
|
|
176
|
+
const authResult = (0, auth_controller_1.createAuthController)(this._config, secret, this._authProvider, isExternal);
|
|
124
177
|
router.use('/auth', authResult.router);
|
|
125
|
-
//
|
|
126
|
-
|
|
178
|
+
// Auth is applied per admin route group (not router-wide): this router
|
|
179
|
+
// is mounted at the shared /api/v1/qcli prefix, so an unscoped
|
|
180
|
+
// `router.use(authMiddleware)` would reject requests meant for other
|
|
181
|
+
// plugins mounted at the same prefix (e.g. the users plugin).
|
|
127
182
|
// Status
|
|
128
183
|
const registeredJobs = this._registeredJobs;
|
|
129
184
|
const enabledFeatures = this._enabledFeatures;
|
|
130
|
-
const hasFilesystem = !!(builder.fileStorageProvider || builder.fileSystemOptions);
|
|
131
185
|
const statusDeps = {
|
|
132
186
|
getActiveWsConnections: () => eventSocketManager.getClients().length,
|
|
133
|
-
// TODO: expose getActiveShellSessions() on CliEventSocketManager
|
|
134
187
|
getActiveShellSessions: () => 0,
|
|
135
188
|
getRegisteredCommands: () => registry.processors.length,
|
|
136
189
|
getRegisteredJobs: () => registeredJobs,
|
|
137
190
|
getEnabledFeatures: () => {
|
|
138
191
|
const features = [...enabledFeatures];
|
|
192
|
+
const hasFilesystem = !!(builder.fileStorageProvider || builder.fileSystemOptions);
|
|
139
193
|
if (hasFilesystem && !features.includes('filesystem')) {
|
|
140
194
|
features.push('filesystem');
|
|
141
195
|
}
|
|
142
|
-
|
|
196
|
+
const hasJobs = registeredJobs > 0 || !!builder.serverOptions?.jobsEnabled;
|
|
197
|
+
if (hasJobs && !features.includes('jobs')) {
|
|
143
198
|
features.push('jobs');
|
|
144
199
|
}
|
|
145
200
|
return features;
|
|
146
201
|
},
|
|
147
202
|
};
|
|
148
|
-
router.use('/status', (0, status_controller_1.createStatusController)(statusDeps));
|
|
203
|
+
router.use('/status', authMiddleware, (0, status_controller_1.createStatusController)(statusDeps));
|
|
149
204
|
// Plugins
|
|
150
|
-
router.use('/plugins', (0, plugins_controller_1.createPluginsController)(moduleRegistry));
|
|
205
|
+
router.use('/plugins', authMiddleware, (0, plugins_controller_1.createPluginsController)(moduleRegistry));
|
|
151
206
|
// Config
|
|
152
|
-
router.use('/config', (0, config_controller_1.createConfigController)(this._config));
|
|
207
|
+
router.use('/config', authMiddleware, (0, config_controller_1.createConfigController)(this._config));
|
|
153
208
|
// Logs
|
|
154
|
-
router.use('/logs', (0, logs_controller_1.createLogsController)(logBuffer));
|
|
209
|
+
router.use('/logs', authMiddleware, (0, logs_controller_1.createLogsController)(logBuffer));
|
|
155
210
|
// WebSocket clients
|
|
156
|
-
router.use('/ws/clients', (0, ws_clients_controller_1.createWsClientsController)(eventSocketManager));
|
|
211
|
+
router.use('/ws/clients', authMiddleware, (0, ws_clients_controller_1.createWsClientsController)(eventSocketManager));
|
|
157
212
|
// Dashboard SPA static file serving
|
|
158
213
|
const dashboardRouter = (0, express_1.Router)();
|
|
159
|
-
const dashboardDistDir = this.
|
|
214
|
+
const dashboardDistDir = (0, dashboard_dir_1.resolveDashboardDir)(this._dashboardDir);
|
|
215
|
+
// Color scheme, read by the dashboard before its first render (public,
|
|
216
|
+
// like the dashboard itself: the login page uses it too)
|
|
217
|
+
const themeJson = JSON.stringify(this._theme);
|
|
218
|
+
dashboardRouter.get('/theme.json', (_req, res) => {
|
|
219
|
+
res.set('Cache-Control', 'no-cache');
|
|
220
|
+
res.type('application/json').send(themeJson);
|
|
221
|
+
});
|
|
160
222
|
if (dashboardDistDir) {
|
|
161
223
|
dashboardRouter.use((0, express_1.static)(dashboardDistDir));
|
|
162
224
|
// SPA fallback: serve index.html for all non-file routes
|
|
@@ -175,7 +237,16 @@ class CliAdminBuilder {
|
|
|
175
237
|
clearInterval(authResult.cleanupInterval);
|
|
176
238
|
logBuffer.restoreConsole();
|
|
177
239
|
};
|
|
178
|
-
return {
|
|
240
|
+
return {
|
|
241
|
+
prefix: '/api/v1/qcli',
|
|
242
|
+
dashboardPrefix: '/qcli/admin',
|
|
243
|
+
router,
|
|
244
|
+
dashboardRouter,
|
|
245
|
+
authMiddleware,
|
|
246
|
+
logBuffer,
|
|
247
|
+
publicRoutes: ['POST /api/v1/qcli/auth/login', 'GET /api/v1/qcli/auth/mode'],
|
|
248
|
+
dispose,
|
|
249
|
+
};
|
|
179
250
|
}
|
|
180
251
|
/**
|
|
181
252
|
* Set the path to the dashboard dist directory.
|
|
@@ -185,41 +256,6 @@ class CliAdminBuilder {
|
|
|
185
256
|
this._dashboardDir = dir;
|
|
186
257
|
return this;
|
|
187
258
|
}
|
|
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
259
|
}
|
|
224
260
|
exports.CliAdminBuilder = CliAdminBuilder;
|
|
225
261
|
//# 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
|
-
export { AuthControllerResult } from './auth/auth-controller';
|
|
6
|
+
export { AuthControllerResult, ADMIN_AUTH_MODE_PASSWORD, ADMIN_AUTH_MODE_EXTERNAL } 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,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClH,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.ADMIN_AUTH_MODE_EXTERNAL = exports.ADMIN_AUTH_MODE_PASSWORD = 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");
|
|
@@ -12,6 +12,15 @@ Object.defineProperty(exports, "AdminConfig", { enumerable: true, get: function
|
|
|
12
12
|
var jwt_service_1 = require("./auth/jwt-service");
|
|
13
13
|
Object.defineProperty(exports, "signToken", { enumerable: true, get: function () { return jwt_service_1.signToken; } });
|
|
14
14
|
Object.defineProperty(exports, "verifyToken", { enumerable: true, get: function () { return jwt_service_1.verifyToken; } });
|
|
15
|
+
var auth_controller_1 = require("./auth/auth-controller");
|
|
16
|
+
Object.defineProperty(exports, "ADMIN_AUTH_MODE_PASSWORD", { enumerable: true, get: function () { return auth_controller_1.ADMIN_AUTH_MODE_PASSWORD; } });
|
|
17
|
+
Object.defineProperty(exports, "ADMIN_AUTH_MODE_EXTERNAL", { enumerable: true, get: function () { return auth_controller_1.ADMIN_AUTH_MODE_EXTERNAL; } });
|
|
15
18
|
var auth_middleware_1 = require("./auth/auth-middleware");
|
|
16
19
|
Object.defineProperty(exports, "createAuthMiddleware", { enumerable: true, get: function () { return auth_middleware_1.createAuthMiddleware; } });
|
|
20
|
+
var auth_provider_1 = require("./auth/auth-provider");
|
|
21
|
+
Object.defineProperty(exports, "ADMIN_ACCESS_PERMISSION", { enumerable: true, get: function () { return auth_provider_1.ADMIN_ACCESS_PERMISSION; } });
|
|
22
|
+
var admin_theme_1 = require("./services/admin-theme");
|
|
23
|
+
Object.defineProperty(exports, "ADMIN_THEME_TOKENS", { enumerable: true, get: function () { return admin_theme_1.ADMIN_THEME_TOKENS; } });
|
|
24
|
+
Object.defineProperty(exports, "isThemeColor", { enumerable: true, get: function () { return admin_theme_1.isThemeColor; } });
|
|
25
|
+
Object.defineProperty(exports, "validateAdminTheme", { enumerable: true, get: function () { return admin_theme_1.validateAdminTheme; } });
|
|
17
26
|
//# 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;AAC/B,0DAAkH;AAAnF,2HAAA,wBAAwB,OAAA;AAAE,2HAAA,wBAAwB,OAAA;AACjF,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,53 @@ 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;
|
|
28
|
+
private _signInUrl;
|
|
24
29
|
private readonly _mutableSettings;
|
|
30
|
+
/**
|
|
31
|
+
* Where the host application signs users in, shown by the dashboard in external
|
|
32
|
+
* sign-in mode (users plugin with an external auth adapter) and returned by
|
|
33
|
+
* `GET /api/v1/qcli/auth/mode`. An absolute `http(s)` URL or a root-relative path
|
|
34
|
+
* (`/sign-in`). Undefined: the dashboard tells users to sign in through the host application.
|
|
35
|
+
*/
|
|
36
|
+
get signInUrl(): string | undefined;
|
|
37
|
+
set signInUrl(value: string | undefined);
|
|
38
|
+
/** Validates the options set by the host. Throws on an invalid {@link signInUrl}. */
|
|
39
|
+
validate(): void;
|
|
40
|
+
/**
|
|
41
|
+
* True for an absolute `http`/`https` URL with a host, or a root-relative path
|
|
42
|
+
* (`/sign-in`; not protocol-relative `//host` or `/\host`). Rejects other schemes
|
|
43
|
+
* such as `javascript:`, and control characters or whitespace.
|
|
44
|
+
*/
|
|
45
|
+
static isValidSignInUrl(value: string | null | undefined): boolean;
|
|
25
46
|
constructor();
|
|
47
|
+
/** True while the well-known `admin` / `admin` credentials are in effect. */
|
|
48
|
+
usesDefaultCredentials(): boolean;
|
|
49
|
+
/** Override the admin username and password. */
|
|
26
50
|
setCredentials(username: string, password: string): void;
|
|
51
|
+
/** Set the JWT signing secret explicitly. */
|
|
27
52
|
setJwtSecret(secret: string): void;
|
|
28
53
|
get jwtSecret(): string | undefined;
|
|
54
|
+
/** Validate credentials using timing-safe comparison. */
|
|
29
55
|
validateCredentials(username: string, password: string): boolean;
|
|
56
|
+
/** Return all configuration sections (server, auth, custom) for the dashboard. */
|
|
30
57
|
getConfigSections(): ConfigSection[];
|
|
58
|
+
/** Return a shallow copy of all mutable (custom) settings. */
|
|
31
59
|
getMutableSettings(): Record<string, unknown>;
|
|
60
|
+
/** Merge the provided key-value pairs into mutable settings. */
|
|
32
61
|
updateMutableSettings(values: Record<string, unknown>): void;
|
|
33
62
|
}
|
|
34
63
|
//# 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,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAEhE;;;;;OAKG;IACH,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAEtC;IAED,qFAAqF;IACrF,QAAQ,IAAI,IAAI;IAMhB;;;;OAIG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO;;IAuBlE,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"}
|