@dollhousemcp/mcp-server 2.0.10 → 2.0.11
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/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/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -5
- 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/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/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/package.json +1 -1
- 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
|
@@ -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=
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export declare const PACKAGE_VERSION = "2.0.
|
|
6
|
-
export declare const BUILD_TIMESTAMP = "2026-04-
|
|
5
|
+
export declare const PACKAGE_VERSION = "2.0.11";
|
|
6
|
+
export declare const BUILD_TIMESTAMP = "2026-04-08T17:34:09.248Z";
|
|
7
7
|
export declare const BUILD_TYPE: 'npm' | 'git';
|
|
8
8
|
export declare const PACKAGE_NAME = "@dollhousemcp/mcp-server";
|
|
9
9
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Auto-generated file - DO NOT EDIT
|
|
3
3
|
* Generated at build time by scripts/generate-version.js
|
|
4
4
|
*/
|
|
5
|
-
export const PACKAGE_VERSION = '2.0.
|
|
6
|
-
export const BUILD_TIMESTAMP = '2026-04-
|
|
5
|
+
export const PACKAGE_VERSION = '2.0.11';
|
|
6
|
+
export const BUILD_TIMESTAMP = '2026-04-08T17:34:09.248Z';
|
|
7
7
|
export const BUILD_TYPE = 'npm';
|
|
8
8
|
export const PACKAGE_NAME = '@dollhousemcp/mcp-server';
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9nZW5lcmF0ZWQvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRywwQkFBMEIsQ0FBQztBQUMxRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQztBQUMvQyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGZpbGUgLSBETyBOT1QgRURJVFxuICogR2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUgYnkgc2NyaXB0cy9nZW5lcmF0ZS12ZXJzaW9uLmpzXG4gKi9cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9ICcyLjAuMTEnO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RJTUVTVEFNUCA9ICcyMDI2LTA0LTA4VDE3OjM0OjA5LjI0OFonO1xuZXhwb3J0IGNvbnN0IEJVSUxEX1RZUEU6ICducG0nIHwgJ2dpdCcgPSAnbnBtJztcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSAnQGRvbGxob3VzZW1jcC9tY3Atc2VydmVyJztcbiJdfQ==
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|