@dollhousemcp/mcp-server 2.0.10 → 2.0.11-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/dist/auto-dollhouse/portDiscovery.d.ts +23 -0
- package/dist/auto-dollhouse/portDiscovery.d.ts.map +1 -0
- package/dist/auto-dollhouse/portDiscovery.js +77 -0
- package/dist/cli/console-token.d.ts +18 -0
- package/dist/cli/console-token.d.ts.map +1 -0
- package/dist/cli/console-token.js +187 -0
- package/dist/config/ConfigManager.d.ts +34 -0
- package/dist/config/ConfigManager.d.ts.map +1 -1
- package/dist/config/ConfigManager.js +46 -1
- package/dist/config/env.d.ts +14 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +72 -2
- package/dist/di/Container.d.ts +1 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +38 -2
- package/dist/elements/agents/AgentManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/mcp-aql/GatekeeperSession.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/GatekeeperSession.js +3 -2
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +3 -2
- package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ToolClassification.js +8 -1
- package/dist/index.js +53 -3
- package/dist/security/InputNormalizer.d.ts +4 -6
- package/dist/security/InputNormalizer.d.ts.map +1 -1
- package/dist/security/InputNormalizer.js +10 -16
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +26 -1
- package/dist/security/constants.d.ts +7 -0
- package/dist/security/constants.d.ts.map +1 -1
- package/dist/security/constants.js +10 -1
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +14 -6
- package/dist/security/encryption/PatternEncryptor.d.ts.map +1 -1
- package/dist/security/encryption/PatternEncryptor.js +18 -10
- package/dist/security/securityMonitor.d.ts +1 -1
- package/dist/security/securityMonitor.d.ts.map +1 -1
- package/dist/security/securityMonitor.js +1 -1
- package/dist/security/tokenManager.d.ts +18 -2
- package/dist/security/tokenManager.d.ts.map +1 -1
- package/dist/security/tokenManager.js +47 -15
- package/dist/security/validators/unicodeValidator.d.ts +4 -5
- package/dist/security/validators/unicodeValidator.d.ts.map +1 -1
- package/dist/security/validators/unicodeValidator.js +19 -20
- package/dist/services/VerificationNotifier.d.ts.map +1 -1
- package/dist/services/VerificationNotifier.js +15 -13
- package/dist/services/validation/GenericElementValidator.js +5 -5
- package/dist/web/console/IngestRoutes.d.ts +14 -2
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +69 -5
- package/dist/web/console/LeaderElection.d.ts +35 -3
- package/dist/web/console/LeaderElection.d.ts.map +1 -1
- package/dist/web/console/LeaderElection.js +66 -6
- package/dist/web/console/LeaderForwardingSink.d.ts +15 -3
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
- package/dist/web/console/LeaderForwardingSink.js +32 -7
- package/dist/web/console/SessionNames.d.ts +7 -0
- package/dist/web/console/SessionNames.d.ts.map +1 -1
- package/dist/web/console/SessionNames.js +10 -1
- package/dist/web/console/UnifiedConsole.d.ts +26 -1
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
- package/dist/web/console/UnifiedConsole.js +104 -14
- package/dist/web/console/consoleToken.d.ts +403 -0
- package/dist/web/console/consoleToken.d.ts.map +1 -0
- package/dist/web/console/consoleToken.js +930 -0
- package/dist/web/middleware/authMiddleware.d.ts +64 -0
- package/dist/web/middleware/authMiddleware.d.ts.map +1 -0
- package/dist/web/middleware/authMiddleware.js +174 -0
- package/dist/web/portDiscovery.d.ts +4 -3
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +7 -5
- package/dist/web/public/app.js +35 -18
- package/dist/web/public/consoleAuth.js +152 -0
- package/dist/web/public/index.html +243 -9
- package/dist/web/public/logs.js +1 -1
- package/dist/web/public/metrics.js +3 -3
- package/dist/web/public/permissions.js +1 -1
- package/dist/web/public/security.css +396 -0
- package/dist/web/public/security.js +393 -0
- package/dist/web/public/sessions.css +54 -4
- package/dist/web/public/sessions.js +46 -6
- package/dist/web/public/setup.css +439 -0
- package/dist/web/public/setup.js +490 -18
- package/dist/web/public/styles.css +10 -0
- package/dist/web/routes/consoleRouteHelpers.d.ts +33 -0
- package/dist/web/routes/consoleRouteHelpers.d.ts.map +1 -0
- package/dist/web/routes/consoleRouteHelpers.js +60 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +8 -3
- package/dist/web/routes/setupRoutes.d.ts +4 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +418 -7
- package/dist/web/routes/tokenRoutes.d.ts +37 -0
- package/dist/web/routes/tokenRoutes.d.ts.map +1 -0
- package/dist/web/routes/tokenRoutes.js +95 -0
- package/dist/web/routes/totpRoutes.d.ts +45 -0
- package/dist/web/routes/totpRoutes.d.ts.map +1 -0
- package/dist/web/routes/totpRoutes.js +187 -0
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +9 -5
- package/dist/web/server.d.ts +13 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +202 -56
- package/package.json +11 -2
- package/server.json +2 -2
- package/dist/constants/version.d.ts +0 -3
- package/dist/constants/version.d.ts.map +0 -1
- package/dist/constants/version.js +0 -4
- package/dist/logging/sinks/SSELogSink.d.ts +0 -35
- package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
- package/dist/logging/sinks/SSELogSink.js +0 -181
- package/dist/logging/viewer/viewerHtml.d.ts +0 -8
- package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
- package/dist/logging/viewer/viewerHtml.js +0 -204
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.0.11-rc.1] - 2026-04-08
|
|
4
|
+
|
|
5
|
+
Release candidate for v2.0.11 — console auth, permissions, licensing, port 41715, channel selector
|
|
6
|
+
|
|
7
|
+
## [Unreleased] — Phase 2 authenticated console
|
|
8
|
+
|
|
9
|
+
### Breaking: Web console default port moved from 3939 → 41715
|
|
10
|
+
|
|
11
|
+
The authenticated web console (Phase 2 and later) binds to port **41715** by default, not 3939. The associated state files now live at:
|
|
12
|
+
|
|
13
|
+
- `~/.dollhouse/run/console-leader.auth.lock` (was `console-leader.lock`)
|
|
14
|
+
- `~/.dollhouse/run/console-token.auth.json` (was `console-token.json`)
|
|
15
|
+
|
|
16
|
+
**Why:** Pre-authentication DollhouseMCP installations (≤ 2.0.x) continue to use port 3939 and the legacy file paths. The port + filename separation lets a legacy installation and an authenticated installation coexist on the same machine with zero interference — different ports, different lock files, different token files, independent leader-election spaces. This avoids a confusing "security popping on and off" UX when a user has both a pre-auth Claude Desktop install and an authenticated Claude Code install running simultaneously.
|
|
17
|
+
|
|
18
|
+
**Configurability:** The port, lock file path, and token file path are now all driven by env vars with a single source of truth in `src/config/env.ts`. Changing any of them is a one-line edit — no hunt-and-peck across the codebase:
|
|
19
|
+
|
|
20
|
+
| Env var | Default |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `DOLLHOUSE_WEB_CONSOLE_PORT` | `41715` |
|
|
23
|
+
| `DOLLHOUSE_CONSOLE_LEADER_LOCK_FILE` | `~/.dollhouse/run/console-leader.auth.lock` |
|
|
24
|
+
| `DOLLHOUSE_CONSOLE_TOKEN_FILE` | `~/.dollhouse/run/console-token.auth.json` |
|
|
25
|
+
|
|
26
|
+
Port 41715 spells "AILIS" on a phone keypad — the AI Layer Interface Specification.
|
|
27
|
+
|
|
28
|
+
**Legacy detection:** When the authenticated console starts, it checks for an active legacy (pre-auth) DollhouseMCP process on port 3939 and logs a warning if one is found, explaining the coexistence and the differing security posture.
|
|
29
|
+
|
|
30
|
+
**Consumer impact:**
|
|
31
|
+
- **DollhouseBridge**: will need a matching port update when it consumes Phase 2 features — tracking issue filed
|
|
32
|
+
- **User bookmarks / shell scripts**: update `localhost:3939` references to `localhost:41715` (or set `DOLLHOUSE_WEB_CONSOLE_PORT` to whatever you prefer)
|
|
33
|
+
- **Docs**: all `docs/guides/*.md` references updated
|
|
34
|
+
- **Nothing breaks silently**: the auth console simply isn't on 3939 anymore; the legacy console continues to work there untouched
|
|
35
|
+
|
|
3
36
|
## [2.0.7] - 2026-04-02
|
|
4
37
|
|
|
5
38
|
### Clean terminal output for `--web` mode
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* auto-dollhouse#5: Dynamic port allocation and port file discovery.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from server.ts. Handles finding available ports when multiple
|
|
5
|
+
* DollhouseMCP sessions run simultaneously, and writing port discovery
|
|
6
|
+
* files so PreToolUse hook scripts know which port to curl.
|
|
7
|
+
*/
|
|
8
|
+
export declare function findAvailablePort(startPort: number): Promise<number>;
|
|
9
|
+
/**
|
|
10
|
+
* Write the active server port to a discoverable file.
|
|
11
|
+
* PreToolUse hook scripts read this to know which port to curl.
|
|
12
|
+
* Each process writes its own PID-keyed file for cleanup.
|
|
13
|
+
*/
|
|
14
|
+
export declare function writePortFile(port: number): Promise<string>;
|
|
15
|
+
/**
|
|
16
|
+
* Clean up port file on shutdown.
|
|
17
|
+
*/
|
|
18
|
+
export declare function cleanupPortFile(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Register process exit handlers to clean up port files.
|
|
21
|
+
*/
|
|
22
|
+
export declare function registerPortCleanup(): void;
|
|
23
|
+
//# sourceMappingURL=portDiscovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portDiscovery.d.ts","sourceRoot":"","sources":["../../src/auto-dollhouse/portDiscovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6BH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW1E;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQjE;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAIrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAK1C"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* auto-dollhouse#5: Dynamic port allocation and port file discovery.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from server.ts. Handles finding available ports when multiple
|
|
5
|
+
* DollhouseMCP sessions run simultaneously, and writing port discovery
|
|
6
|
+
* files so PreToolUse hook scripts know which port to curl.
|
|
7
|
+
*/
|
|
8
|
+
import { createServer } from 'node:net';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
import { mkdir, writeFile, unlink } from 'node:fs/promises';
|
|
12
|
+
const MAX_PORT_ATTEMPTS = 10;
|
|
13
|
+
/** Directory for runtime state files (port discovery, PID files) */
|
|
14
|
+
const RUN_DIR = join(homedir(), '.dollhouse', 'run');
|
|
15
|
+
/** Track port file path for cleanup */
|
|
16
|
+
let portFilePath = null;
|
|
17
|
+
/**
|
|
18
|
+
* Find an available port starting from the given port.
|
|
19
|
+
* Tries sequential ports up to MAX_PORT_ATTEMPTS to avoid conflicts
|
|
20
|
+
* when multiple DollhouseMCP sessions run simultaneously.
|
|
21
|
+
*/
|
|
22
|
+
function tryBindPort(port) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const server = createServer();
|
|
25
|
+
server.once('error', (err) => reject(err));
|
|
26
|
+
server.once('listening', () => server.close(() => resolve(port)));
|
|
27
|
+
server.listen(port, '127.0.0.1');
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
export async function findAvailablePort(startPort) {
|
|
31
|
+
for (let attempt = 0; attempt <= MAX_PORT_ATTEMPTS; attempt++) {
|
|
32
|
+
try {
|
|
33
|
+
return await tryBindPort(startPort + attempt);
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
if (err.code !== 'EADDRINUSE' || attempt === MAX_PORT_ATTEMPTS) {
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`No available port found after ${MAX_PORT_ATTEMPTS} attempts from ${startPort}`);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Write the active server port to a discoverable file.
|
|
45
|
+
* PreToolUse hook scripts read this to know which port to curl.
|
|
46
|
+
* Each process writes its own PID-keyed file for cleanup.
|
|
47
|
+
*/
|
|
48
|
+
export async function writePortFile(port) {
|
|
49
|
+
await mkdir(RUN_DIR, { recursive: true });
|
|
50
|
+
const pidFile = join(RUN_DIR, `permission-server-${process.pid}.port`);
|
|
51
|
+
const latestFile = join(RUN_DIR, 'permission-server.port');
|
|
52
|
+
await writeFile(pidFile, String(port), 'utf-8');
|
|
53
|
+
await writeFile(latestFile, String(port), 'utf-8');
|
|
54
|
+
portFilePath = pidFile;
|
|
55
|
+
return pidFile;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Clean up port file on shutdown.
|
|
59
|
+
*/
|
|
60
|
+
export async function cleanupPortFile() {
|
|
61
|
+
if (portFilePath) {
|
|
62
|
+
try {
|
|
63
|
+
await unlink(portFilePath);
|
|
64
|
+
}
|
|
65
|
+
catch { /* already gone */ }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Register process exit handlers to clean up port files.
|
|
70
|
+
*/
|
|
71
|
+
export function registerPortCleanup() {
|
|
72
|
+
const exitCleanup = () => { cleanupPortFile().catch(() => { }); };
|
|
73
|
+
process.once('exit', exitCleanup);
|
|
74
|
+
process.once('SIGTERM', exitCleanup);
|
|
75
|
+
process.once('SIGINT', exitCleanup);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydERpc2NvdmVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRvLWRvbGxob3VzZS9wb3J0RGlzY292ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTVELE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBRTdCLG9FQUFvRTtBQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRXJELHVDQUF1QztBQUN2QyxJQUFJLFlBQVksR0FBa0IsSUFBSSxDQUFDO0FBRXZDOzs7O0dBSUc7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxNQUFNLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUEwQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxTQUFpQjtJQUN2RCxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLElBQUksaUJBQWlCLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUM5RCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sV0FBVyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUssR0FBNkIsQ0FBQyxJQUFJLEtBQUssWUFBWSxJQUFJLE9BQU8sS0FBSyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMxRixNQUFNLEdBQUcsQ0FBQztZQUNaLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLGlCQUFpQixrQkFBa0IsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUNuRyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUFDLElBQVk7SUFDOUMsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDdkUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNELE1BQU0sU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsTUFBTSxTQUFTLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNuRCxZQUFZLEdBQUcsT0FBTyxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZTtJQUNuQyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQztZQUFDLE1BQU0sTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxtQkFBbUI7SUFDakMsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF1dG8tZG9sbGhvdXNlIzU6IER5bmFtaWMgcG9ydCBhbGxvY2F0aW9uIGFuZCBwb3J0IGZpbGUgZGlzY292ZXJ5LlxuICpcbiAqIEV4dHJhY3RlZCBmcm9tIHNlcnZlci50cy4gSGFuZGxlcyBmaW5kaW5nIGF2YWlsYWJsZSBwb3J0cyB3aGVuIG11bHRpcGxlXG4gKiBEb2xsaG91c2VNQ1Agc2Vzc2lvbnMgcnVuIHNpbXVsdGFuZW91c2x5LCBhbmQgd3JpdGluZyBwb3J0IGRpc2NvdmVyeVxuICogZmlsZXMgc28gUHJlVG9vbFVzZSBob29rIHNjcmlwdHMga25vdyB3aGljaCBwb3J0IHRvIGN1cmwuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlU2VydmVyIH0gZnJvbSAnbm9kZTpuZXQnO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBta2Rpciwgd3JpdGVGaWxlLCB1bmxpbmsgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuY29uc3QgTUFYX1BPUlRfQVRURU1QVFMgPSAxMDtcblxuLyoqIERpcmVjdG9yeSBmb3IgcnVudGltZSBzdGF0ZSBmaWxlcyAocG9ydCBkaXNjb3ZlcnksIFBJRCBmaWxlcykgKi9cbmNvbnN0IFJVTl9ESVIgPSBqb2luKGhvbWVkaXIoKSwgJy5kb2xsaG91c2UnLCAncnVuJyk7XG5cbi8qKiBUcmFjayBwb3J0IGZpbGUgcGF0aCBmb3IgY2xlYW51cCAqL1xubGV0IHBvcnRGaWxlUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogRmluZCBhbiBhdmFpbGFibGUgcG9ydCBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBwb3J0LlxuICogVHJpZXMgc2VxdWVudGlhbCBwb3J0cyB1cCB0byBNQVhfUE9SVF9BVFRFTVBUUyB0byBhdm9pZCBjb25mbGljdHNcbiAqIHdoZW4gbXVsdGlwbGUgRG9sbGhvdXNlTUNQIHNlc3Npb25zIHJ1biBzaW11bHRhbmVvdXNseS5cbiAqL1xuZnVuY3Rpb24gdHJ5QmluZFBvcnQocG9ydDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKTtcbiAgICBzZXJ2ZXIub25jZSgnZXJyb3InLCAoZXJyOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHJlamVjdChlcnIpKTtcbiAgICBzZXJ2ZXIub25jZSgnbGlzdGVuaW5nJywgKCkgPT4gc2VydmVyLmNsb3NlKCgpID0+IHJlc29sdmUocG9ydCkpKTtcbiAgICBzZXJ2ZXIubGlzdGVuKHBvcnQsICcxMjcuMC4wLjEnKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQXZhaWxhYmxlUG9ydChzdGFydFBvcnQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IE1BWF9QT1JUX0FUVEVNUFRTOyBhdHRlbXB0KyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRyeUJpbmRQb3J0KHN0YXJ0UG9ydCArIGF0dGVtcHQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKChlcnIgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlICE9PSAnRUFERFJJTlVTRScgfHwgYXR0ZW1wdCA9PT0gTUFYX1BPUlRfQVRURU1QVFMpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYE5vIGF2YWlsYWJsZSBwb3J0IGZvdW5kIGFmdGVyICR7TUFYX1BPUlRfQVRURU1QVFN9IGF0dGVtcHRzIGZyb20gJHtzdGFydFBvcnR9YCk7XG59XG5cbi8qKlxuICogV3JpdGUgdGhlIGFjdGl2ZSBzZXJ2ZXIgcG9ydCB0byBhIGRpc2NvdmVyYWJsZSBmaWxlLlxuICogUHJlVG9vbFVzZSBob29rIHNjcmlwdHMgcmVhZCB0aGlzIHRvIGtub3cgd2hpY2ggcG9ydCB0byBjdXJsLlxuICogRWFjaCBwcm9jZXNzIHdyaXRlcyBpdHMgb3duIFBJRC1rZXllZCBmaWxlIGZvciBjbGVhbnVwLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVQb3J0RmlsZShwb3J0OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICBhd2FpdCBta2RpcihSVU5fRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgcGlkRmlsZSA9IGpvaW4oUlVOX0RJUiwgYHBlcm1pc3Npb24tc2VydmVyLSR7cHJvY2Vzcy5waWR9LnBvcnRgKTtcbiAgY29uc3QgbGF0ZXN0RmlsZSA9IGpvaW4oUlVOX0RJUiwgJ3Blcm1pc3Npb24tc2VydmVyLnBvcnQnKTtcbiAgYXdhaXQgd3JpdGVGaWxlKHBpZEZpbGUsIFN0cmluZyhwb3J0KSwgJ3V0Zi04Jyk7XG4gIGF3YWl0IHdyaXRlRmlsZShsYXRlc3RGaWxlLCBTdHJpbmcocG9ydCksICd1dGYtOCcpO1xuICBwb3J0RmlsZVBhdGggPSBwaWRGaWxlO1xuICByZXR1cm4gcGlkRmlsZTtcbn1cblxuLyoqXG4gKiBDbGVhbiB1cCBwb3J0IGZpbGUgb24gc2h1dGRvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbGVhbnVwUG9ydEZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChwb3J0RmlsZVBhdGgpIHtcbiAgICB0cnkgeyBhd2FpdCB1bmxpbmsocG9ydEZpbGVQYXRoKTsgfSBjYXRjaCB7IC8qIGFscmVhZHkgZ29uZSAqLyB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlciBwcm9jZXNzIGV4aXQgaGFuZGxlcnMgdG8gY2xlYW4gdXAgcG9ydCBmaWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUG9ydENsZWFudXAoKTogdm9pZCB7XG4gIGNvbnN0IGV4aXRDbGVhbnVwID0gKCkgPT4geyBjbGVhbnVwUG9ydEZpbGUoKS5jYXRjaCgoKSA9PiB7fSk7IH07XG4gIHByb2Nlc3Mub25jZSgnZXhpdCcsIGV4aXRDbGVhbnVwKTtcbiAgcHJvY2Vzcy5vbmNlKCdTSUdURVJNJywgZXhpdENsZWFudXApO1xuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGV4aXRDbGVhbnVwKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI commands for console token management (#1790).
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* dollhouse console token show [--json]
|
|
7
|
+
* dollhouse console token rotate [--json]
|
|
8
|
+
* dollhouse console token revoke [--id <uuid>] [--json]
|
|
9
|
+
*
|
|
10
|
+
* Exit codes:
|
|
11
|
+
* 0 — success
|
|
12
|
+
* 1 — user error (missing file, invalid args)
|
|
13
|
+
* 2 — auth/confirmation failure (wrong TOTP code, not enrolled)
|
|
14
|
+
*
|
|
15
|
+
* @since v2.1.0 — Issue #1790
|
|
16
|
+
*/
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=console-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-token.d.ts","sourceRoot":"","sources":["../../src/cli/console-token.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI commands for console token management (#1790).
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* dollhouse console token show [--json]
|
|
7
|
+
* dollhouse console token rotate [--json]
|
|
8
|
+
* dollhouse console token revoke [--id <uuid>] [--json]
|
|
9
|
+
*
|
|
10
|
+
* Exit codes:
|
|
11
|
+
* 0 — success
|
|
12
|
+
* 1 — user error (missing file, invalid args)
|
|
13
|
+
* 2 — auth/confirmation failure (wrong TOTP code, not enrolled)
|
|
14
|
+
*
|
|
15
|
+
* @since v2.1.0 — Issue #1790
|
|
16
|
+
*/
|
|
17
|
+
import { Command } from 'commander';
|
|
18
|
+
import chalk from 'chalk';
|
|
19
|
+
import { createInterface } from 'node:readline/promises';
|
|
20
|
+
import { stdin, stdout } from 'node:process';
|
|
21
|
+
import { ConsoleTokenStore, readTokenFileRaw, TotpError, DEFAULT_TOKEN_FILE, } from '../web/console/consoleToken.js';
|
|
22
|
+
import { env } from '../config/env.js';
|
|
23
|
+
/** Resolve the token file path from env or default. */
|
|
24
|
+
function resolveTokenFilePath() {
|
|
25
|
+
return env.DOLLHOUSE_CONSOLE_TOKEN_FILE || DEFAULT_TOKEN_FILE;
|
|
26
|
+
}
|
|
27
|
+
/** Read token file or exit with error. */
|
|
28
|
+
async function readFileOrExit(filePath) {
|
|
29
|
+
const data = await readTokenFileRaw(filePath);
|
|
30
|
+
if (!data) {
|
|
31
|
+
console.error(chalk.red('Token file not found or corrupt: ' + filePath));
|
|
32
|
+
console.error(chalk.gray('The token file is created automatically when the server starts.'));
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
/** Prompt the user for a TOTP code on stdin. */
|
|
38
|
+
async function promptTotpCode() {
|
|
39
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
40
|
+
try {
|
|
41
|
+
const code = await rl.question(chalk.cyan('Enter TOTP code (or backup code): '));
|
|
42
|
+
// Strip whitespace and dashes — users may type backup codes as "XXXX-XXXX"
|
|
43
|
+
const trimmed = code.trim().replaceAll(/[\s-]/g, '');
|
|
44
|
+
if (!trimmed) {
|
|
45
|
+
console.error(chalk.red('No confirmation code provided.'));
|
|
46
|
+
process.exit(2);
|
|
47
|
+
}
|
|
48
|
+
// Accept 6-digit TOTP codes or 8-char alphanumeric backup codes
|
|
49
|
+
if (!/^\d{6}$/.test(trimmed) && !/^[0-9A-Za-z]{8}$/.test(trimmed)) {
|
|
50
|
+
console.error(chalk.red('Invalid code format. Enter a 6-digit TOTP code or an 8-character backup code.'));
|
|
51
|
+
process.exit(2);
|
|
52
|
+
}
|
|
53
|
+
return trimmed;
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
rl.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Shared rotation logic for both `rotate` and `revoke` commands.
|
|
61
|
+
* Initializes the store, checks TOTP enrollment, obtains the confirmation
|
|
62
|
+
* code (from --code flag or interactive prompt), and calls rotatePrimary.
|
|
63
|
+
*
|
|
64
|
+
* @param operation - 'rotation' or 'revocation' for user-facing messages
|
|
65
|
+
*/
|
|
66
|
+
async function executeRotation(options, operation) {
|
|
67
|
+
const filePath = resolveTokenFilePath();
|
|
68
|
+
const store = new ConsoleTokenStore(filePath);
|
|
69
|
+
await store.ensureInitialized('CLI');
|
|
70
|
+
if (!store.isTotpEnrolled()) {
|
|
71
|
+
if (options.json) {
|
|
72
|
+
console.log(JSON.stringify({ error: 'TOTP enrollment required', code: 'TOTP_REQUIRED' }));
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
console.error(chalk.red(`Token ${operation} requires TOTP enrollment.`));
|
|
76
|
+
console.error(chalk.gray('Enroll via the Security tab or the TOTP enrollment API.'));
|
|
77
|
+
}
|
|
78
|
+
process.exit(2);
|
|
79
|
+
}
|
|
80
|
+
const code = options.code || await promptTotpCode();
|
|
81
|
+
try {
|
|
82
|
+
return await store.rotatePrimary(code);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err instanceof TotpError) {
|
|
86
|
+
if (options.json) {
|
|
87
|
+
console.log(JSON.stringify({ error: err.message, code: err.code }));
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.error(chalk.red(`${operation.charAt(0).toUpperCase() + operation.slice(1)} failed: ${err.message}`));
|
|
91
|
+
}
|
|
92
|
+
process.exit(2);
|
|
93
|
+
}
|
|
94
|
+
console.error(chalk.red(`Unexpected error during ${operation}: ${err instanceof Error ? err.message : String(err)}`));
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Format and print the result of a rotation/revocation operation.
|
|
100
|
+
* Handles both JSON and human-readable output for rotate and revoke.
|
|
101
|
+
*/
|
|
102
|
+
function printRotationResult(result, options, operation) {
|
|
103
|
+
if (options.json) {
|
|
104
|
+
const output = operation === 'rotation'
|
|
105
|
+
? { token: result.token, rotatedAt: result.rotatedAt, graceUntil: result.graceUntil }
|
|
106
|
+
: { revoked: true, newToken: result.token, rotatedAt: result.rotatedAt };
|
|
107
|
+
console.log(JSON.stringify(output, null, 2));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
const successMsg = operation === 'rotation'
|
|
111
|
+
? 'Token rotated successfully.'
|
|
112
|
+
: 'Token revoked. A new token has been issued.';
|
|
113
|
+
const statusMsg = operation === 'rotation'
|
|
114
|
+
? `Old token valid until: ${new Date(result.graceUntil).toISOString()}`
|
|
115
|
+
: 'All sessions using the old token will lose access after the grace window.';
|
|
116
|
+
console.log(chalk.green(successMsg));
|
|
117
|
+
console.log(result.token);
|
|
118
|
+
console.log(chalk.gray(`Rotated at: ${result.rotatedAt}`));
|
|
119
|
+
console.log(chalk.gray(statusMsg));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ── Program ─────────────────────────────────────────────────────────────
|
|
123
|
+
const program = new Command();
|
|
124
|
+
program
|
|
125
|
+
.name('dollhouse console token')
|
|
126
|
+
.description('Manage console authentication tokens');
|
|
127
|
+
// ── show ────────────────────────────────────────────────────────────────
|
|
128
|
+
program
|
|
129
|
+
.command('show')
|
|
130
|
+
.description('Print the current primary console token')
|
|
131
|
+
.option('--json', 'Output as JSON for scripted consumption')
|
|
132
|
+
.option('--masked', 'Show masked token instead of full value')
|
|
133
|
+
.action(async (options) => {
|
|
134
|
+
const filePath = resolveTokenFilePath();
|
|
135
|
+
const data = await readFileOrExit(filePath);
|
|
136
|
+
const primary = data.tokens[0];
|
|
137
|
+
if (!primary) {
|
|
138
|
+
console.error(chalk.red('No tokens found in the token file.'));
|
|
139
|
+
process.exit(1);
|
|
140
|
+
}
|
|
141
|
+
if (options.json) {
|
|
142
|
+
const output = {
|
|
143
|
+
id: primary.id,
|
|
144
|
+
name: primary.name,
|
|
145
|
+
kind: primary.kind,
|
|
146
|
+
token: options.masked ? primary.token.slice(0, 8) + '...' : primary.token,
|
|
147
|
+
scopes: primary.scopes,
|
|
148
|
+
createdAt: primary.createdAt,
|
|
149
|
+
lastUsedAt: primary.lastUsedAt,
|
|
150
|
+
createdVia: primary.createdVia,
|
|
151
|
+
filePath,
|
|
152
|
+
totpEnrolled: data.totp.enrolled,
|
|
153
|
+
};
|
|
154
|
+
console.log(JSON.stringify(output, null, 2));
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
const tokenDisplay = options.masked
|
|
158
|
+
? primary.token.slice(0, 8) + chalk.gray('•'.repeat(56))
|
|
159
|
+
: primary.token;
|
|
160
|
+
console.log(tokenDisplay);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
// ── rotate ──────────────────────────────────────────────────────────────
|
|
164
|
+
program
|
|
165
|
+
.command('rotate')
|
|
166
|
+
.description('Rotate the primary console token (requires TOTP confirmation)')
|
|
167
|
+
.option('--json', 'Output as JSON for scripted consumption')
|
|
168
|
+
.option('--code <code>', 'TOTP confirmation code (prompts if omitted)')
|
|
169
|
+
.action(async (options) => {
|
|
170
|
+
const result = await executeRotation(options, 'rotation');
|
|
171
|
+
printRotationResult(result, options, 'rotation');
|
|
172
|
+
});
|
|
173
|
+
// ── revoke ──────────────────────────────────────────────────────────────
|
|
174
|
+
program
|
|
175
|
+
.command('revoke')
|
|
176
|
+
.description('Revoke a token — rotates the primary to invalidate the current value')
|
|
177
|
+
.option('--json', 'Output as JSON for scripted consumption')
|
|
178
|
+
.option('--code <code>', 'TOTP confirmation code (prompts if omitted)')
|
|
179
|
+
.action(async (options) => {
|
|
180
|
+
// For Phase 2 with a single primary token, revoke == rotate.
|
|
181
|
+
// When multi-device tokens land, --id <uuid> removes a specific
|
|
182
|
+
// non-primary token from the store.
|
|
183
|
+
const result = await executeRotation(options, 'revocation');
|
|
184
|
+
printRotationResult(result, options, 'revocation');
|
|
185
|
+
});
|
|
186
|
+
program.parse(process.argv);
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29sZS10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvY29uc29sZS10b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULGtCQUFrQixHQUduQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV2Qyx1REFBdUQ7QUFDdkQsU0FBUyxvQkFBb0I7SUFDM0IsT0FBTyxHQUFHLENBQUMsNEJBQTRCLElBQUksa0JBQWtCLENBQUM7QUFDaEUsQ0FBQztBQUVELDBDQUEwQztBQUMxQyxLQUFLLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzVDLE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDekUsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUMsQ0FBQztRQUM3RixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxnREFBZ0Q7QUFDaEQsS0FBSyxVQUFVLGNBQWM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM3RCxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUM7UUFDakYsMkVBQTJFO1FBQzNFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7WUFDM0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO1FBQ0QsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEUsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLCtFQUErRSxDQUFDLENBQUMsQ0FBQztZQUMxRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO1lBQVMsQ0FBQztRQUNULEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNiLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLGVBQWUsQ0FDNUIsT0FBMEMsRUFDMUMsU0FBb0M7SUFFcEMsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXJDLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsMEJBQTBCLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1RixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLFNBQVMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyx5REFBeUQsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxjQUFjLEVBQUUsQ0FBQztJQUVwRCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxZQUFZLFNBQVMsRUFBRSxDQUFDO1lBQzdCLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0csQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsU0FBUyxLQUFLLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN0SCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsTUFBc0IsRUFDdEIsT0FBMkIsRUFDM0IsU0FBb0M7SUFFcEMsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsTUFBTSxNQUFNLEdBQUcsU0FBUyxLQUFLLFVBQVU7WUFDckMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDckYsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNFLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLFVBQVUsR0FBRyxTQUFTLEtBQUssVUFBVTtZQUN6QyxDQUFDLENBQUMsNkJBQTZCO1lBQy9CLENBQUMsQ0FBQyw2Q0FBNkMsQ0FBQztRQUNsRCxNQUFNLFNBQVMsR0FBRyxTQUFTLEtBQUssVUFBVTtZQUN4QyxDQUFDLENBQUMsMEJBQTBCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUN2RSxDQUFDLENBQUMsMkVBQTJFLENBQUM7UUFDaEYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0FBQ0gsQ0FBQztBQUVELDJFQUEyRTtBQUUzRSxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMseUJBQXlCLENBQUM7S0FDL0IsV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7QUFFdkQsMkVBQTJFO0FBRTNFLE9BQU87S0FDSixPQUFPLENBQUMsTUFBTSxDQUFDO0tBQ2YsV0FBVyxDQUFDLHlDQUF5QyxDQUFDO0tBQ3RELE1BQU0sQ0FBQyxRQUFRLEVBQUUseUNBQXlDLENBQUM7S0FDM0QsTUFBTSxDQUFDLFVBQVUsRUFBRSx5Q0FBeUMsQ0FBQztLQUM3RCxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQTZDLEVBQUUsRUFBRTtJQUM5RCxNQUFNLFFBQVEsR0FBRyxvQkFBb0IsRUFBRSxDQUFDO0lBQ3hDLE1BQU0sSUFBSSxHQUFHLE1BQU0sY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQztRQUMvRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNqQixNQUFNLE1BQU0sR0FBNEI7WUFDdEMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUs7WUFDekUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztZQUM1QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO1lBQzlCLFFBQVE7WUFDUixZQUFZLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO1NBQ2pDLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU07WUFDakMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCwyRUFBMkU7QUFFM0UsT0FBTztLQUNKLE9BQU8sQ0FBQyxRQUFRLENBQUM7S0FDakIsV0FBVyxDQUFDLCtEQUErRCxDQUFDO0tBQzVFLE1BQU0sQ0FBQyxRQUFRLEVBQUUseUNBQXlDLENBQUM7S0FDM0QsTUFBTSxDQUFDLGVBQWUsRUFBRSw2Q0FBNkMsQ0FBQztLQUN0RSxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQTBDLEVBQUUsRUFBRTtJQUMzRCxNQUFNLE1BQU0sR0FBRyxNQUFNLGVBQWUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDMUQsbUJBQW1CLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNuRCxDQUFDLENBQUMsQ0FBQztBQUVMLDJFQUEyRTtBQUUzRSxPQUFPO0tBQ0osT0FBTyxDQUFDLFFBQVEsQ0FBQztLQUNqQixXQUFXLENBQUMsc0VBQXNFLENBQUM7S0FDbkYsTUFBTSxDQUFDLFFBQVEsRUFBRSx5Q0FBeUMsQ0FBQztLQUMzRCxNQUFNLENBQUMsZUFBZSxFQUFFLDZDQUE2QyxDQUFDO0tBQ3RFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBMEMsRUFBRSxFQUFFO0lBQzNELDZEQUE2RDtJQUM3RCxnRUFBZ0U7SUFDaEUsb0NBQW9DO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sZUFBZSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM1RCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3JELENBQUMsQ0FBQyxDQUFDO0FBRUwsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qKlxuICogQ0xJIGNvbW1hbmRzIGZvciBjb25zb2xlIHRva2VuIG1hbmFnZW1lbnQgKCMxNzkwKS5cbiAqXG4gKiBVc2FnZTpcbiAqICAgZG9sbGhvdXNlIGNvbnNvbGUgdG9rZW4gc2hvdyBbLS1qc29uXVxuICogICBkb2xsaG91c2UgY29uc29sZSB0b2tlbiByb3RhdGUgWy0tanNvbl1cbiAqICAgZG9sbGhvdXNlIGNvbnNvbGUgdG9rZW4gcmV2b2tlIFstLWlkIDx1dWlkPl0gWy0tanNvbl1cbiAqXG4gKiBFeGl0IGNvZGVzOlxuICogICAwIOKAlCBzdWNjZXNzXG4gKiAgIDEg4oCUIHVzZXIgZXJyb3IgKG1pc3NpbmcgZmlsZSwgaW52YWxpZCBhcmdzKVxuICogICAyIOKAlCBhdXRoL2NvbmZpcm1hdGlvbiBmYWlsdXJlICh3cm9uZyBUT1RQIGNvZGUsIG5vdCBlbnJvbGxlZClcbiAqXG4gKiBAc2luY2UgdjIuMS4wIOKAlCBJc3N1ZSAjMTc5MFxuICovXG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gJ25vZGU6cmVhZGxpbmUvcHJvbWlzZXMnO1xuaW1wb3J0IHsgc3RkaW4sIHN0ZG91dCB9IGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBDb25zb2xlVG9rZW5TdG9yZSxcbiAgcmVhZFRva2VuRmlsZVJhdyxcbiAgVG90cEVycm9yLFxuICBERUZBVUxUX1RPS0VOX0ZJTEUsXG4gIHR5cGUgQ29uc29sZVRva2VuRmlsZSxcbiAgdHlwZSBSb3RhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi4vd2ViL2NvbnNvbGUvY29uc29sZVRva2VuLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uL2NvbmZpZy9lbnYuanMnO1xuXG4vKiogUmVzb2x2ZSB0aGUgdG9rZW4gZmlsZSBwYXRoIGZyb20gZW52IG9yIGRlZmF1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5GaWxlUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gZW52LkRPTExIT1VTRV9DT05TT0xFX1RPS0VOX0ZJTEUgfHwgREVGQVVMVF9UT0tFTl9GSUxFO1xufVxuXG4vKiogUmVhZCB0b2tlbiBmaWxlIG9yIGV4aXQgd2l0aCBlcnJvci4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlT3JFeGl0KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENvbnNvbGVUb2tlbkZpbGU+IHtcbiAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRUb2tlbkZpbGVSYXcoZmlsZVBhdGgpO1xuICBpZiAoIWRhdGEpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnVG9rZW4gZmlsZSBub3QgZm91bmQgb3IgY29ycnVwdDogJyArIGZpbGVQYXRoKSk7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5ncmF5KCdUaGUgdG9rZW4gZmlsZSBpcyBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgc2VydmVyIHN0YXJ0cy4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKiogUHJvbXB0IHRoZSB1c2VyIGZvciBhIFRPVFAgY29kZSBvbiBzdGRpbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb21wdFRvdHBDb2RlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJsID0gY3JlYXRlSW50ZXJmYWNlKHsgaW5wdXQ6IHN0ZGluLCBvdXRwdXQ6IHN0ZG91dCB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBjb2RlID0gYXdhaXQgcmwucXVlc3Rpb24oY2hhbGsuY3lhbignRW50ZXIgVE9UUCBjb2RlIChvciBiYWNrdXAgY29kZSk6ICcpKTtcbiAgICAvLyBTdHJpcCB3aGl0ZXNwYWNlIGFuZCBkYXNoZXMg4oCUIHVzZXJzIG1heSB0eXBlIGJhY2t1cCBjb2RlcyBhcyBcIlhYWFgtWFhYWFwiXG4gICAgY29uc3QgdHJpbW1lZCA9IGNvZGUudHJpbSgpLnJlcGxhY2VBbGwoL1tcXHMtXS9nLCAnJyk7XG4gICAgaWYgKCF0cmltbWVkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTm8gY29uZmlybWF0aW9uIGNvZGUgcHJvdmlkZWQuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDIpO1xuICAgIH1cbiAgICAvLyBBY2NlcHQgNi1kaWdpdCBUT1RQIGNvZGVzIG9yIDgtY2hhciBhbHBoYW51bWVyaWMgYmFja3VwIGNvZGVzXG4gICAgaWYgKCEvXlxcZHs2fSQvLnRlc3QodHJpbW1lZCkgJiYgIS9eWzAtOUEtWmEtel17OH0kLy50ZXN0KHRyaW1tZWQpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnSW52YWxpZCBjb2RlIGZvcm1hdC4gRW50ZXIgYSA2LWRpZ2l0IFRPVFAgY29kZSBvciBhbiA4LWNoYXJhY3RlciBiYWNrdXAgY29kZS4nKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoMik7XG4gICAgfVxuICAgIHJldHVybiB0cmltbWVkO1xuICB9IGZpbmFsbHkge1xuICAgIHJsLmNsb3NlKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaGFyZWQgcm90YXRpb24gbG9naWMgZm9yIGJvdGggYHJvdGF0ZWAgYW5kIGByZXZva2VgIGNvbW1hbmRzLlxuICogSW5pdGlhbGl6ZXMgdGhlIHN0b3JlLCBjaGVja3MgVE9UUCBlbnJvbGxtZW50LCBvYnRhaW5zIHRoZSBjb25maXJtYXRpb25cbiAqIGNvZGUgKGZyb20gLS1jb2RlIGZsYWcgb3IgaW50ZXJhY3RpdmUgcHJvbXB0KSwgYW5kIGNhbGxzIHJvdGF0ZVByaW1hcnkuXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbiAtICdyb3RhdGlvbicgb3IgJ3Jldm9jYXRpb24nIGZvciB1c2VyLWZhY2luZyBtZXNzYWdlc1xuICovXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlUm90YXRpb24oXG4gIG9wdGlvbnM6IHsganNvbj86IGJvb2xlYW47IGNvZGU/OiBzdHJpbmcgfSxcbiAgb3BlcmF0aW9uOiAncm90YXRpb24nIHwgJ3Jldm9jYXRpb24nLFxuKTogUHJvbWlzZTxSb3RhdGlvblJlc3VsdD4ge1xuICBjb25zdCBmaWxlUGF0aCA9IHJlc29sdmVUb2tlbkZpbGVQYXRoKCk7XG4gIGNvbnN0IHN0b3JlID0gbmV3IENvbnNvbGVUb2tlblN0b3JlKGZpbGVQYXRoKTtcbiAgYXdhaXQgc3RvcmUuZW5zdXJlSW5pdGlhbGl6ZWQoJ0NMSScpO1xuXG4gIGlmICghc3RvcmUuaXNUb3RwRW5yb2xsZWQoKSkge1xuICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6ICdUT1RQIGVucm9sbG1lbnQgcmVxdWlyZWQnLCBjb2RlOiAnVE9UUF9SRVFVSVJFRCcgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgVG9rZW4gJHtvcGVyYXRpb259IHJlcXVpcmVzIFRPVFAgZW5yb2xsbWVudC5gKSk7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLmdyYXkoJ0Vucm9sbCB2aWEgdGhlIFNlY3VyaXR5IHRhYiBvciB0aGUgVE9UUCBlbnJvbGxtZW50IEFQSS4nKSk7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgfVxuXG4gIGNvbnN0IGNvZGUgPSBvcHRpb25zLmNvZGUgfHwgYXdhaXQgcHJvbXB0VG90cENvZGUoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBzdG9yZS5yb3RhdGVQcmltYXJ5KGNvZGUpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgVG90cEVycm9yKSB7XG4gICAgICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IGVyci5tZXNzYWdlLCBjb2RlOiBlcnIuY29kZSB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChgJHtvcGVyYXRpb24uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBvcGVyYXRpb24uc2xpY2UoMSl9IGZhaWxlZDogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMik7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGBVbmV4cGVjdGVkIGVycm9yIGR1cmluZyAke29wZXJhdGlvbn06ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWApKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgYW5kIHByaW50IHRoZSByZXN1bHQgb2YgYSByb3RhdGlvbi9yZXZvY2F0aW9uIG9wZXJhdGlvbi5cbiAqIEhhbmRsZXMgYm90aCBKU09OIGFuZCBodW1hbi1yZWFkYWJsZSBvdXRwdXQgZm9yIHJvdGF0ZSBhbmQgcmV2b2tlLlxuICovXG5mdW5jdGlvbiBwcmludFJvdGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IFJvdGF0aW9uUmVzdWx0LFxuICBvcHRpb25zOiB7IGpzb24/OiBib29sZWFuIH0sXG4gIG9wZXJhdGlvbjogJ3JvdGF0aW9uJyB8ICdyZXZvY2F0aW9uJyxcbik6IHZvaWQge1xuICBpZiAob3B0aW9ucy5qc29uKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gb3BlcmF0aW9uID09PSAncm90YXRpb24nXG4gICAgICA/IHsgdG9rZW46IHJlc3VsdC50b2tlbiwgcm90YXRlZEF0OiByZXN1bHQucm90YXRlZEF0LCBncmFjZVVudGlsOiByZXN1bHQuZ3JhY2VVbnRpbCB9XG4gICAgICA6IHsgcmV2b2tlZDogdHJ1ZSwgbmV3VG9rZW46IHJlc3VsdC50b2tlbiwgcm90YXRlZEF0OiByZXN1bHQucm90YXRlZEF0IH07XG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0LCBudWxsLCAyKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc3VjY2Vzc01zZyA9IG9wZXJhdGlvbiA9PT0gJ3JvdGF0aW9uJ1xuICAgICAgPyAnVG9rZW4gcm90YXRlZCBzdWNjZXNzZnVsbHkuJ1xuICAgICAgOiAnVG9rZW4gcmV2b2tlZC4gQSBuZXcgdG9rZW4gaGFzIGJlZW4gaXNzdWVkLic7XG4gICAgY29uc3Qgc3RhdHVzTXNnID0gb3BlcmF0aW9uID09PSAncm90YXRpb24nXG4gICAgICA/IGBPbGQgdG9rZW4gdmFsaWQgdW50aWw6ICR7bmV3IERhdGUocmVzdWx0LmdyYWNlVW50aWwpLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgOiAnQWxsIHNlc3Npb25zIHVzaW5nIHRoZSBvbGQgdG9rZW4gd2lsbCBsb3NlIGFjY2VzcyBhZnRlciB0aGUgZ3JhY2Ugd2luZG93Lic7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oc3VjY2Vzc01zZykpO1xuICAgIGNvbnNvbGUubG9nKHJlc3VsdC50b2tlbik7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgUm90YXRlZCBhdDogJHtyZXN1bHQucm90YXRlZEF0fWApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KHN0YXR1c01zZykpO1xuICB9XG59XG5cbi8vIOKUgOKUgCBQcm9ncmFtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmQoKTtcblxucHJvZ3JhbVxuICAubmFtZSgnZG9sbGhvdXNlIGNvbnNvbGUgdG9rZW4nKVxuICAuZGVzY3JpcHRpb24oJ01hbmFnZSBjb25zb2xlIGF1dGhlbnRpY2F0aW9uIHRva2VucycpO1xuXG4vLyDilIDilIAgc2hvdyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxucHJvZ3JhbVxuICAuY29tbWFuZCgnc2hvdycpXG4gIC5kZXNjcmlwdGlvbignUHJpbnQgdGhlIGN1cnJlbnQgcHJpbWFyeSBjb25zb2xlIHRva2VuJylcbiAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCBhcyBKU09OIGZvciBzY3JpcHRlZCBjb25zdW1wdGlvbicpXG4gIC5vcHRpb24oJy0tbWFza2VkJywgJ1Nob3cgbWFza2VkIHRva2VuIGluc3RlYWQgb2YgZnVsbCB2YWx1ZScpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHsganNvbj86IGJvb2xlYW47IG1hc2tlZD86IGJvb2xlYW4gfSkgPT4ge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcmVzb2x2ZVRva2VuRmlsZVBhdGgoKTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEZpbGVPckV4aXQoZmlsZVBhdGgpO1xuICAgIGNvbnN0IHByaW1hcnkgPSBkYXRhLnRva2Vuc1swXTtcbiAgICBpZiAoIXByaW1hcnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdObyB0b2tlbnMgZm91bmQgaW4gdGhlIHRva2VuIGZpbGUuJykpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmpzb24pIHtcbiAgICAgIGNvbnN0IG91dHB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAgIGlkOiBwcmltYXJ5LmlkLFxuICAgICAgICBuYW1lOiBwcmltYXJ5Lm5hbWUsXG4gICAgICAgIGtpbmQ6IHByaW1hcnkua2luZCxcbiAgICAgICAgdG9rZW46IG9wdGlvbnMubWFza2VkID8gcHJpbWFyeS50b2tlbi5zbGljZSgwLCA4KSArICcuLi4nIDogcHJpbWFyeS50b2tlbixcbiAgICAgICAgc2NvcGVzOiBwcmltYXJ5LnNjb3BlcyxcbiAgICAgICAgY3JlYXRlZEF0OiBwcmltYXJ5LmNyZWF0ZWRBdCxcbiAgICAgICAgbGFzdFVzZWRBdDogcHJpbWFyeS5sYXN0VXNlZEF0LFxuICAgICAgICBjcmVhdGVkVmlhOiBwcmltYXJ5LmNyZWF0ZWRWaWEsXG4gICAgICAgIGZpbGVQYXRoLFxuICAgICAgICB0b3RwRW5yb2xsZWQ6IGRhdGEudG90cC5lbnJvbGxlZCxcbiAgICAgIH07XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShvdXRwdXQsIG51bGwsIDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdG9rZW5EaXNwbGF5ID0gb3B0aW9ucy5tYXNrZWRcbiAgICAgICAgPyBwcmltYXJ5LnRva2VuLnNsaWNlKDAsIDgpICsgY2hhbGsuZ3JheSgn4oCiJy5yZXBlYXQoNTYpKVxuICAgICAgICA6IHByaW1hcnkudG9rZW47XG4gICAgICBjb25zb2xlLmxvZyh0b2tlbkRpc3BsYXkpO1xuICAgIH1cbiAgfSk7XG5cbi8vIOKUgOKUgCByb3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3JvdGF0ZScpXG4gIC5kZXNjcmlwdGlvbignUm90YXRlIHRoZSBwcmltYXJ5IGNvbnNvbGUgdG9rZW4gKHJlcXVpcmVzIFRPVFAgY29uZmlybWF0aW9uKScpXG4gIC5vcHRpb24oJy0tanNvbicsICdPdXRwdXQgYXMgSlNPTiBmb3Igc2NyaXB0ZWQgY29uc3VtcHRpb24nKVxuICAub3B0aW9uKCctLWNvZGUgPGNvZGU+JywgJ1RPVFAgY29uZmlybWF0aW9uIGNvZGUgKHByb21wdHMgaWYgb21pdHRlZCknKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiB7IGpzb24/OiBib29sZWFuOyBjb2RlPzogc3RyaW5nIH0pID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlUm90YXRpb24ob3B0aW9ucywgJ3JvdGF0aW9uJyk7XG4gICAgcHJpbnRSb3RhdGlvblJlc3VsdChyZXN1bHQsIG9wdGlvbnMsICdyb3RhdGlvbicpO1xuICB9KTtcblxuLy8g4pSA4pSAIHJldm9rZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxucHJvZ3JhbVxuICAuY29tbWFuZCgncmV2b2tlJylcbiAgLmRlc2NyaXB0aW9uKCdSZXZva2UgYSB0b2tlbiDigJQgcm90YXRlcyB0aGUgcHJpbWFyeSB0byBpbnZhbGlkYXRlIHRoZSBjdXJyZW50IHZhbHVlJylcbiAgLm9wdGlvbignLS1qc29uJywgJ091dHB1dCBhcyBKU09OIGZvciBzY3JpcHRlZCBjb25zdW1wdGlvbicpXG4gIC5vcHRpb24oJy0tY29kZSA8Y29kZT4nLCAnVE9UUCBjb25maXJtYXRpb24gY29kZSAocHJvbXB0cyBpZiBvbWl0dGVkKScpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHsganNvbj86IGJvb2xlYW47IGNvZGU/OiBzdHJpbmcgfSkgPT4ge1xuICAgIC8vIEZvciBQaGFzZSAyIHdpdGggYSBzaW5nbGUgcHJpbWFyeSB0b2tlbiwgcmV2b2tlID09IHJvdGF0ZS5cbiAgICAvLyBXaGVuIG11bHRpLWRldmljZSB0b2tlbnMgbGFuZCwgLS1pZCA8dXVpZD4gcmVtb3ZlcyBhIHNwZWNpZmljXG4gICAgLy8gbm9uLXByaW1hcnkgdG9rZW4gZnJvbSB0aGUgc3RvcmUuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZVJvdGF0aW9uKG9wdGlvbnMsICdyZXZvY2F0aW9uJyk7XG4gICAgcHJpbnRSb3RhdGlvblJlc3VsdChyZXN1bHQsIG9wdGlvbnMsICdyZXZvY2F0aW9uJyk7XG4gIH0pO1xuXG5wcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG4iXX0=
|
|
@@ -191,6 +191,32 @@ export interface WizardConfig {
|
|
|
191
191
|
lastSeenVersion?: string;
|
|
192
192
|
skippedSections?: string[];
|
|
193
193
|
}
|
|
194
|
+
export type LicenseTier = 'agpl' | 'free-commercial' | 'paid-commercial';
|
|
195
|
+
export interface LicenseConfig {
|
|
196
|
+
tier: LicenseTier;
|
|
197
|
+
email?: string;
|
|
198
|
+
attestedAt?: string;
|
|
199
|
+
telemetryRequired?: boolean;
|
|
200
|
+
revenueScale?: string;
|
|
201
|
+
companyName?: string;
|
|
202
|
+
useCase?: string;
|
|
203
|
+
}
|
|
204
|
+
/** Branded type for validated port numbers (1024–65535). */
|
|
205
|
+
export type PortNumber = number & {
|
|
206
|
+
readonly __brand: 'PortNumber';
|
|
207
|
+
};
|
|
208
|
+
/** Validate and brand a port number. Returns undefined if invalid. */
|
|
209
|
+
export declare function validatePort(value: unknown): PortNumber | undefined;
|
|
210
|
+
export interface ConsoleConfig {
|
|
211
|
+
/**
|
|
212
|
+
* Web console port (1024–65535). Resolution hierarchy:
|
|
213
|
+
* 1. --port CLI flag (standalone --web mode only)
|
|
214
|
+
* 2. This config value (~/.dollhouse/config.yml → console.port)
|
|
215
|
+
* 3. DOLLHOUSE_WEB_CONSOLE_PORT env var
|
|
216
|
+
* 4. Default: 41715
|
|
217
|
+
*/
|
|
218
|
+
port: number;
|
|
219
|
+
}
|
|
194
220
|
export interface SourcePriorityConfigData {
|
|
195
221
|
order: string[];
|
|
196
222
|
stop_on_first: boolean;
|
|
@@ -208,6 +234,8 @@ export interface DollhouseConfig {
|
|
|
208
234
|
wizard: WizardConfig;
|
|
209
235
|
autoLoad: AutoLoadConfig;
|
|
210
236
|
retentionPolicy: RetentionPolicyConfig;
|
|
237
|
+
license: LicenseConfig;
|
|
238
|
+
console: ConsoleConfig;
|
|
211
239
|
source_priority?: SourcePriorityConfigData;
|
|
212
240
|
}
|
|
213
241
|
export interface ConfigUpdateResult {
|
|
@@ -228,6 +256,12 @@ export declare class ConfigManager {
|
|
|
228
256
|
private config;
|
|
229
257
|
private readonly fileOperations;
|
|
230
258
|
private os;
|
|
259
|
+
/**
|
|
260
|
+
* Extract console.port from raw YAML config content without full
|
|
261
|
+
* ConfigManager initialization. Uses FAILSAFE_SCHEMA for security
|
|
262
|
+
* (no code execution). Returns undefined if not found or invalid.
|
|
263
|
+
*/
|
|
264
|
+
static readPortFromYaml(yamlContent: string): number | undefined;
|
|
231
265
|
constructor(fileOperations: IFileOperationsService, osModule: typeof os);
|
|
232
266
|
/**
|
|
233
267
|
* Get default configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"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"}
|