@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.
Files changed (118) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/auto-dollhouse/portDiscovery.d.ts +23 -0
  3. package/dist/auto-dollhouse/portDiscovery.d.ts.map +1 -0
  4. package/dist/auto-dollhouse/portDiscovery.js +77 -0
  5. package/dist/cli/console-token.d.ts +18 -0
  6. package/dist/cli/console-token.d.ts.map +1 -0
  7. package/dist/cli/console-token.js +187 -0
  8. package/dist/config/ConfigManager.d.ts +34 -0
  9. package/dist/config/ConfigManager.d.ts.map +1 -1
  10. package/dist/config/ConfigManager.js +46 -1
  11. package/dist/config/env.d.ts +14 -0
  12. package/dist/config/env.d.ts.map +1 -1
  13. package/dist/config/env.js +72 -2
  14. package/dist/di/Container.d.ts +1 -0
  15. package/dist/di/Container.d.ts.map +1 -1
  16. package/dist/di/Container.js +38 -2
  17. package/dist/elements/agents/AgentManager.js +2 -2
  18. package/dist/generated/version.d.ts +2 -2
  19. package/dist/generated/version.d.ts.map +1 -1
  20. package/dist/generated/version.js +3 -3
  21. package/dist/handlers/mcp-aql/GatekeeperSession.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/GatekeeperSession.js +3 -2
  23. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  24. package/dist/handlers/mcp-aql/OperationSchema.js +3 -2
  25. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  26. package/dist/handlers/mcp-aql/policies/ToolClassification.js +8 -1
  27. package/dist/index.js +53 -3
  28. package/dist/security/InputNormalizer.d.ts +4 -6
  29. package/dist/security/InputNormalizer.d.ts.map +1 -1
  30. package/dist/security/InputNormalizer.js +10 -16
  31. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  32. package/dist/security/audit/config/suppressions.js +26 -1
  33. package/dist/security/constants.d.ts +7 -0
  34. package/dist/security/constants.d.ts.map +1 -1
  35. package/dist/security/constants.js +10 -1
  36. package/dist/security/contentValidator.d.ts.map +1 -1
  37. package/dist/security/contentValidator.js +14 -6
  38. package/dist/security/encryption/PatternEncryptor.d.ts.map +1 -1
  39. package/dist/security/encryption/PatternEncryptor.js +18 -10
  40. package/dist/security/securityMonitor.d.ts +1 -1
  41. package/dist/security/securityMonitor.d.ts.map +1 -1
  42. package/dist/security/securityMonitor.js +1 -1
  43. package/dist/security/tokenManager.d.ts +18 -2
  44. package/dist/security/tokenManager.d.ts.map +1 -1
  45. package/dist/security/tokenManager.js +47 -15
  46. package/dist/security/validators/unicodeValidator.d.ts +4 -5
  47. package/dist/security/validators/unicodeValidator.d.ts.map +1 -1
  48. package/dist/security/validators/unicodeValidator.js +19 -20
  49. package/dist/services/VerificationNotifier.d.ts.map +1 -1
  50. package/dist/services/VerificationNotifier.js +15 -13
  51. package/dist/services/validation/GenericElementValidator.js +5 -5
  52. package/dist/web/console/IngestRoutes.d.ts +14 -2
  53. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  54. package/dist/web/console/IngestRoutes.js +69 -5
  55. package/dist/web/console/LeaderElection.d.ts +35 -3
  56. package/dist/web/console/LeaderElection.d.ts.map +1 -1
  57. package/dist/web/console/LeaderElection.js +66 -6
  58. package/dist/web/console/LeaderForwardingSink.d.ts +15 -3
  59. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
  60. package/dist/web/console/LeaderForwardingSink.js +32 -7
  61. package/dist/web/console/SessionNames.d.ts +7 -0
  62. package/dist/web/console/SessionNames.d.ts.map +1 -1
  63. package/dist/web/console/SessionNames.js +10 -1
  64. package/dist/web/console/UnifiedConsole.d.ts +26 -1
  65. package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
  66. package/dist/web/console/UnifiedConsole.js +104 -14
  67. package/dist/web/console/consoleToken.d.ts +403 -0
  68. package/dist/web/console/consoleToken.d.ts.map +1 -0
  69. package/dist/web/console/consoleToken.js +930 -0
  70. package/dist/web/middleware/authMiddleware.d.ts +64 -0
  71. package/dist/web/middleware/authMiddleware.d.ts.map +1 -0
  72. package/dist/web/middleware/authMiddleware.js +174 -0
  73. package/dist/web/portDiscovery.d.ts +4 -3
  74. package/dist/web/portDiscovery.d.ts.map +1 -1
  75. package/dist/web/portDiscovery.js +7 -5
  76. package/dist/web/public/app.js +35 -18
  77. package/dist/web/public/consoleAuth.js +152 -0
  78. package/dist/web/public/index.html +243 -9
  79. package/dist/web/public/logs.js +1 -1
  80. package/dist/web/public/metrics.js +3 -3
  81. package/dist/web/public/permissions.js +1 -1
  82. package/dist/web/public/security.css +396 -0
  83. package/dist/web/public/security.js +393 -0
  84. package/dist/web/public/sessions.css +54 -4
  85. package/dist/web/public/sessions.js +46 -6
  86. package/dist/web/public/setup.css +439 -0
  87. package/dist/web/public/setup.js +490 -18
  88. package/dist/web/public/styles.css +10 -0
  89. package/dist/web/routes/consoleRouteHelpers.d.ts +33 -0
  90. package/dist/web/routes/consoleRouteHelpers.d.ts.map +1 -0
  91. package/dist/web/routes/consoleRouteHelpers.js +60 -0
  92. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  93. package/dist/web/routes/permissionRoutes.js +8 -3
  94. package/dist/web/routes/setupRoutes.d.ts +4 -0
  95. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  96. package/dist/web/routes/setupRoutes.js +418 -7
  97. package/dist/web/routes/tokenRoutes.d.ts +37 -0
  98. package/dist/web/routes/tokenRoutes.d.ts.map +1 -0
  99. package/dist/web/routes/tokenRoutes.js +95 -0
  100. package/dist/web/routes/totpRoutes.d.ts +45 -0
  101. package/dist/web/routes/totpRoutes.d.ts.map +1 -0
  102. package/dist/web/routes/totpRoutes.js +187 -0
  103. package/dist/web/routes.d.ts.map +1 -1
  104. package/dist/web/routes.js +9 -5
  105. package/dist/web/server.d.ts +13 -2
  106. package/dist/web/server.d.ts.map +1 -1
  107. package/dist/web/server.js +202 -56
  108. package/package.json +11 -2
  109. package/server.json +2 -2
  110. package/dist/constants/version.d.ts +0 -3
  111. package/dist/constants/version.d.ts.map +0 -1
  112. package/dist/constants/version.js +0 -4
  113. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  114. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  115. package/dist/logging/sinks/SSELogSink.js +0 -181
  116. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  117. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  118. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc29sZS10b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvY29uc29sZS10b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULGtCQUFrQixHQUduQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV2Qyx1REFBdUQ7QUFDdkQsU0FBUyxvQkFBb0I7SUFDM0IsT0FBTyxHQUFHLENBQUMsNEJBQTRCLElBQUksa0JBQWtCLENBQUM7QUFDaEUsQ0FBQztBQUVELDBDQUEwQztBQUMxQyxLQUFLLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzVDLE1BQU0sSUFBSSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDekUsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlFQUFpRSxDQUFDLENBQUMsQ0FBQztRQUM3RixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxnREFBZ0Q7QUFDaEQsS0FB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LENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbi8qKlxuICogQ0xJIGNvbW1hbmRzIGZvciBjb25zb2xlIHRva2VuIG1hbmFnZW1lbnQgKCMxNzkwKS5cbiAqXG4gKiBVc2FnZTpcbiAqICAgZG9sbGhvdXNlIGNvbnNvbGUgdG9rZW4gc2hvdyBbLS1qc29uXVxuICogICBkb2xsaG91c2UgY29uc29sZSB0b2tlbiByb3RhdGUgWy0tanNvbl1cbiAqICAgZG9sbGhvdXNlIGNvbnNvbGUgdG9rZW4gcmV2b2tlIFstLWlkIDx1dWlkPl0gWy0tanNvbl1cbiAqXG4gKiBFeGl0IGNvZGVzOlxuICogICAwIOKAlCBzdWNjZXNzXG4gKiAgIDEg4oCUIHVzZXIgZXJyb3IgKG1pc3NpbmcgZmlsZSwgaW52YWxpZCBhcmdzKVxuICogICAyIOKAlCBhdXRoL2NvbmZpcm1hdGlvbiBmYWlsdXJlICh3cm9uZyBUT1RQIGNvZGUsIG5vdCBlbnJvbGxlZClcbiAqXG4gKiBAc2luY2UgdjIuMS4wIOKAlCBJc3N1ZSAjMTc5MFxuICovXG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gJ25vZGU6cmVhZGxpbmUvcHJvbWlzZXMnO1xuaW1wb3J0IHsgc3RkaW4sIHN0ZG91dCB9IGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5pbXBvcnQge1xuICBDb25zb2xlVG9rZW5TdG9yZSxcbiAgcmVhZFRva2VuRmlsZVJhdyxcbiAgVG90cEVycm9yLFxuICBERUZBVUxUX1RPS0VOX0ZJTEUsXG4gIHR5cGUgQ29uc29sZVRva2VuRmlsZSxcbiAgdHlwZSBSb3RhdGlvblJlc3VsdCxcbn0gZnJvbSAnLi4vd2ViL2NvbnNvbGUvY29uc29sZVRva2VuLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uL2NvbmZpZy9lbnYuanMnO1xuXG4vKiogUmVzb2x2ZSB0aGUgdG9rZW4gZmlsZSBwYXRoIGZyb20gZW52IG9yIGRlZmF1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlVG9rZW5GaWxlUGF0aCgpOiBzdHJpbmcge1xuICByZXR1cm4gZW52LkRPTExIT1VTRV9DT05TT0xFX1RPS0VOX0ZJTEUgfHwgREVGQVVMVF9UT0tFTl9GSUxFO1xufVxuXG4vKiogUmVhZCB0b2tlbiBmaWxlIG9yIGV4aXQgd2l0aCBlcnJvci4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRGaWxlT3JFeGl0KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPENvbnNvbGVUb2tlbkZpbGU+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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"}