@dollhousemcp/mcp-server 2.0.1 → 2.0.3
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 +26 -0
- package/README.github.md +8 -33
- package/README.md +10 -8
- package/README.md.backup +10 -8
- package/README.npm.md +10 -8
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -6
- package/dist/persona/PersonaManager.d.ts.map +1 -1
- package/dist/persona/PersonaManager.js +1 -2
- package/dist/security/audit/config/suppressions.d.ts.map +1 -1
- package/dist/security/audit/config/suppressions.js +6 -1
- package/dist/security/commandValidator.d.ts.map +1 -1
- package/dist/security/commandValidator.js +15 -3
- package/dist/utils/git.d.ts +0 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +2 -5
- package/dist/web/public/app.js +29 -10
- package/dist/web/public/setup.js +752 -0
- package/dist/web/routes/setupRoutes.d.ts +18 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -0
- package/dist/web/routes/setupRoutes.js +360 -0
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +7 -5
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +11 -1
- package/package.json +4 -3
- package/server.json +2 -2
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup Routes — Auto-install DollhouseMCP to MCP clients
|
|
3
|
+
*
|
|
4
|
+
* Uses `install-mcp` (https://github.com/supermemoryai/install-mcp)
|
|
5
|
+
* to inject server configuration into supported MCP client config files.
|
|
6
|
+
*
|
|
7
|
+
* Security: localhost-only binding (enforced by server.ts), rate-limited,
|
|
8
|
+
* and command arguments are hardcoded — no user-supplied shell input.
|
|
9
|
+
*/
|
|
10
|
+
import type { Request, Response } from 'express';
|
|
11
|
+
export declare function createSetupRoutes(): {
|
|
12
|
+
installHandler: (req: Request, res: Response) => Promise<void>;
|
|
13
|
+
openConfigHandler: (req: Request, res: Response) => Promise<void>;
|
|
14
|
+
versionHandler: (req: Request, res: Response) => Promise<void>;
|
|
15
|
+
mcpbRedirectHandler: (req: Request, res: Response) => Promise<void>;
|
|
16
|
+
detectHandler: (req: Request, res: Response) => Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=setupRoutes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/setupRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA4LjD,wBAAgB,iBAAiB,IAAI;IACnC,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,iBAAiB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,cAAc,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,mBAAmB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,aAAa,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D,CA0JA"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Setup Routes — Auto-install DollhouseMCP to MCP clients
|
|
3
|
+
*
|
|
4
|
+
* Uses `install-mcp` (https://github.com/supermemoryai/install-mcp)
|
|
5
|
+
* to inject server configuration into supported MCP client config files.
|
|
6
|
+
*
|
|
7
|
+
* Security: localhost-only binding (enforced by server.ts), rate-limited,
|
|
8
|
+
* and command arguments are hardcoded — no user-supplied shell input.
|
|
9
|
+
*/
|
|
10
|
+
import { execFile } from 'node:child_process';
|
|
11
|
+
import { accessSync, constants as fsConstants } from 'node:fs';
|
|
12
|
+
import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { join, dirname } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { homedir, platform } from 'node:os';
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
import { logger } from '../../utils/logger.js';
|
|
19
|
+
import { UnicodeValidator } from '../../security/validators/unicodeValidator.js';
|
|
20
|
+
import { PACKAGE_VERSION } from '../../generated/version.js';
|
|
21
|
+
const GITHUB_REPO = 'DollhouseMCP/mcp-server';
|
|
22
|
+
const MCPB_ASSET_PATTERN = /^dollhousemcp-.*\.mcpb$/;
|
|
23
|
+
import { SlidingWindowRateLimiter } from '../../utils/SlidingWindowRateLimiter.js';
|
|
24
|
+
/** Allowed client identifiers — must match install-mcp's --client values */
|
|
25
|
+
const ALLOWED_CLIENTS = new Set([
|
|
26
|
+
'claude',
|
|
27
|
+
'claude-code',
|
|
28
|
+
'cursor',
|
|
29
|
+
'vscode',
|
|
30
|
+
'cline',
|
|
31
|
+
'roo-cline',
|
|
32
|
+
'windsurf',
|
|
33
|
+
'witsy',
|
|
34
|
+
'enconvo',
|
|
35
|
+
'gemini-cli',
|
|
36
|
+
'goose',
|
|
37
|
+
'zed',
|
|
38
|
+
'warp',
|
|
39
|
+
'codex',
|
|
40
|
+
]);
|
|
41
|
+
/** Rate limit: 5 installs per minute */
|
|
42
|
+
const installLimiter = new SlidingWindowRateLimiter(5, 60_000);
|
|
43
|
+
/**
|
|
44
|
+
* Known config file paths per client.
|
|
45
|
+
* Returns the absolute path for the current platform.
|
|
46
|
+
*/
|
|
47
|
+
function getConfigPath(client) {
|
|
48
|
+
const home = homedir();
|
|
49
|
+
const plat = platform();
|
|
50
|
+
const paths = {
|
|
51
|
+
'claude': () => {
|
|
52
|
+
if (plat === 'darwin')
|
|
53
|
+
return join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
54
|
+
if (plat === 'win32')
|
|
55
|
+
return join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'Claude', 'claude_desktop_config.json');
|
|
56
|
+
return join(home, '.config', 'Claude', 'claude_desktop_config.json');
|
|
57
|
+
},
|
|
58
|
+
'claude-code': () => join(home, '.claude.json'),
|
|
59
|
+
'cursor': () => join(home, '.cursor', 'mcp.json'),
|
|
60
|
+
'windsurf': () => join(home, '.codeium', 'windsurf', 'mcp_config.json'),
|
|
61
|
+
'lmstudio': () => join(home, '.lmstudio', 'mcp.json'),
|
|
62
|
+
'gemini-cli': () => join(home, '.gemini', 'settings.json'),
|
|
63
|
+
'codex': () => join(home, '.codex', 'config.toml'),
|
|
64
|
+
};
|
|
65
|
+
const resolver = paths[client];
|
|
66
|
+
return resolver ? resolver() : null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Open a file in the system's default text editor.
|
|
70
|
+
*/
|
|
71
|
+
function openInEditor(filePath) {
|
|
72
|
+
return new Promise((resolve, reject) => {
|
|
73
|
+
const plat = platform();
|
|
74
|
+
let cmd;
|
|
75
|
+
let args;
|
|
76
|
+
if (plat === 'darwin') {
|
|
77
|
+
cmd = 'open';
|
|
78
|
+
args = ['-t', filePath];
|
|
79
|
+
}
|
|
80
|
+
else if (plat === 'win32') {
|
|
81
|
+
cmd = 'notepad';
|
|
82
|
+
args = [filePath];
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
cmd = 'xdg-open';
|
|
86
|
+
args = [filePath];
|
|
87
|
+
}
|
|
88
|
+
execFile(cmd, args, { timeout: 10_000 }, (err) => {
|
|
89
|
+
if (err) {
|
|
90
|
+
reject(new Error(`Could not open editor: ${err.message}`));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
resolve('Opened in editor.');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/** Clients whose config files we can locate and open */
|
|
98
|
+
const OPENABLE_CLIENTS = new Set([
|
|
99
|
+
'claude', 'claude-code', 'cursor', 'windsurf', 'lmstudio', 'gemini-cli', 'codex',
|
|
100
|
+
]);
|
|
101
|
+
/** Parse a TOML config file for a DollhouseMCP server entry */
|
|
102
|
+
function parseTomlConfig(raw) {
|
|
103
|
+
if (!raw.toLowerCase().includes('dollhousemcp')) {
|
|
104
|
+
return { installed: false };
|
|
105
|
+
}
|
|
106
|
+
const tomlConfig = {};
|
|
107
|
+
const sectionMatch = /\[mcp_servers\.([^\]]*dollhousemcp[^\]]*)\]/i.exec(raw);
|
|
108
|
+
if (!sectionMatch)
|
|
109
|
+
return { installed: true, currentConfig: tomlConfig, serverKey: 'mcp_servers' };
|
|
110
|
+
tomlConfig.serverName = sectionMatch[1];
|
|
111
|
+
const sectionStart = sectionMatch.index + sectionMatch[0].length;
|
|
112
|
+
const nextSection = raw.indexOf('\n[', sectionStart);
|
|
113
|
+
const sectionContent = nextSection > -1 ? raw.slice(sectionStart, nextSection) : raw.slice(sectionStart);
|
|
114
|
+
const commandMatch = /command\s*=\s*"([^"]+)"/.exec(sectionContent);
|
|
115
|
+
const argsMatch = /args\s*=\s*\[([^\]]*)\]/.exec(sectionContent);
|
|
116
|
+
if (commandMatch)
|
|
117
|
+
tomlConfig.command = commandMatch[1];
|
|
118
|
+
if (argsMatch) {
|
|
119
|
+
tomlConfig.args = argsMatch[1].split(',').map(s => s.trim().replaceAll('"', ''));
|
|
120
|
+
}
|
|
121
|
+
return { installed: true, currentConfig: tomlConfig, serverKey: 'mcp_servers' };
|
|
122
|
+
}
|
|
123
|
+
/** Parse a JSON config file for a DollhouseMCP server entry */
|
|
124
|
+
function parseJsonConfig(raw) {
|
|
125
|
+
const parsed = JSON.parse(raw);
|
|
126
|
+
for (const key of ['mcpServers', 'servers']) {
|
|
127
|
+
if (parsed[key]?.dollhousemcp) {
|
|
128
|
+
return { installed: true, currentConfig: parsed[key].dollhousemcp, serverKey: key };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return { installed: false };
|
|
132
|
+
}
|
|
133
|
+
/** Check a single client config file for an existing DollhouseMCP entry */
|
|
134
|
+
async function detectClient(client) {
|
|
135
|
+
const configPath = getConfigPath(client);
|
|
136
|
+
if (!configPath)
|
|
137
|
+
return null;
|
|
138
|
+
try {
|
|
139
|
+
await access(configPath);
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return { installed: false, configPath };
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
const raw = await readFile(configPath, 'utf-8');
|
|
146
|
+
const result = configPath.endsWith('.toml') ? parseTomlConfig(raw) : parseJsonConfig(raw);
|
|
147
|
+
return { configPath, ...result };
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return { installed: false, configPath };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Validate and normalize a client name from request body.
|
|
155
|
+
* Returns the normalized client name or null (with error response sent).
|
|
156
|
+
*/
|
|
157
|
+
function validateClient(req, res, allowedSet) {
|
|
158
|
+
const { client } = req.body;
|
|
159
|
+
if (!client || typeof client !== 'string') {
|
|
160
|
+
res.status(400).json({ error: 'Missing required field: client' });
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const normalized = UnicodeValidator.normalize(client).normalizedContent.toLowerCase().trim();
|
|
164
|
+
if (!allowedSet.has(normalized)) {
|
|
165
|
+
res.status(400).json({
|
|
166
|
+
error: `Unsupported client: ${client}`,
|
|
167
|
+
supported: Array.from(allowedSet),
|
|
168
|
+
});
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
return normalized;
|
|
172
|
+
}
|
|
173
|
+
export function createSetupRoutes() {
|
|
174
|
+
// ── Detect existing installations ───────────────────────────────────
|
|
175
|
+
const detectHandler = async (_req, res) => {
|
|
176
|
+
const clients = [
|
|
177
|
+
{ id: 'claude', name: 'Claude Desktop' },
|
|
178
|
+
{ id: 'claude-code', name: 'Claude Code' },
|
|
179
|
+
{ id: 'cursor', name: 'Cursor' },
|
|
180
|
+
{ id: 'windsurf', name: 'Windsurf' },
|
|
181
|
+
{ id: 'lmstudio', name: 'LM Studio' },
|
|
182
|
+
{ id: 'gemini-cli', name: 'Gemini CLI' },
|
|
183
|
+
{ id: 'codex', name: 'Codex' },
|
|
184
|
+
];
|
|
185
|
+
const results = {};
|
|
186
|
+
await Promise.all(clients.map(async ({ id, name }) => {
|
|
187
|
+
const detection = await detectClient(id);
|
|
188
|
+
if (detection) {
|
|
189
|
+
results[id] = { name, ...detection };
|
|
190
|
+
}
|
|
191
|
+
}));
|
|
192
|
+
res.json(results);
|
|
193
|
+
};
|
|
194
|
+
// ── Open config file in editor ──────────────────────────────────────
|
|
195
|
+
const openConfigHandler = async (req, res) => {
|
|
196
|
+
const normalizedClient = validateClient(req, res, OPENABLE_CLIENTS);
|
|
197
|
+
if (!normalizedClient)
|
|
198
|
+
return;
|
|
199
|
+
const configPath = getConfigPath(normalizedClient);
|
|
200
|
+
if (!configPath) {
|
|
201
|
+
res.status(400).json({ error: `Config path unknown for: ${normalizedClient}` });
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Create the file with empty content if it doesn't exist yet
|
|
205
|
+
try {
|
|
206
|
+
await access(configPath);
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
try {
|
|
210
|
+
await mkdir(dirname(configPath), { recursive: true });
|
|
211
|
+
const content = configPath.endsWith('.toml') ? '' : '{}';
|
|
212
|
+
await writeFile(configPath, content + '\n', 'utf-8');
|
|
213
|
+
logger.info(`[Setup] Created empty config: ${configPath}`);
|
|
214
|
+
}
|
|
215
|
+
catch (mkErr) {
|
|
216
|
+
const msg = mkErr instanceof Error ? mkErr.message : String(mkErr);
|
|
217
|
+
res.status(500).json({ error: `Could not create config file: ${msg}` });
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
logger.info(`[Setup] Opening config for ${normalizedClient}: ${configPath}`);
|
|
222
|
+
try {
|
|
223
|
+
await openInEditor(configPath);
|
|
224
|
+
res.json({ success: true, path: configPath });
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
228
|
+
res.status(500).json({ success: false, error: message, path: configPath });
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
// ── Auto-install via install-mcp ────────────────────────────────────
|
|
232
|
+
const installHandler = async (req, res) => {
|
|
233
|
+
if (!installLimiter.tryAcquire()) {
|
|
234
|
+
res.status(429).json({ error: 'Too many install requests. Try again in a minute.' });
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const normalizedClient = validateClient(req, res, ALLOWED_CLIENTS);
|
|
238
|
+
if (!normalizedClient)
|
|
239
|
+
return;
|
|
240
|
+
// Validate version if provided — must be semver-like (no shell injection)
|
|
241
|
+
const { version } = req.body;
|
|
242
|
+
const normalizedVersion = version ? UnicodeValidator.normalize(version).normalizedContent : undefined;
|
|
243
|
+
if (normalizedVersion && !/^\d+\.\d+\.\d+/.test(normalizedVersion)) {
|
|
244
|
+
res.status(400).json({ error: 'Invalid version format. Expected semver (e.g., 2.0.2)' });
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
const tag = normalizedVersion ? `@${normalizedVersion}` : '@latest';
|
|
248
|
+
logger.info(`[Setup] Installing DollhouseMCP${tag} to client: ${normalizedClient}`);
|
|
249
|
+
try {
|
|
250
|
+
const output = await runInstallMcp(normalizedClient, normalizedVersion);
|
|
251
|
+
logger.info(`[Setup] Successfully installed to ${normalizedClient}`);
|
|
252
|
+
res.json({ success: true, output, client: normalizedClient, version: normalizedVersion || 'latest' });
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
256
|
+
logger.warn(`[Setup] Install failed for ${normalizedClient}: ${message}`);
|
|
257
|
+
res.status(500).json({ success: false, error: message, client: normalizedClient });
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
// ── Version info ─────────────────────────────────────────────────────
|
|
261
|
+
const versionHandler = async (_req, res) => {
|
|
262
|
+
const local = {
|
|
263
|
+
version: PACKAGE_VERSION,
|
|
264
|
+
mcpbUrl: `https://github.com/${GITHUB_REPO}/releases/download/v${PACKAGE_VERSION}/dollhousemcp-${PACKAGE_VERSION}.mcpb`,
|
|
265
|
+
};
|
|
266
|
+
// Query GitHub for the actual latest release
|
|
267
|
+
let latest = local;
|
|
268
|
+
try {
|
|
269
|
+
const ghRes = await fetch(`https://api.github.com/repos/${GITHUB_REPO}/releases/latest`, {
|
|
270
|
+
headers: { 'Accept': 'application/vnd.github+json', 'User-Agent': 'DollhouseMCP-Setup' },
|
|
271
|
+
signal: AbortSignal.timeout(5000),
|
|
272
|
+
});
|
|
273
|
+
if (ghRes.ok) {
|
|
274
|
+
const release = await ghRes.json();
|
|
275
|
+
const mcpbAsset = release.assets.find(a => MCPB_ASSET_PATTERN.test(a.name));
|
|
276
|
+
latest = {
|
|
277
|
+
version: release.tag_name.replace(/^v/, ''),
|
|
278
|
+
mcpbUrl: mcpbAsset?.browser_download_url ||
|
|
279
|
+
`https://github.com/${GITHUB_REPO}/releases/download/${release.tag_name}/dollhousemcp-${release.tag_name.replace(/^v/, '')}.mcpb`,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// GitHub unreachable — use local version info
|
|
285
|
+
}
|
|
286
|
+
res.json({
|
|
287
|
+
running: local,
|
|
288
|
+
latest,
|
|
289
|
+
isLatest: local.version === latest.version,
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
// ── .mcpb download redirect ─────────────────────────────────────────
|
|
293
|
+
const mcpbRedirectHandler = async (_req, res) => {
|
|
294
|
+
// Try GitHub API for the actual latest .mcpb asset URL
|
|
295
|
+
try {
|
|
296
|
+
const ghRes = await fetch(`https://api.github.com/repos/${GITHUB_REPO}/releases/latest`, {
|
|
297
|
+
headers: { 'Accept': 'application/vnd.github+json', 'User-Agent': 'DollhouseMCP-Setup' },
|
|
298
|
+
signal: AbortSignal.timeout(5000),
|
|
299
|
+
});
|
|
300
|
+
if (ghRes.ok) {
|
|
301
|
+
const release = await ghRes.json();
|
|
302
|
+
const mcpbAsset = release.assets.find(a => MCPB_ASSET_PATTERN.test(a.name));
|
|
303
|
+
if (mcpbAsset) {
|
|
304
|
+
res.redirect(mcpbAsset.browser_download_url);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// Fall through to constructed URL
|
|
311
|
+
}
|
|
312
|
+
// Fallback: construct URL from running version
|
|
313
|
+
const url = `https://github.com/${GITHUB_REPO}/releases/download/v${PACKAGE_VERSION}/dollhousemcp-${PACKAGE_VERSION}.mcpb`;
|
|
314
|
+
res.redirect(url);
|
|
315
|
+
};
|
|
316
|
+
return { installHandler, openConfigHandler, versionHandler, mcpbRedirectHandler, detectHandler };
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Resolve the install-mcp binary path.
|
|
320
|
+
* Uses the local dependency (node_modules/.bin/install-mcp) first,
|
|
321
|
+
* falls back to npx if not found.
|
|
322
|
+
*/
|
|
323
|
+
function resolveInstallMcpBin() {
|
|
324
|
+
const localBin = join(dirname(dirname(dirname(__dirname))), 'node_modules', '.bin', 'install-mcp');
|
|
325
|
+
try {
|
|
326
|
+
accessSync(localBin, fsConstants.X_OK);
|
|
327
|
+
return { cmd: localBin, prefixArgs: [] };
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return { cmd: 'npx', prefixArgs: ['install-mcp'] };
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Run install-mcp to configure a specific MCP client.
|
|
335
|
+
*
|
|
336
|
+
* Uses the bundled install-mcp dependency (MIT, https://github.com/supermemoryai/install-mcp).
|
|
337
|
+
* Command arguments are fully hardcoded — no user input reaches the shell.
|
|
338
|
+
* execFile is used (not exec) to prevent shell injection.
|
|
339
|
+
*/
|
|
340
|
+
function runInstallMcp(client, version) {
|
|
341
|
+
return new Promise((resolve, reject) => {
|
|
342
|
+
const { cmd, prefixArgs } = resolveInstallMcpBin();
|
|
343
|
+
const tag = version ? `@${version}` : '@latest';
|
|
344
|
+
const args = [
|
|
345
|
+
...prefixArgs,
|
|
346
|
+
`@dollhousemcp/mcp-server${tag}`,
|
|
347
|
+
'--client', client,
|
|
348
|
+
'--name', 'dollhousemcp',
|
|
349
|
+
'--yes',
|
|
350
|
+
];
|
|
351
|
+
execFile(cmd, args, { timeout: 30_000 }, (err, stdout, stderr) => {
|
|
352
|
+
if (err) {
|
|
353
|
+
reject(new Error(stderr || err.message));
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
resolve(stdout || 'Installation completed.');
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0dXBSb3V0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL3JvdXRlcy9zZXR1cFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUdILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsSUFBSSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFNUMsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFN0QsTUFBTSxXQUFXLEdBQUcseUJBQXlCLENBQUM7QUFDOUMsTUFBTSxrQkFBa0IsR0FBRyx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuRiw0RUFBNEU7QUFDNUUsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDOUIsUUFBUTtJQUNSLGFBQWE7SUFDYixRQUFR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QyxDQUFDLENBQUM7Z0JBQ3pDLE9BQU87WUFDVCxDQUFDO1lBQ0QsT0FBTyxDQUFDLE1BQU0sSUFBSSx5QkFBeUIsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXR1cCBSb3V0ZXMg4oCUIEF1dG8taW5zdGFsbCBEb2xsaG91c2VNQ1AgdG8gTUNQIGNsaWVudHNcbiAqXG4gKiBVc2VzIGBpbnN0YWxsLW1jcGAgKGh0dHBzOi8vZ2l0aHViLmNvbS9zdXBlcm1lbW9yeWFpL2luc3RhbGwtbWNwKVxuICogdG8gaW5qZWN0IHNlcnZlciBjb25maWd1cmF0aW9uIGludG8gc3VwcG9ydGVkIE1DUCBjbGllbnQgY29uZmlnIGZpbGVzLlxuICpcbiAqIFNlY3VyaXR5OiBsb2NhbGhvc3Qtb25seSBiaW5kaW5nIChlbmZvcmNlZCBieSBzZXJ2ZXIudHMpLCByYXRlLWxpbWl0ZWQsXG4gKiBhbmQgY29tbWFuZCBhcmd1bWVudHMgYXJlIGhhcmRjb2RlZCDigJQgbm8gdXNlci1zdXBwbGllZCBzaGVsbCBpbnB1dC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBhY2Nlc3NTeW5jLCBjb25zdGFudHMgYXMgZnNDb25zdGFudHMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGFjY2VzcywgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGhvbWVkaXIsIHBsYXRmb3JtIH0gZnJvbSAnbm9kZTpvcyc7XG5cbmNvbnN0IF9fZmlsZW5hbWUgPSBmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKF9fZmlsZW5hbWUpO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuXG5jb25zdCBHSVRIVUJfUkVQTyA9ICdEb2xsaG91c2VNQ1AvbWNwLXNlcnZlcic7XG5jb25zdCBNQ1BCX0FTU0VUX1BBVFRFUk4gPSAvXmRvbGxob3VzZW1jcC0uKlxcLm1jcGIkLztcbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5cbi8qKiBBbGxvd2VkIGNsaWVudCBpZGVudGlmaWVycyDigJQgbXVzdCBtYXRjaCBpbnN0YWxsLW1jcCdzIC0tY2xpZW50IHZhbHVlcyAqL1xuY29uc3QgQUxMT1dFRF9DTElFTlRTID0gbmV3IFNldChbXG4gICdjbGF1ZGUnLFxuICAnY2xhdWRlLWNvZGUnLFxuICAnY3Vyc29yJyxcbiAgJ3ZzY29kZScsXG4gICdjbGluZScsXG4gICdyb28tY2xpbmUnLFxuICAnd2luZHN1cmYnLFxuICAnd2l0c3knLFxuICAnZW5jb252bycsXG4gICdnZW1pbmktY2xpJyxcbiAgJ2dvb3NlJyxcbiAgJ3plZCcsXG4gICd3YXJwJyxcbiAgJ2NvZGV4Jyxcbl0pO1xuXG4vKiogUmF0ZSBsaW1pdDogNSBpbnN0YWxscyBwZXIgbWludXRlICovXG5jb25zdCBpbnN0YWxsTGltaXRlciA9IG5ldyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIoNSwgNjBfMDAwKTtcblxuLyoqXG4gKiBLbm93biBjb25maWcgZmlsZSBwYXRocyBwZXIgY2xpZW50LlxuICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ1BhdGgoY2xpZW50OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaG9tZSA9IGhvbWVkaXIoKTtcbiAgY29uc3QgcGxhdCA9IHBsYXRmb3JtKCk7XG5cbiAgY29uc3QgcGF0aHM6IFJlY29yZDxzdHJpbmcsICgpID0+IHN0cmluZyB8IG51bGw+ID0ge1xuICAgICdjbGF1ZGUnOiAoKSA9PiB7XG4gICAgICBpZiAocGxhdCA9PT0gJ2RhcndpbicpIHJldHVybiBqb2luKGhvbWUsICdMaWJyYXJ5JywgJ0FwcGxpY2F0aW9uIFN1cHBvcnQnLCAnQ2xhdWRlJywgJ2NsYXVkZV9kZXNrdG9wX2NvbmZpZy5qc29uJyk7XG4gICAgICBpZiAocGxhdCA9PT0gJ3dpbjMyJykgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnYuQVBQREFUQSB8fCBqb2luKGhvbWUsICdBcHBEYXRhJywgJ1JvYW1pbmcnKSwgJ0NsYXVkZScsICdjbGF1ZGVfZGVza3RvcF9jb25maWcuanNvbicpO1xuICAgICAgcmV0dXJuIGpvaW4oaG9tZSwgJy5jb25maWcnLCAnQ2xhdWRlJywgJ2NsYXVkZV9kZXNrdG9wX2NvbmZpZy5qc29uJyk7XG4gICAgfSxcbiAgICAnY2xhdWRlLWNvZGUnOiAoKSA9PiBqb2luKGhvbWUsICcuY2xhdWRlLmpzb24nKSxcbiAgICAnY3Vyc29yJzogKCkgPT4gam9pbihob21lLCAnLmN1cnNvcicsICdtY3AuanNvbicpLFxuICAgICd3aW5kc3VyZic6ICgpID0+IGpvaW4oaG9tZSwgJy5jb2RlaXVtJywgJ3dpbmRzdXJmJywgJ21jcF9jb25maWcuanNvbicpLFxuICAgICdsbXN0dWRpbyc6ICgpID0+IGpvaW4oaG9tZSwgJy5sbXN0dWRpbycsICdtY3AuanNvbicpLFxuICAgICdnZW1pbmktY2xpJzogKCkgPT4gam9pbihob21lLCAnLmdlbWluaScsICdzZXR0aW5ncy5qc29uJyksXG4gICAgJ2NvZGV4JzogKCkgPT4gam9pbihob21lLCAnLmNvZGV4JywgJ2NvbmZpZy50b21sJyksXG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZXIgPSBwYXRoc1tjbGllbnRdO1xuICByZXR1cm4gcmVzb2x2ZXIgPyByZXNvbHZlcigpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBPcGVuIGEgZmlsZSBpbiB0aGUgc3lzdGVtJ3MgZGVmYXVsdCB0ZXh0IGVkaXRvci5cbiAqL1xuZnVuY3Rpb24gb3BlbkluRWRpdG9yKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHBsYXQgPSBwbGF0Zm9ybSgpO1xuICAgIGxldCBjbWQ6IHN0cmluZztcbiAgICBsZXQgYXJnczogc3RyaW5nW107XG5cbiAgICBpZiAocGxhdCA9PT0gJ2RhcndpbicpIHtcbiAgICAgIGNtZCA9ICdvcGVuJztcbiAgICAgIGFyZ3MgPSBbJy10JywgZmlsZVBhdGhdO1xuICAgIH0gZWxzZSBpZiAocGxhdCA9PT0gJ3dpbjMyJykge1xuICAgICAgY21kID0gJ25vdGVwYWQnO1xuICAgICAgYXJncyA9IFtmaWxlUGF0aF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNtZCA9ICd4ZGctb3Blbic7XG4gICAgICBhcmdzID0gW2ZpbGVQYXRoXTtcbiAgICB9XG5cbiAgICBleGVjRmlsZShjbWQsIGFyZ3MsIHsgdGltZW91dDogMTBfMDAwIH0sIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ291bGQgbm90IG9wZW4gZWRpdG9yOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSgnT3BlbmVkIGluIGVkaXRvci4nKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKiBDbGllbnRzIHdob3NlIGNvbmZpZyBmaWxlcyB3ZSBjYW4gbG9jYXRlIGFuZCBvcGVuICovXG5jb25zdCBPUEVOQUJMRV9DTElFTlRTID0gbmV3IFNldChbXG4gICdjbGF1ZGUnLCAnY2xhdWRlLWNvZGUnLCAnY3Vyc29yJywgJ3dpbmRzdXJmJywgJ2xtc3R1ZGlvJywgJ2dlbWluaS1jbGknLCAnY29kZXgnLFxuXSk7XG5cbi8qKlxuICogQ3JlYXRlIHNldHVwIGhhbmRsZXJzIChFeHByZXNzIDUgY29tcGF0aWJsZSDigJQgcGxhaW4gaGFuZGxlciBmdW5jdGlvbnMsIG5vdCBSb3V0ZXIpLlxuICovXG5pbnRlcmZhY2UgRGV0ZWN0UmVzdWx0IHtcbiAgaW5zdGFsbGVkOiBib29sZWFuO1xuICBjb25maWdQYXRoOiBzdHJpbmcgfCBudWxsO1xuICBjdXJyZW50Q29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHNlcnZlcktleT86IHN0cmluZztcbn1cblxuLyoqIFBhcnNlIGEgVE9NTCBjb25maWcgZmlsZSBmb3IgYSBEb2xsaG91c2VNQ1Agc2VydmVyIGVudHJ5ICovXG5mdW5jdGlvbiBwYXJzZVRvbWxDb25maWcocmF3OiBzdHJpbmcpOiBPbWl0PERldGVjdFJlc3VsdCwgJ2NvbmZpZ1BhdGgnPiB7XG4gIGlmICghcmF3LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2RvbGxob3VzZW1jcCcpKSB7XG4gICAgcmV0dXJuIHsgaW5zdGFsbGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgY29uc3QgdG9tbENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgY29uc3Qgc2VjdGlvbk1hdGNoID0gL1xcW21jcF9zZXJ2ZXJzXFwuKFteXFxdXSpkb2xsaG91c2VtY3BbXlxcXV0qKVxcXS9pLmV4ZWMocmF3KTtcbiAgaWYgKCFzZWN0aW9uTWF0Y2gpIHJldHVybiB7IGluc3RhbGxlZDogdHJ1ZSwgY3VycmVudENvbmZpZzogdG9tbENvbmZpZywgc2VydmVyS2V5OiAnbWNwX3NlcnZlcnMnIH07XG5cbiAgdG9tbENvbmZpZy5zZXJ2ZXJOYW1lID0gc2VjdGlvbk1hdGNoWzFdO1xuICBjb25zdCBzZWN0aW9uU3RhcnQgPSBzZWN0aW9uTWF0Y2guaW5kZXggKyBzZWN0aW9uTWF0Y2hbMF0ubGVuZ3RoO1xuICBjb25zdCBuZXh0U2VjdGlvbiA9IHJhdy5pbmRleE9mKCdcXG5bJywgc2VjdGlvblN0YXJ0KTtcbiAgY29uc3Qgc2VjdGlvbkNvbnRlbnQgPSBuZXh0U2VjdGlvbiA+IC0xID8gcmF3LnNsaWNlKHNlY3Rpb25TdGFydCwgbmV4dFNlY3Rpb24pIDogcmF3LnNsaWNlKHNlY3Rpb25TdGFydCk7XG5cbiAgY29uc3QgY29tbWFuZE1hdGNoID0gL2NvbW1hbmRcXHMqPVxccypcIihbXlwiXSspXCIvLmV4ZWMoc2VjdGlvbkNvbnRlbnQpO1xuICBjb25zdCBhcmdzTWF0Y2ggPSAvYXJnc1xccyo9XFxzKlxcWyhbXlxcXV0qKVxcXS8uZXhlYyhzZWN0aW9uQ29udGVudCk7XG4gIGlmIChjb21tYW5kTWF0Y2gpIHRvbWxDb25maWcuY29tbWFuZCA9IGNvbW1hbmRNYXRjaFsxXTtcbiAgaWYgKGFyZ3NNYXRjaCkge1xuICAgIHRvbWxDb25maWcuYXJncyA9IGFyZ3NNYXRjaFsxXS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpLnJlcGxhY2VBbGwoJ1wiJywgJycpKTtcbiAgfVxuICByZXR1cm4geyBpbnN0YWxsZWQ6IHRydWUsIGN1cnJlbnRDb25maWc6IHRvbWxDb25maWcsIHNlcnZlcktleTogJ21jcF9zZXJ2ZXJzJyB9O1xufVxuXG4vKiogUGFyc2UgYSBKU09OIGNvbmZpZyBmaWxlIGZvciBhIERvbGxob3VzZU1DUCBzZXJ2ZXIgZW50cnkgKi9cbmZ1bmN0aW9uIHBhcnNlSnNvbkNvbmZpZyhyYXc6IHN0cmluZyk6IE9taXQ8RGV0ZWN0UmVzdWx0LCAnY29uZmlnUGF0aCc+IHtcbiAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ21jcFNlcnZlcnMnLCAnc2VydmVycyddKSB7XG4gICAgaWYgKHBhcnNlZFtrZXldPy5kb2xsaG91c2VtY3ApIHtcbiAgICAgIHJldHVybiB7IGluc3RhbGxlZDogdHJ1ZSwgY3VycmVudENvbmZpZzogcGFyc2VkW2tleV0uZG9sbGhvdXNlbWNwLCBzZXJ2ZXJLZXk6IGtleSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBpbnN0YWxsZWQ6IGZhbHNlIH07XG59XG5cbi8qKiBDaGVjayBhIHNpbmdsZSBjbGllbnQgY29uZmlnIGZpbGUgZm9yIGFuIGV4aXN0aW5nIERvbGxob3VzZU1DUCBlbnRyeSAqL1xuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0Q2xpZW50KGNsaWVudDogc3RyaW5nKTogUHJvbWlzZTxEZXRlY3RSZXN1bHQgfCBudWxsPiB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBnZXRDb25maWdQYXRoKGNsaWVudCk7XG4gIGlmICghY29uZmlnUGF0aCkgcmV0dXJuIG51bGw7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhY2Nlc3MoY29uZmlnUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGluc3RhbGxlZDogZmFsc2UsIGNvbmZpZ1BhdGggfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcmVzdWx0ID0gY29uZmlnUGF0aC5lbmRzV2l0aCgnLnRvbWwnKSA/IHBhcnNlVG9tbENvbmZpZyhyYXcpIDogcGFyc2VKc29uQ29uZmlnKHJhdyk7XG4gICAgcmV0dXJuIHsgY29uZmlnUGF0aCwgLi4ucmVzdWx0IH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGluc3RhbGxlZDogZmFsc2UsIGNvbmZpZ1BhdGggfTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBub3JtYWxpemUgYSBjbGllbnQgbmFtZSBmcm9tIHJlcXVlc3QgYm9keS5cbiAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgY2xpZW50IG5hbWUgb3IgbnVsbCAod2l0aCBlcnJvciByZXNwb25zZSBzZW50KS5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVDbGllbnQoXG4gIHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgYWxsb3dlZFNldDogU2V0PHN0cmluZz4sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgeyBjbGllbnQgfSA9IHJlcS5ib2R5IGFzIHsgY2xpZW50Pzogc3RyaW5nIH07XG4gIGlmICghY2xpZW50IHx8IHR5cGVvZiBjbGllbnQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ01pc3NpbmcgcmVxdWlyZWQgZmllbGQ6IGNsaWVudCcgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGNsaWVudCkubm9ybWFsaXplZENvbnRlbnQudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gIGlmICghYWxsb3dlZFNldC5oYXMobm9ybWFsaXplZCkpIHtcbiAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICBlcnJvcjogYFVuc3VwcG9ydGVkIGNsaWVudDogJHtjbGllbnR9YCxcbiAgICAgIHN1cHBvcnRlZDogQXJyYXkuZnJvbShhbGxvd2VkU2V0KSxcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldHVwUm91dGVzKCk6IHtcbiAgaW5zdGFsbEhhbmRsZXI6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IFByb21pc2U8dm9pZD47XG4gIG9wZW5Db25maWdIYW5kbGVyOiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB2ZXJzaW9uSGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgbWNwYlJlZGlyZWN0SGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgZGV0ZWN0SGFuZGxlcjogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4gUHJvbWlzZTx2b2lkPjtcbn0ge1xuICAvLyDilIDilIAgRGV0ZWN0IGV4aXN0aW5nIGluc3RhbGxhdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IGRldGVjdEhhbmRsZXIgPSBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IGNsaWVudHMgPSBbXG4gICAgICB7IGlkOiAnY2xhdWRlJywgbmFtZTogJ0NsYXVkZSBEZXNrdG9wJyB9LFxuICAgICAgeyBpZDogJ2NsYXVkZS1jb2RlJywgbmFtZTogJ0NsYXVkZSBDb2RlJyB9LFxuICAgICAgeyBpZDogJ2N1cnNvcicsIG5hbWU6ICdDdXJzb3InIH0sXG4gICAgICB7IGlkOiAnd2luZHN1cmYnLCBuYW1lOiAnV2luZHN1cmYnIH0sXG4gICAgICB7IGlkOiAnbG1zdHVkaW8nLCBuYW1lOiAnTE0gU3R1ZGlvJyB9LFxuICAgICAgeyBpZDogJ2dlbWluaS1jbGknLCBuYW1lOiAnR2VtaW5pIENMSScgfSxcbiAgICAgIHsgaWQ6ICdjb2RleCcsIG5hbWU6ICdDb2RleCcgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgcmVzdWx0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChjbGllbnRzLm1hcChhc3luYyAoeyBpZCwgbmFtZSB9KSA9PiB7XG4gICAgICBjb25zdCBkZXRlY3Rpb24gPSBhd2FpdCBkZXRlY3RDbGllbnQoaWQpO1xuICAgICAgaWYgKGRldGVjdGlvbikge1xuICAgICAgICByZXN1bHRzW2lkXSA9IHsgbmFtZSwgLi4uZGV0ZWN0aW9uIH07XG4gICAgICB9XG4gICAgfSkpO1xuXG4gICAgcmVzLmpzb24ocmVzdWx0cyk7XG4gIH07XG5cbiAgLy8g4pSA4pSAIE9wZW4gY29uZmlnIGZpbGUgaW4gZWRpdG9yIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb25zdCBvcGVuQ29uZmlnSGFuZGxlciA9IGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50ID0gdmFsaWRhdGVDbGllbnQocmVxLCByZXMsIE9QRU5BQkxFX0NMSUVOVFMpO1xuICAgIGlmICghbm9ybWFsaXplZENsaWVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGdldENvbmZpZ1BhdGgobm9ybWFsaXplZENsaWVudCk7XG4gICAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiBgQ29uZmlnIHBhdGggdW5rbm93biBmb3I6ICR7bm9ybWFsaXplZENsaWVudH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgZmlsZSB3aXRoIGVtcHR5IGNvbnRlbnQgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXRcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWNjZXNzKGNvbmZpZ1BhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShjb25maWdQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBjb25maWdQYXRoLmVuZHNXaXRoKCcudG9tbCcpID8gJycgOiAne30nO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgY29udGVudCArICdcXG4nLCAndXRmLTgnKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFtTZXR1cF0gQ3JlYXRlZCBlbXB0eSBjb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICAgIH0gY2F0Y2ggKG1rRXJyKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IG1rRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBta0Vyci5tZXNzYWdlIDogU3RyaW5nKG1rRXJyKTtcbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogYENvdWxkIG5vdCBjcmVhdGUgY29uZmlnIGZpbGU6ICR7bXNnfWAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBPcGVuaW5nIGNvbmZpZyBmb3IgJHtub3JtYWxpemVkQ2xpZW50fTogJHtjb25maWdQYXRofWApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG9wZW5JbkVkaXRvcihjb25maWdQYXRoKTtcbiAgICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgcGF0aDogY29uZmlnUGF0aCB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogbWVzc2FnZSwgcGF0aDogY29uZmlnUGF0aCB9KTtcbiAgICB9XG4gIH07XG5cbiAgLy8g4pSA4pSAIEF1dG8taW5zdGFsbCB2aWEgaW5zdGFsbC1tY3Ag4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IGluc3RhbGxIYW5kbGVyID0gYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICghaW5zdGFsbExpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnVG9vIG1hbnkgaW5zdGFsbCByZXF1ZXN0cy4gVHJ5IGFnYWluIGluIGEgbWludXRlLicgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZENsaWVudCA9IHZhbGlkYXRlQ2xpZW50KHJlcSwgcmVzLCBBTExPV0VEX0NMSUVOVFMpO1xuICAgIGlmICghbm9ybWFsaXplZENsaWVudCkgcmV0dXJuO1xuXG4gICAgLy8gVmFsaWRhdGUgdmVyc2lvbiBpZiBwcm92aWRlZCDigJQgbXVzdCBiZSBzZW12ZXItbGlrZSAobm8gc2hlbGwgaW5qZWN0aW9uKVxuICAgIGNvbnN0IHsgdmVyc2lvbiB9ID0gcmVxLmJvZHkgYXMgeyB2ZXJzaW9uPzogc3RyaW5nIH07XG4gICAgY29uc3Qgbm9ybWFsaXplZFZlcnNpb24gPSB2ZXJzaW9uID8gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUodmVyc2lvbikubm9ybWFsaXplZENvbnRlbnQgOiB1bmRlZmluZWQ7XG4gICAgaWYgKG5vcm1hbGl6ZWRWZXJzaW9uICYmICEvXlxcZCtcXC5cXGQrXFwuXFxkKy8udGVzdChub3JtYWxpemVkVmVyc2lvbikpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdJbnZhbGlkIHZlcnNpb24gZm9ybWF0LiBFeHBlY3RlZCBzZW12ZXIgKGUuZy4sIDIuMC4yKScgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFnID0gbm9ybWFsaXplZFZlcnNpb24gPyBgQCR7bm9ybWFsaXplZFZlcnNpb259YCA6ICdAbGF0ZXN0JztcbiAgICBsb2dnZXIuaW5mbyhgW1NldHVwXSBJbnN0YWxsaW5nIERvbGxob3VzZU1DUCR7dGFnfSB0byBjbGllbnQ6ICR7bm9ybWFsaXplZENsaWVudH1gKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBhd2FpdCBydW5JbnN0YWxsTWNwKG5vcm1hbGl6ZWRDbGllbnQsIG5vcm1hbGl6ZWRWZXJzaW9uKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBbU2V0dXBdIFN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgdG8gJHtub3JtYWxpemVkQ2xpZW50fWApO1xuICAgICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBvdXRwdXQsIGNsaWVudDogbm9ybWFsaXplZENsaWVudCwgdmVyc2lvbjogbm9ybWFsaXplZFZlcnNpb24gfHwgJ2xhdGVzdCcgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgICAgbG9nZ2VyLndhcm4oYFtTZXR1cF0gSW5zdGFsbCBmYWlsZWQgZm9yICR7bm9ybWFsaXplZENsaWVudH06ICR7bWVzc2FnZX1gKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBtZXNzYWdlLCBjbGllbnQ6IG5vcm1hbGl6ZWRDbGllbnQgfSk7XG4gICAgfVxuICB9O1xuXG4gIC8vIOKUgOKUgCBWZXJzaW9uIGluZm8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGNvbnN0IHZlcnNpb25IYW5kbGVyID0gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBsb2NhbCA9IHtcbiAgICAgIHZlcnNpb246IFBBQ0tBR0VfVkVSU0lPTixcbiAgICAgIG1jcGJVcmw6IGBodHRwczovL2dpdGh1Yi5jb20vJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvZG93bmxvYWQvdiR7UEFDS0FHRV9WRVJTSU9OfS9kb2xsaG91c2VtY3AtJHtQQUNLQUdFX1ZFUlNJT059Lm1jcGJgLFxuICAgIH07XG5cbiAgICAvLyBRdWVyeSBHaXRIdWIgZm9yIHRoZSBhY3R1YWwgbGF0ZXN0IHJlbGVhc2VcbiAgICBsZXQgbGF0ZXN0ID0gbG9jYWw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGdoUmVzID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvbGF0ZXN0YCwge1xuICAgICAgICBoZWFkZXJzOiB7ICdBY2NlcHQnOiAnYXBwbGljYXRpb24vdm5kLmdpdGh1Yitqc29uJywgJ1VzZXItQWdlbnQnOiAnRG9sbGhvdXNlTUNQLVNldHVwJyB9LFxuICAgICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoNTAwMCksXG4gICAgICB9KTtcbiAgICAgIGlmIChnaFJlcy5vaykge1xuICAgICAgICBjb25zdCByZWxlYXNlID0gYXdhaXQgZ2hSZXMuanNvbigpIGFzIHsgdGFnX25hbWU6IHN0cmluZzsgYXNzZXRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgYnJvd3Nlcl9kb3dubG9hZF91cmw6IHN0cmluZyB9PiB9O1xuICAgICAgICBjb25zdCBtY3BiQXNzZXQgPSByZWxlYXNlLmFzc2V0cy5maW5kKGEgPT4gTUNQQl9BU1NFVF9QQVRURVJOLnRlc3QoYS5uYW1lKSk7XG4gICAgICAgIGxhdGVzdCA9IHtcbiAgICAgICAgICB2ZXJzaW9uOiByZWxlYXNlLnRhZ19uYW1lLnJlcGxhY2UoL152LywgJycpLFxuICAgICAgICAgIG1jcGJVcmw6IG1jcGJBc3NldD8uYnJvd3Nlcl9kb3dubG9hZF91cmwgfHxcbiAgICAgICAgICAgIGBodHRwczovL2dpdGh1Yi5jb20vJHtHSVRIVUJfUkVQT30vcmVsZWFzZXMvZG93bmxvYWQvJHtyZWxlYXNlLnRhZ19uYW1lfS9kb2xsaG91c2VtY3AtJHtyZWxlYXNlLnRhZ19uYW1lLnJlcGxhY2UoL152LywgJycpfS5tY3BiYCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEdpdEh1YiB1bnJlYWNoYWJsZSDigJQgdXNlIGxvY2FsIHZlcnNpb24gaW5mb1xuICAgIH1cblxuICAgIHJlcy5qc29uKHtcbiAgICAgIHJ1bm5pbmc6IGxvY2FsLFxuICAgICAgbGF0ZXN0LFxuICAgICAgaXNMYXRlc3Q6IGxvY2FsLnZlcnNpb24gPT09IGxhdGVzdC52ZXJzaW9uLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIOKUgOKUgCAubWNwYiBkb3dubG9hZCByZWRpcmVjdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29uc3QgbWNwYlJlZGlyZWN0SGFuZGxlciA9IGFzeW5jIChfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgLy8gVHJ5IEdpdEh1YiBBUEkgZm9yIHRoZSBhY3R1YWwgbGF0ZXN0IC5tY3BiIGFzc2V0IFVSTFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBnaFJlcyA9IGF3YWl0IGZldGNoKGBodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLyR7R0lUSFVCX1JFUE99L3JlbGVhc2VzL2xhdGVzdGAsIHtcbiAgICAgICAgaGVhZGVyczogeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsICdVc2VyLUFnZW50JzogJ0RvbGxob3VzZU1DUC1TZXR1cCcgfSxcbiAgICAgICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDUwMDApLFxuICAgICAgfSk7XG4gICAgICBpZiAoZ2hSZXMub2spIHtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9IGF3YWl0IGdoUmVzLmpzb24oKSBhcyB7IHRhZ19uYW1lOiBzdHJpbmc7IGFzc2V0czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGJyb3dzZXJfZG93bmxvYWRfdXJsOiBzdHJpbmcgfT4gfTtcbiAgICAgICAgY29uc3QgbWNwYkFzc2V0ID0gcmVsZWFzZS5hc3NldHMuZmluZChhID0+IE1DUEJfQVNTRVRfUEFUVEVSTi50ZXN0KGEubmFtZSkpO1xuICAgICAgICBpZiAobWNwYkFzc2V0KSB7XG4gICAgICAgICAgcmVzLnJlZGlyZWN0KG1jcGJBc3NldC5icm93c2VyX2Rvd25sb2FkX3VybCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBGYWxsIHRocm91Z2ggdG8gY29uc3RydWN0ZWQgVVJMXG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IGNvbnN0cnVjdCBVUkwgZnJvbSBydW5uaW5nIHZlcnNpb25cbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9naXRodWIuY29tLyR7R0lUSFVCX1JFUE99L3JlbGVhc2VzL2Rvd25sb2FkL3Yke1BBQ0tBR0VfVkVSU0lPTn0vZG9sbGhvdXNlbWNwLSR7UEFDS0FHRV9WRVJTSU9OfS5tY3BiYDtcbiAgICByZXMucmVkaXJlY3QodXJsKTtcbiAgfTtcblxuICByZXR1cm4geyBpbnN0YWxsSGFuZGxlciwgb3BlbkNvbmZpZ0hhbmRsZXIsIHZlcnNpb25IYW5kbGVyLCBtY3BiUmVkaXJlY3RIYW5kbGVyLCBkZXRlY3RIYW5kbGVyIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgaW5zdGFsbC1tY3AgYmluYXJ5IHBhdGguXG4gKiBVc2VzIHRoZSBsb2NhbCBkZXBlbmRlbmN5IChub2RlX21vZHVsZXMvLmJpbi9pbnN0YWxsLW1jcCkgZmlyc3QsXG4gKiBmYWxscyBiYWNrIHRvIG5weCBpZiBub3QgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVJbnN0YWxsTWNwQmluKCk6IHsgY21kOiBzdHJpbmc7IHByZWZpeEFyZ3M6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBsb2NhbEJpbiA9IGpvaW4oZGlybmFtZShkaXJuYW1lKGRpcm5hbWUoX19kaXJuYW1lKSkpLCAnbm9kZV9tb2R1bGVzJywgJy5iaW4nLCAnaW5zdGFsbC1tY3AnKTtcbiAgdHJ5IHtcbiAgICBhY2Nlc3NTeW5jKGxvY2FsQmluLCBmc0NvbnN0YW50cy5YX09LKTtcbiAgICByZXR1cm4geyBjbWQ6IGxvY2FsQmluLCBwcmVmaXhBcmdzOiBbXSB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBjbWQ6ICducHgnLCBwcmVmaXhBcmdzOiBbJ2luc3RhbGwtbWNwJ10gfTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBpbnN0YWxsLW1jcCB0byBjb25maWd1cmUgYSBzcGVjaWZpYyBNQ1AgY2xpZW50LlxuICpcbiAqIFVzZXMgdGhlIGJ1bmRsZWQgaW5zdGFsbC1tY3AgZGVwZW5kZW5jeSAoTUlULCBodHRwczovL2dpdGh1Yi5jb20vc3VwZXJtZW1vcnlhaS9pbnN0YWxsLW1jcCkuXG4gKiBDb21tYW5kIGFyZ3VtZW50cyBhcmUgZnVsbHkgaGFyZGNvZGVkIOKAlCBubyB1c2VyIGlucHV0IHJlYWNoZXMgdGhlIHNoZWxsLlxuICogZXhlY0ZpbGUgaXMgdXNlZCAobm90IGV4ZWMpIHRvIHByZXZlbnQgc2hlbGwgaW5qZWN0aW9uLlxuICovXG5mdW5jdGlvbiBydW5JbnN0YWxsTWNwKGNsaWVudDogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB7IGNtZCwgcHJlZml4QXJncyB9ID0gcmVzb2x2ZUluc3RhbGxNY3BCaW4oKTtcbiAgICBjb25zdCB0YWcgPSB2ZXJzaW9uID8gYEAke3ZlcnNpb259YCA6ICdAbGF0ZXN0JztcbiAgICBjb25zdCBhcmdzID0gW1xuICAgICAgLi4ucHJlZml4QXJncyxcbiAgICAgIGBAZG9sbGhvdXNlbWNwL21jcC1zZXJ2ZXIke3RhZ31gLFxuICAgICAgJy0tY2xpZW50JywgY2xpZW50LFxuICAgICAgJy0tbmFtZScsICdkb2xsaG91c2VtY3AnLFxuICAgICAgJy0teWVzJyxcbiAgICBdO1xuXG4gICAgZXhlY0ZpbGUoY21kLCBhcmdzLCB7IHRpbWVvdXQ6IDMwXzAwMCB9LCAoZXJyLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKHN0ZGVyciB8fCBlcnIubWVzc2FnZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHN0ZG91dCB8fCAnSW5zdGFsbGF0aW9uIGNvbXBsZXRlZC4nKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
|
package/dist/web/routes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/web/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAM1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/web/routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAM1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAid1E,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAiJ5D;AAqBD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CA0H3F"}
|