@dollhousemcp/mcp-server 2.0.12-rc.9 → 2.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +66 -0
- package/README.md +4 -4
- package/README.md.backup +5 -5
- package/README.npm.md +4 -4
- package/dist/di/Container.d.ts +14 -0
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +43 -26
- package/dist/elements/agents/AgentManager.d.ts +11 -4
- package/dist/elements/agents/AgentManager.d.ts.map +1 -1
- package/dist/elements/agents/AgentManager.js +38 -11
- package/dist/elements/base/BaseElementManager.d.ts +10 -0
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +26 -1
- package/dist/elements/ensembles/EnsembleManager.d.ts +1 -0
- package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
- package/dist/elements/ensembles/EnsembleManager.js +13 -2
- package/dist/elements/templates/Template.d.ts +33 -1
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +74 -15
- package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
- package/dist/elements/templates/TemplateManager.js +8 -1
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.d.ts.map +1 -1
- package/dist/generated/version.js +3 -3
- package/dist/handlers/element-crud/createElement.js +2 -2
- package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.js +8 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts +3 -0
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.js +48 -9
- package/dist/index.js +19 -13
- package/dist/portfolio/DefaultElementProvider.d.ts +8 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +43 -1
- package/dist/security/contentValidator.d.ts +15 -0
- package/dist/security/contentValidator.d.ts.map +1 -1
- package/dist/security/contentValidator.js +40 -2
- package/dist/utils/TemplateRenderer.d.ts +9 -0
- package/dist/utils/TemplateRenderer.d.ts.map +1 -1
- package/dist/utils/TemplateRenderer.js +21 -1
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +193 -59
- package/dist/web/console/SessionNames.d.ts +18 -5
- package/dist/web/console/SessionNames.d.ts.map +1 -1
- package/dist/web/console/SessionNames.js +63 -8
- package/dist/web/console/StaleProcessRecovery.d.ts.map +1 -1
- package/dist/web/console/StaleProcessRecovery.js +5 -4
- package/dist/web/console/UnifiedConsole.js +3 -3
- package/dist/web/console/consoleToken.js +3 -3
- package/dist/web/portDiscovery.d.ts +1 -1
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +2 -2
- package/dist/web/public/app.js +65 -11
- package/dist/web/public/index.html +2 -0
- package/dist/web/public/logs.js +24 -2
- package/dist/web/public/metrics.js +22 -4
- package/dist/web/public/sessions.js +55 -8
- package/dist/web/public/setup.js +11 -2
- package/dist/web/public/styles.css +12 -0
- package/dist/web/routes/permissionRoutes.js +2 -2
- package/dist/web/routes/setupRoutes.d.ts +67 -1
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +298 -6
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +4 -2
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +14 -5
- package/package.json +5 -3
- package/server.json +2 -2
package/dist/web/public/app.js
CHANGED
|
@@ -34,6 +34,41 @@ function safeParseYaml(content) {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
globalThis.DollhouseConsoleUI = globalThis.DollhouseConsoleUI || {};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Show or update a visible error banner within a tab panel.
|
|
41
|
+
*
|
|
42
|
+
* Creates the banner lazily on first use, then reuses it for later updates.
|
|
43
|
+
*
|
|
44
|
+
* @param {string} targetId - DOM id of the tab panel or container that owns the banner
|
|
45
|
+
* @param {string} bannerId - Stable DOM id for the banner element
|
|
46
|
+
* @param {string} message - User-visible message to render inside the banner
|
|
47
|
+
*/
|
|
48
|
+
globalThis.DollhouseConsoleUI.showBanner = function(targetId, bannerId, message) {
|
|
49
|
+
const target = document.getElementById(targetId);
|
|
50
|
+
if (!target) return;
|
|
51
|
+
let banner = document.getElementById(bannerId);
|
|
52
|
+
if (!banner) {
|
|
53
|
+
banner = document.createElement('div');
|
|
54
|
+
banner.id = bannerId;
|
|
55
|
+
banner.className = 'tab-error-banner';
|
|
56
|
+
target.prepend(banner);
|
|
57
|
+
}
|
|
58
|
+
banner.textContent = message;
|
|
59
|
+
banner.hidden = false;
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Hide an existing tab-level error banner without removing its DOM node.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} bannerId - Stable DOM id for the banner element
|
|
66
|
+
*/
|
|
67
|
+
globalThis.DollhouseConsoleUI.clearBanner = function(bannerId) {
|
|
68
|
+
const banner = document.getElementById(bannerId);
|
|
69
|
+
if (banner) banner.hidden = true;
|
|
70
|
+
};
|
|
71
|
+
|
|
37
72
|
(() => {
|
|
38
73
|
const REPO = 'DollhouseMCP/collection';
|
|
39
74
|
const BRANCH = 'main';
|
|
@@ -74,6 +109,7 @@ function safeParseYaml(content) {
|
|
|
74
109
|
// ── Bootstrap ──────────────────────────────────────────────────────────────
|
|
75
110
|
|
|
76
111
|
function mergeCollectionData(data) {
|
|
112
|
+
globalThis.DollhouseConsoleUI?.clearBanner?.('collection-error-banner');
|
|
77
113
|
const CANONICAL_TYPES = new Set(['agents','personas','skills','templates','memories','ensembles']);
|
|
78
114
|
collectionElements = Object.entries(data.index)
|
|
79
115
|
.filter(([type]) => CANONICAL_TYPES.has(type))
|
|
@@ -117,9 +153,16 @@ function safeParseYaml(content) {
|
|
|
117
153
|
|
|
118
154
|
// Load community collection (non-blocking — portfolio shows immediately)
|
|
119
155
|
DollhouseAuth.apiFetch('/api/collection')
|
|
120
|
-
.then(r => r.ok ? r.json() : Promise.reject('
|
|
156
|
+
.then(r => r.ok ? r.json() : Promise.reject(new Error('collection request failed')))
|
|
121
157
|
.then(mergeCollectionData)
|
|
122
|
-
.catch(() => {
|
|
158
|
+
.catch((err) => {
|
|
159
|
+
console.warn('[App] Collection fetch unavailable:', err);
|
|
160
|
+
globalThis.DollhouseConsoleUI?.showBanner?.(
|
|
161
|
+
'tab-portfolio',
|
|
162
|
+
'collection-error-banner',
|
|
163
|
+
'Community collection unavailable — showing local portfolio only.'
|
|
164
|
+
);
|
|
165
|
+
});
|
|
123
166
|
|
|
124
167
|
const updated = document.getElementById('footer-updated');
|
|
125
168
|
if (updated) {
|
|
@@ -1935,11 +1978,18 @@ function safeParseYaml(content) {
|
|
|
1935
1978
|
|
|
1936
1979
|
const TAB_KEY = 'dollhousemcp-active-tab';
|
|
1937
1980
|
const SETUP_SEEN_KEY = 'dollhousemcp-setup-seen';
|
|
1981
|
+
// Server version injected at request time — used to show Setup tab once per version
|
|
1982
|
+
// so upgraders automatically see it on each new release (not just first-ever visit).
|
|
1983
|
+
// Validate format (semver-like) before trusting the value; malformed falls back to
|
|
1984
|
+
// 'unknown' which safely triggers setup on every load rather than silently skipping.
|
|
1985
|
+
const _rawVersion = document.querySelector('meta[name="dollhouse-server-version"]')?.content || '';
|
|
1986
|
+
const currentServerVersion = /^\d+\.\d+\.\d+/.test(_rawVersion) ? _rawVersion : 'unknown';
|
|
1938
1987
|
|
|
1939
1988
|
// Determine which tab to show on load:
|
|
1940
|
-
// 1.
|
|
1941
|
-
// 2.
|
|
1942
|
-
// 3.
|
|
1989
|
+
// 1. URL hash (deep link)
|
|
1990
|
+
// 2. Saved tab from last visit (localStorage)
|
|
1991
|
+
// 3. Setup tab if not seen on this version yet
|
|
1992
|
+
// 4. Portfolio (HTML default)
|
|
1943
1993
|
const switchToTab = (tabName) => {
|
|
1944
1994
|
if (!consoleTabs) return;
|
|
1945
1995
|
const btn = consoleTabs.querySelector(`[data-tab="${tabName}"]`);
|
|
@@ -2066,12 +2116,16 @@ function safeParseYaml(content) {
|
|
|
2066
2116
|
}
|
|
2067
2117
|
|
|
2068
2118
|
if (!applyHashTab()) {
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2119
|
+
// Version check takes priority over saved tab — upgraders must see Setup
|
|
2120
|
+
// regardless of whether they have a saved tab from their previous session.
|
|
2121
|
+
if (localStorage.getItem(SETUP_SEEN_KEY) === currentServerVersion) {
|
|
2122
|
+
const savedTab = localStorage.getItem(TAB_KEY);
|
|
2123
|
+
if (savedTab) {
|
|
2124
|
+
switchToTab(savedTab);
|
|
2125
|
+
lazyInitTab(savedTab, tabInits);
|
|
2126
|
+
}
|
|
2127
|
+
} else {
|
|
2128
|
+
localStorage.setItem(SETUP_SEEN_KEY, currentServerVersion);
|
|
2075
2129
|
switchToTab('setup');
|
|
2076
2130
|
}
|
|
2077
2131
|
}
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
as an Authorization: Bearer header on fetch calls, or as a ?token= query
|
|
13
13
|
param on EventSource connections. An empty value means auth is off. -->
|
|
14
14
|
<meta name="dollhouse-console-token" content="{{CONSOLE_TOKEN}}">
|
|
15
|
+
<!-- Server version — injected at request time for version-aware UI behaviour (e.g. setup-seen per version). -->
|
|
16
|
+
<meta name="dollhouse-server-version" content="{{DOLLHOUSE_VERSION}}">
|
|
15
17
|
<link rel="stylesheet" href="fonts.css">
|
|
16
18
|
<link rel="stylesheet" href="styles.css">
|
|
17
19
|
<link rel="stylesheet" href="logs.css">
|
package/dist/web/public/logs.js
CHANGED
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
let filterSource = '';
|
|
39
39
|
let filterMessage = '';
|
|
40
40
|
let filterCorrelationId = '';
|
|
41
|
+
let filterSessionId = '';
|
|
41
42
|
|
|
42
43
|
// ── DOM references ─────────────────────────────────────────────────────
|
|
43
44
|
let viewport, scrollSpacer, jumpBtn, statusDot, statusText, entryCountEl;
|
|
@@ -56,6 +57,14 @@
|
|
|
56
57
|
if (autoScroll) scrollToBottom();
|
|
57
58
|
});
|
|
58
59
|
},
|
|
60
|
+
refilter: (sessionId) => {
|
|
61
|
+
filterSessionId = sessionId || '';
|
|
62
|
+
applyFilters();
|
|
63
|
+
requestAnimationFrame(() => {
|
|
64
|
+
renderViewport();
|
|
65
|
+
if (autoScroll) scrollToBottom();
|
|
66
|
+
});
|
|
67
|
+
},
|
|
59
68
|
};
|
|
60
69
|
|
|
61
70
|
function initLogViewer(urlParams) {
|
|
@@ -307,7 +316,10 @@
|
|
|
307
316
|
const qs = params.toString();
|
|
308
317
|
eventSource = DollhouseAuth.apiEventSource('/api/logs/stream' + (qs ? '?' + qs : ''));
|
|
309
318
|
|
|
310
|
-
eventSource.onopen = () =>
|
|
319
|
+
eventSource.onopen = () => {
|
|
320
|
+
clearLogsError();
|
|
321
|
+
setStatus('connected');
|
|
322
|
+
};
|
|
311
323
|
|
|
312
324
|
eventSource.onmessage = (event) => {
|
|
313
325
|
try {
|
|
@@ -322,6 +334,7 @@
|
|
|
322
334
|
|
|
323
335
|
eventSource.onerror = () => {
|
|
324
336
|
setStatus('disconnected');
|
|
337
|
+
showLogsError('Connection lost - reconnecting...');
|
|
325
338
|
eventSource.close();
|
|
326
339
|
eventSource = null;
|
|
327
340
|
setTimeout(connectSSE, RECONNECT_DELAY_MS);
|
|
@@ -362,6 +375,7 @@
|
|
|
362
375
|
const LEVEL_PRIORITY = { debug: 0, info: 1, warn: 2, error: 3 };
|
|
363
376
|
|
|
364
377
|
function matchesFilters(entry) {
|
|
378
|
+
if (filterSessionId && entry.data?._sessionId !== filterSessionId) return false;
|
|
365
379
|
if (filterCorrelationId && entry.correlationId !== filterCorrelationId) return false;
|
|
366
380
|
if (filterCategory && entry.category !== filterCategory) return false;
|
|
367
381
|
if (filterLevel && (LEVEL_PRIORITY[entry.level] || 0) < (LEVEL_PRIORITY[filterLevel] || 0)) return false;
|
|
@@ -371,7 +385,7 @@
|
|
|
371
385
|
}
|
|
372
386
|
|
|
373
387
|
function applyFilters() {
|
|
374
|
-
const hasFilter = filterCategory || filterLevel || filterSource || filterMessage || filterCorrelationId;
|
|
388
|
+
const hasFilter = filterCategory || filterLevel || filterSource || filterMessage || filterCorrelationId || filterSessionId;
|
|
375
389
|
if (hasFilter) {
|
|
376
390
|
filteredIndices = [];
|
|
377
391
|
for (let i = 0; i < buffer.length; i++) {
|
|
@@ -636,6 +650,14 @@
|
|
|
636
650
|
statusText.textContent = status;
|
|
637
651
|
}
|
|
638
652
|
|
|
653
|
+
function showLogsError(message) {
|
|
654
|
+
globalThis.DollhouseConsoleUI?.showBanner?.('tab-logs', 'logs-error-banner', message);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
function clearLogsError() {
|
|
658
|
+
globalThis.DollhouseConsoleUI?.clearBanner?.('logs-error-banner');
|
|
659
|
+
}
|
|
660
|
+
|
|
639
661
|
function updateEntryCount() {
|
|
640
662
|
const total = buffer.length;
|
|
641
663
|
const visible = getVisibleCount();
|
|
@@ -144,6 +144,15 @@
|
|
|
144
144
|
});
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
+
// ── Error banners (#1866) ────────────────────────────────────────────────
|
|
148
|
+
function showMetricsError(message) {
|
|
149
|
+
globalThis.DollhouseConsoleUI?.showBanner?.('tab-metrics', 'metrics-error-banner', message);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function clearMetricsError() {
|
|
153
|
+
globalThis.DollhouseConsoleUI?.clearBanner?.('metrics-error-banner');
|
|
154
|
+
}
|
|
155
|
+
|
|
147
156
|
// ── Data fetching ────────────────────────────────────────────────────────
|
|
148
157
|
async function fetchLatest() {
|
|
149
158
|
try {
|
|
@@ -160,8 +169,12 @@
|
|
|
160
169
|
const cutoff = Date.now() - TIME_RANGES['1h'];
|
|
161
170
|
historySnapshots = historySnapshots.filter(s => new Date(s.timestamp).getTime() > cutoff);
|
|
162
171
|
renderAll(lastSnapshot.metrics);
|
|
172
|
+
clearMetricsError();
|
|
163
173
|
}
|
|
164
|
-
} catch {
|
|
174
|
+
} catch (err) {
|
|
175
|
+
console.warn('[Metrics] Fetch failed:', err);
|
|
176
|
+
showMetricsError('Failed to load metrics — retrying...');
|
|
177
|
+
}
|
|
165
178
|
}
|
|
166
179
|
|
|
167
180
|
async function fetchHistory() {
|
|
@@ -174,7 +187,11 @@
|
|
|
174
187
|
historySnapshots = data.snapshots.reverse(); // oldest first
|
|
175
188
|
if (lastSnapshot) renderAll(lastSnapshot.metrics);
|
|
176
189
|
}
|
|
177
|
-
|
|
190
|
+
clearMetricsError();
|
|
191
|
+
} catch (err) {
|
|
192
|
+
console.warn('[Metrics] History fetch failed:', err);
|
|
193
|
+
showMetricsError('Failed to load metrics history — retrying...');
|
|
194
|
+
}
|
|
178
195
|
}
|
|
179
196
|
|
|
180
197
|
// ── Rendering ────────────────────────────────────────────────────────────
|
|
@@ -412,9 +429,10 @@
|
|
|
412
429
|
renderSecurityEvents(data.entries);
|
|
413
430
|
}
|
|
414
431
|
})
|
|
415
|
-
.catch(() => {
|
|
432
|
+
.catch((err) => {
|
|
433
|
+
console.warn('[Metrics] Security events fetch failed:', err);
|
|
416
434
|
const el = document.getElementById('security-recent-events');
|
|
417
|
-
if (el) el.
|
|
435
|
+
if (el) el.textContent = 'Failed to load security events';
|
|
418
436
|
});
|
|
419
437
|
}
|
|
420
438
|
}
|
|
@@ -14,7 +14,15 @@
|
|
|
14
14
|
(function() {
|
|
15
15
|
'use strict';
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
function getConfiguredNumber(key, fallback) {
|
|
18
|
+
var config = globalThis.DollhouseConsoleConfig;
|
|
19
|
+
var value = config && Number(config[key]);
|
|
20
|
+
return Number.isFinite(value) && value > 0 ? value : fallback;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
var SESSION_POLL_INTERVAL = getConfiguredNumber('sessionPollIntervalMs', 5000);
|
|
24
|
+
var SESSION_FILTER_INJECTION_RETRY_INTERVAL = getConfiguredNumber('sessionFilterInjectionRetryIntervalMs', 500);
|
|
25
|
+
var SESSION_FILTER_INJECTION_MAX_RETRIES = getConfiguredNumber('sessionFilterInjectionMaxRetries', 20);
|
|
18
26
|
var sessions = [];
|
|
19
27
|
var filterSessionId = '';
|
|
20
28
|
var dropdownBuilt = false;
|
|
@@ -59,14 +67,33 @@
|
|
|
59
67
|
var logSelect = document.getElementById('log-session-filter');
|
|
60
68
|
if (logSelect) logSelect.value = sessionId;
|
|
61
69
|
|
|
62
|
-
// Trigger log re-filter
|
|
70
|
+
// Trigger log re-filter with the selected session
|
|
63
71
|
if (window.DollhouseConsole && window.DollhouseConsole.logs && window.DollhouseConsole.logs.refilter) {
|
|
64
|
-
window.DollhouseConsole.logs.refilter();
|
|
72
|
+
window.DollhouseConsole.logs.refilter(sessionId);
|
|
65
73
|
}
|
|
66
74
|
|
|
67
75
|
refreshSelectionState();
|
|
68
76
|
}
|
|
69
77
|
|
|
78
|
+
function showSessionsError(message) {
|
|
79
|
+
var target = document.getElementById('session-indicator');
|
|
80
|
+
if (!target || !target.parentElement) return;
|
|
81
|
+
var banner = document.getElementById('sessions-error-banner');
|
|
82
|
+
if (!banner) {
|
|
83
|
+
banner = document.createElement('div');
|
|
84
|
+
banner.id = 'sessions-error-banner';
|
|
85
|
+
banner.className = 'tab-error-banner';
|
|
86
|
+
target.parentElement.insertBefore(banner, target);
|
|
87
|
+
}
|
|
88
|
+
banner.textContent = message;
|
|
89
|
+
banner.hidden = false;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function clearSessionsError() {
|
|
93
|
+
var banner = document.getElementById('sessions-error-banner');
|
|
94
|
+
if (banner) banner.hidden = true;
|
|
95
|
+
}
|
|
96
|
+
|
|
70
97
|
// Update checkmarks and selected styling without rebuilding DOM
|
|
71
98
|
function refreshSelectionState() {
|
|
72
99
|
// Update items
|
|
@@ -274,6 +301,15 @@
|
|
|
274
301
|
.then(function(res) {
|
|
275
302
|
if (!res.ok) {
|
|
276
303
|
alert('Failed to stop session ' + displayName(s) + ': server returned ' + res.status);
|
|
304
|
+
fetchSessions();
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
return res.json();
|
|
308
|
+
})
|
|
309
|
+
.then(function(data) {
|
|
310
|
+
if (!data) return;
|
|
311
|
+
if (data.reason === 'pending-kill') {
|
|
312
|
+
alert('Session ' + displayName(s) + ' will be terminated shortly.\nWaiting for the process to identify itself, then it will be killed.');
|
|
277
313
|
}
|
|
278
314
|
fetchSessions();
|
|
279
315
|
})
|
|
@@ -329,7 +365,7 @@
|
|
|
329
365
|
if (!logPanel) return;
|
|
330
366
|
if (document.getElementById('log-session-filter')) return;
|
|
331
367
|
|
|
332
|
-
var filterBar = logPanel.querySelector('.log-
|
|
368
|
+
var filterBar = logPanel.querySelector('.log-controls');
|
|
333
369
|
if (!filterBar) return;
|
|
334
370
|
|
|
335
371
|
var group = document.createElement('div');
|
|
@@ -343,6 +379,10 @@
|
|
|
343
379
|
group.querySelector('select').addEventListener('change', function() {
|
|
344
380
|
applyFilter(this.value);
|
|
345
381
|
});
|
|
382
|
+
|
|
383
|
+
// If sessions loaded before the log controls mounted, populate the
|
|
384
|
+
// newly injected filter immediately instead of waiting for the next poll.
|
|
385
|
+
updateSessionFilterOptions();
|
|
346
386
|
}
|
|
347
387
|
|
|
348
388
|
// Update session filter dropdown options
|
|
@@ -369,15 +409,22 @@
|
|
|
369
409
|
*/
|
|
370
410
|
function fetchSessions() {
|
|
371
411
|
DollhouseAuth.apiFetch('/api/sessions').then(function(res) {
|
|
372
|
-
if (!res.ok)
|
|
412
|
+
if (!res.ok) {
|
|
413
|
+
showSessionsError('Failed to load sessions.');
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
373
416
|
return res.json();
|
|
374
417
|
}).then(function(data) {
|
|
375
418
|
if (data && data.sessions) {
|
|
376
419
|
sessions = data.sessions;
|
|
377
420
|
updateSessionIndicator();
|
|
378
421
|
updateSessionFilterOptions();
|
|
422
|
+
clearSessionsError();
|
|
379
423
|
}
|
|
380
|
-
}).catch(function() {
|
|
424
|
+
}).catch(function(err) {
|
|
425
|
+
console.warn('[Sessions] Fetch failed:', err);
|
|
426
|
+
showSessionsError('Failed to load sessions.');
|
|
427
|
+
});
|
|
381
428
|
}
|
|
382
429
|
|
|
383
430
|
// Expose for logs.js integration
|
|
@@ -395,10 +442,10 @@
|
|
|
395
442
|
var tryInject = setInterval(function() {
|
|
396
443
|
injectSessionFilter();
|
|
397
444
|
retries++;
|
|
398
|
-
if (document.getElementById('log-session-filter') || retries >
|
|
445
|
+
if (document.getElementById('log-session-filter') || retries > SESSION_FILTER_INJECTION_MAX_RETRIES) {
|
|
399
446
|
clearInterval(tryInject);
|
|
400
447
|
}
|
|
401
|
-
},
|
|
448
|
+
}, SESSION_FILTER_INJECTION_RETRY_INTERVAL);
|
|
402
449
|
}
|
|
403
450
|
|
|
404
451
|
if (document.readyState === 'loading') {
|
package/dist/web/public/setup.js
CHANGED
|
@@ -176,8 +176,16 @@
|
|
|
176
176
|
if (hint) hint.textContent = CHANNEL_HINTS[currentChannel] || '';
|
|
177
177
|
configs = buildConfigs(pinnedVersion, currentChannel);
|
|
178
178
|
updateAllConfigs(currentMethod);
|
|
179
|
+
// Clear is-success/is-match state so buttons can be re-evaluated
|
|
180
|
+
document.querySelectorAll('.setup-install-btn').forEach((btn) => {
|
|
181
|
+
btn.classList.remove('is-success', 'is-match');
|
|
182
|
+
btn.disabled = false;
|
|
183
|
+
});
|
|
184
|
+
document.querySelectorAll('.setup-install-status').forEach((s) => {
|
|
185
|
+
s.textContent = '';
|
|
186
|
+
s.className = 'setup-install-status';
|
|
187
|
+
});
|
|
179
188
|
updateInstallButtonLabels();
|
|
180
|
-
// Re-evaluate detection: current config may no longer match the new channel
|
|
181
189
|
updateDetectionState();
|
|
182
190
|
});
|
|
183
191
|
};
|
|
@@ -756,7 +764,8 @@
|
|
|
756
764
|
installBtn.classList.add('is-match');
|
|
757
765
|
} else {
|
|
758
766
|
const isPinned = currentMethod === 'global' && pinnedVersion && pinnedVersion !== 'latest';
|
|
759
|
-
|
|
767
|
+
const channelLabel = currentChannel === DEFAULT_CHANNEL ? '' : ` (${currentChannel})`;
|
|
768
|
+
installBtn.textContent = isPinned ? `Configure v${pinnedVersion}` : `Configure Now${channelLabel}`;
|
|
760
769
|
installBtn.disabled = false;
|
|
761
770
|
installBtn.classList.remove('is-match');
|
|
762
771
|
}
|
|
@@ -1727,3 +1727,15 @@ fieldset.topic-filters {
|
|
|
1727
1727
|
scroll-behavior: auto !important;
|
|
1728
1728
|
}
|
|
1729
1729
|
}
|
|
1730
|
+
|
|
1731
|
+
/* ── Tab error banners (#1866) ─────────────────────────────────────────── */
|
|
1732
|
+
.tab-error-banner {
|
|
1733
|
+
padding: 6px 10px;
|
|
1734
|
+
border-radius: var(--radius-sm);
|
|
1735
|
+
font-size: 11.5px;
|
|
1736
|
+
margin-bottom: 8px;
|
|
1737
|
+
background: rgba(245, 158, 11, 0.1);
|
|
1738
|
+
color: #b45309; /* NOSONAR — contrast computed against page bg, not rgba tint */
|
|
1739
|
+
border: 1px solid rgba(245, 158, 11, 0.2);
|
|
1740
|
+
font-family: var(--font-mono);
|
|
1741
|
+
}
|
|
@@ -83,7 +83,7 @@ export function registerPermissionRoutes(router, handler) {
|
|
|
83
83
|
res.json({ decision: 'allow' }); // fail open
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
|
-
const decision = opResult.data?.decision ?? 'unknown';
|
|
86
|
+
const decision = (opResult.data?.decision ?? 'unknown');
|
|
87
87
|
logger.debug(`[WebUI/Gateway] evaluate_permission: ${tool_name} → ${decision} (${elapsedMs}ms)`);
|
|
88
88
|
// Track decision for live dashboard feed
|
|
89
89
|
trackDecision(tool_name, input || {}, opResult.data);
|
|
@@ -135,4 +135,4 @@ export function registerPermissionRoutes(router, handler) {
|
|
|
135
135
|
}
|
|
136
136
|
});
|
|
137
137
|
}
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRy9DLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBY25GLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUF5QixFQUFFLENBQUM7QUFDakQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRXhCLDBFQUEwRTtBQUMxRSxTQUFTLGFBQWEsQ0FBQyxHQUE0QixFQUFFLElBQWMsRUFBRSxRQUFnQjtJQUNuRixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBZ0IsRUFBRSxLQUE4QixFQUFFLE1BQStCO0lBQ3RHLE1BQU0sS0FBSyxHQUF1QjtRQUNoQyxFQUFFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtRQUM1QixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7UUFDbkMsU0FBUyxFQUFFLFFBQVE7UUFDbkIsT0FBTyxFQUFFLFFBQVEsS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLEVBQUUsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMs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b24gZXZhbHVhdGlvbiBIVFRQIHJvdXRlcyBhbmQgZGVjaXNpb24gdHJhY2tpbmcuXG4gKlxuICogUHJvdmlkZXM6XG4gKiAtIFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24g4oCUIGV2YWx1YXRlcyB0b29sIHBlcm1pc3Npb25zIHZpYSBNQ1AtQVFMXG4gKiAtIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzIOKAlCByZXR1cm5zIGN1cnJlbnQgcG9saWNpZXMgYW5kIHJlY2VudCBkZWNpc2lvbnNcbiAqIC0gRGVjaXNpb24gdHJhY2tpbmcgcmluZyBidWZmZXIgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkXG4gKi9cblxuaW1wb3J0IGV4cHJlc3MsIHsgUm91dGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcblxuaW1wb3J0IHsgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyLmpzJztcblxuLy8g4pSA4pSAIFBlcm1pc3Npb24gRGVjaXNpb24gVHJhY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSaW5nIGJ1ZmZlciBvZiByZWNlbnQgcGVybWlzc2lvbiBkZWNpc2lvbnMgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkLlxuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHRvb2xfbmFtZTogc3RyaW5nO1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBkZWNpc2lvbjogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG59XG5cbmNvbnN0IERFQ0lTSU9OX0JVRkZFUl9TSVpFID0gMjAwO1xuY29uc3QgcmVjZW50RGVjaXNpb25zOiBQZXJtaXNzaW9uRGVjaXNpb25bXSA9IFtdO1xubGV0IGRlY2lzaW9uQ291bnRlciA9IDA7XG5cbi8qKiBFeHRyYWN0IGEgc3RyaW5nIGZpZWxkIGZyb20gYSByZWNvcmQsIHRyeWluZyBtdWx0aXBsZSBrZXlzIGluIG9yZGVyICovXG5mdW5jdGlvbiBleHRyYWN0U3RyaW5nKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleXM6IHN0cmluZ1tdLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbCA9IG9iaj8uW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsO1xuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gdHJhY2tEZWNpc2lvbih0b29sTmFtZTogc3RyaW5nLCBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgY29uc3QgZW50cnk6IFBlcm1pc3Npb25EZWNpc2lvbiA9IHtcbiAgICBpZDogYGQtJHsrK2RlY2lzaW9uQ291bnRlcn1gLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgY29tbWFuZDogdG9vbE5hbWUgPT09ICdCYXNoJyAmJiB0eXBlb2YgaW5wdXQ/LmNvbW1hbmQgPT09ICdzdHJpbmcnID8gaW5wdXQuY29tbWFuZCA6IHVuZGVmaW5lZCxcbiAgICBkZWNpc2lvbjogZXh0cmFjdFN0cmluZyhyZXN1bHQsIFsnZGVjaXNpb24nLCAnYmVoYXZpb3InXSwgJ3Vua25vd24nKSxcbiAgICByZWFzb246IGV4dHJhY3RTdHJpbmcocmVzdWx0LCBbJ3JlYXNvbicsICdtZXNzYWdlJ10sICcnKSxcbiAgfTtcbiAgcmVjZW50RGVjaXNpb25zLnVuc2hpZnQoZW50cnkpO1xuICBpZiAocmVjZW50RGVjaXNpb25zLmxlbmd0aCA+IERFQ0lTSU9OX0JVRkZFUl9TSVpFKSB7XG4gICAgcmVjZW50RGVjaXNpb25zLmxlbmd0aCA9IERFQ0lTSU9OX0JVRkZFUl9TSVpFO1xuICB9XG59XG5cbi8qKiBIZWxwZXIgdG8gZXh0cmFjdCBzaW5nbGUgcmVzdWx0IGZyb20gTUNQLUFRTCBiYXRjaCByZXNwb25zZSAqL1xuZnVuY3Rpb24gYXNTaW5nbGVSZXN1bHQocmVzdWx0czogdW5rbm93bik6IHsgc3VjY2VzczogYm9vbGVhbjsgZGF0YT86IHVua25vd247IGVycm9yPzogc3RyaW5nIH0ge1xuICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHRzKSkgcmV0dXJuIHJlc3VsdHNbMF0gfHwgeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdFbXB0eSByZXN1bHQnIH07XG4gIHJldHVybiByZXN1bHRzIGFzIHsgc3VjY2VzczogYm9vbGVhbjsgZGF0YT86IHVua25vd247IGVycm9yPzogc3RyaW5nIH07XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgcGVybWlzc2lvbi1yZWxhdGVkIHJvdXRlcyBvbiBhIGdhdGV3YXkgcm91dGVyLlxuICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgTUNQLUFRTCBoYW5kbGVyIGZvciBwb2xpY3kgZXZhbHVhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhyb3V0ZXI6IFJvdXRlciwgaGFuZGxlcjogTUNQQVFMSGFuZGxlcik6IHZvaWQge1xuICAvKipcbiAgICogUE9TVCAvYXBpL2V2YWx1YXRlX3Blcm1pc3Npb25cbiAgICogUGVybWlzc2lvbiBldmFsdWF0aW9uIGVuZHBvaW50IGZvciBQcmVUb29sVXNlIGhvb2tzLlxuICAgKiBSb3V0ZXMgdGhyb3VnaCBldmFsdWF0ZV9wZXJtaXNzaW9uIE1DUC1BUUwgUkVBRCBvcGVyYXRpb24uXG4gICAqIEZhaWwtb3BlbjogcmV0dXJucyBhbGxvdyBvbiBhbnkgZXJyb3IgdG8gYXZvaWQgYmxvY2tpbmcgdGhlIHVzZXIuXG4gICAqL1xuICBjb25zdCBwZXJtaXNzaW9uTGltaXRlciA9IG5ldyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIoMTIwLCA2MF8wMDApO1xuICByb3V0ZXIucG9zdCgnL2V2YWx1YXRlX3Blcm1pc3Npb24nLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgaWYgKCFwZXJtaXNzaW9uTGltaXRlci50cnlBY3F1aXJlKCkpIHtcbiAgICAgIHJlcy5qc29uKHsgZGVjaXNpb246ICdhbGxvdycgfSk7IC8vIGZhaWwgb3BlbiBvbiByYXRlIGxpbWl0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYm9keSA9IHJlcS5ib2R5IGFzIHtcbiAgICAgIHRvb2xfbmFtZT86IHN0cmluZztcbiAgICAgIGlucHV0PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBwbGF0Zm9ybT86IHN0cmluZztcbiAgICB9O1xuXG4gICAgLy8gVW5pY29kZSBub3JtYWxpemF0aW9uIChORkMpIG9uIHN0cmluZyBpbnB1dHMgdG8gcHJldmVudCBob21vZ3JhcGggYXR0YWNrc1xuICAgIGNvbnN0IHRvb2xfbmFtZSA9IHR5cGVvZiBib2R5LnRvb2xfbmFtZSA9PT0gJ3N0cmluZycgPyBib2R5LnRvb2xfbmFtZS5ub3JtYWxpemUoJ05GQycpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBsYXRmb3JtID0gdHlwZW9mIGJvZHkucGxhdGZvcm0gPT09ICdzdHJpbmcnID8gYm9keS5wbGF0Zm9ybS5ub3JtYWxpemUoJ05GQycpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlucHV0ID0gYm9keS5pbnB1dDtcblxuICAgIGlmICghdG9vbF9uYW1lKSB7XG4gICAgICByZXMuanNvbih7IGRlY2lzaW9uOiAnYWxsb3cnIH0pOyAvLyBmYWlsIG9wZW4gb24gYmFkIGlucHV0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wUmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgb3BlcmF0aW9uOiAnZXZhbHVhdGVfcGVybWlzc2lvbicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHRvb2xfbmFtZSxcbiAgICAgICAgICBpbnB1dDogaW5wdXQgfHwge30sXG4gICAgICAgICAgcGxhdGZvcm06IHBsYXRmb3JtIHx8ICdjbGF1ZGVfY29kZScsXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBlbGFwc2VkTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRNcztcblxuICAgICAgaWYgKCFvcFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBbV2ViVUkvR2F0ZXdheV0gZXZhbHVhdGVfcGVybWlzc2lvbiBmYWlsZWQgKCR7ZWxhcHNlZE1zfW1zKTogJHtvcFJlc3VsdC5lcnJvcn1gKTtcbiAgICAgICAgcmVzLmpzb24oeyBkZWNpc2lvbjogJ2FsbG93JyB9KTsgLy8gZmFpbCBvcGVuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjaXNpb24gPSAob3BSZXN1bHQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik/LmRlY2lzaW9uID8/ICd1bmtub3duJztcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1dlYlVJL0dhdGV3YXldIGV2YWx1YXRlX3Blcm1pc3Npb246ICR7dG9vbF9uYW1lfSDihpIgJHtkZWNpc2lvbn0gKCR7ZWxhcHNlZE1zfW1zKWApO1xuXG4gICAgICAvLyBUcmFjayBkZWNpc2lvbiBmb3IgbGl2ZSBkYXNoYm9hcmQgZmVlZFxuICAgICAgdHJhY2tEZWNpc2lvbih0b29sX25hbWUsIGlucHV0IHx8IHt9LCBvcFJlc3VsdC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcblxuICAgICAgcmVzLmpzb24ob3BSZXN1bHQuZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBlbGFwc2VkTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRNcztcbiAgICAgIGxvZ2dlci5lcnJvcihgW1dlYlVJL0dhdGV3YXldIGV2YWx1YXRlX3Blcm1pc3Npb24gZXJyb3IgKCR7ZWxhcHNlZE1zfW1zKTpgLCBlcnIpO1xuICAgICAgcmVzLmpzb24oeyBkZWNpc2lvbjogJ2FsbG93JyB9KTsgLy8gZmFpbCBvcGVuXG4gICAgfVxuICB9KTtcblxuICAvKipcbiAgICogR0VUIC9hcGkvcGVybWlzc2lvbnMvc3RhdHVzXG4gICAqIFJldHVybnMgY3VycmVudCBwZXJtaXNzaW9uIHBvbGljaWVzIGFuZCByZWNlbnQgZGVjaXNpb25zXG4gICAqIGZvciB0aGUgbGl2ZSBwZXJtaXNzaW9ucyBkYXNoYm9hcmQuXG4gICAqL1xuICByb3V0ZXIuZ2V0KCcvcGVybWlzc2lvbnMvc3RhdHVzJywgYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcFJlc3VsdCA9IGFzU2luZ2xlUmVzdWx0KGF3YWl0IGhhbmRsZXIuaGFuZGxlUmVhZCh7XG4gICAgICAgIG9wZXJhdGlvbjogJ2dldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzJyxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKCFvcFJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6IG9wUmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gZ2V0IHBvbGljaWVzJyB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhID0gb3BSZXN1bHQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gRXh0cmFjdCBjb25maXJtIHBhdHRlcm5zIGZyb20gZWxlbWVudHNcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gKGRhdGEuZWxlbWVudHMgfHwgW10pIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICAgIGNvbnN0IGNvbmZpcm1QYXR0ZXJuczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgY29uc3QgY29uZmlybSA9IGVsLmNvbmZpcm1QYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGNvbmZpcm0/Lmxlbmd0aCkgY29uZmlybVBhdHRlcm5zLnB1c2goLi4uY29uZmlybSk7XG4gICAgICB9XG5cbiAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgYWN0aXZlRWxlbWVudENvdW50OiBkYXRhLmFjdGl2ZUVsZW1lbnRDb3VudCxcbiAgICAgICAgaGFzQWxsb3dsaXN0OiBkYXRhLmhhc0FsbG93bGlzdCxcbiAgICAgICAgZGVueVBhdHRlcm5zOiBkYXRhLmNvbWJpbmVkRGVueVBhdHRlcm5zLFxuICAgICAgICBhbGxvd1BhdHRlcm5zOiBkYXRhLmNvbWJpbmVkQWxsb3dQYXR0ZXJucyxcbiAgICAgICAgY29uZmlybVBhdHRlcm5zLFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgcGVybWlzc2lvblByb21wdEFjdGl2ZTogZGF0YS5wZXJtaXNzaW9uUHJvbXB0QWN0aXZlLFxuICAgICAgICByZWNlbnREZWNpc2lvbnMsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1dlYlVJL0dhdGV3YXldIHBlcm1pc3Npb25zL3N0YXR1cyBlcnJvcjonLCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBnZXQgcGVybWlzc2lvbiBzdGF0dXMnIH0pO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRy9DLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBY25GLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUF5QixFQUFFLENBQUM7QUFDakQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRXhCLDBFQUEwRTtBQUMxRSxTQUFTLGFBQWEsQ0FBQyxHQUE0QixFQUFFLElBQWMsRUFBRSxRQUFnQjtJQUNuRixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBZ0IsRUFBRSxLQUE4QixFQUFFLE1BQStCO0lBQ3RHLE1BQU0sS0FBSyxHQUF1QjtRQUNoQyxFQUFFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtRQUM1QixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7UUFDbkMsU0FBUyxFQUFFLFFBQVE7UUFDbkIsT0FBTyxFQUFFLFFBQVEsS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLEVBQUUsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM5RixRQUFRLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRSxTQUFTLENBQUM7UUFDcEUsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQ3pELENBQUM7SUFDRixlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQ2xELGVBQWUsQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLENBQUM7SUFDaEQsQ0FBQztBQUNILENBQUM7QUFFRCxrRUFBa0U7QUFDbEUsU0FBUyxjQUFjLENBQUMsT0FBZ0I7SUFDdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7SUFDM0YsT0FBTyxPQUErRCxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsTUFBYyxFQUFFLE9BQXNCO0lBQzdFOzs7OztPQUtHO0lBQ0gsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLHdCQUF3QixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRSxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3JFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtZQUMzRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUloQixDQUFDO1FBRUYsNEVBQTRFO1FBQzVFLE1BQU0sU0FBUyxHQUFHLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDbkcsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNoRyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRXpCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLHlCQUF5QjtZQUMxRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUN2RCxTQUFTLEVBQUUscUJBQXFCO2dCQUNoQyxNQUFNLEVBQUU7b0JBQ04sU0FBUztvQkFDVCxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUU7b0JBQ2xCLFFBQVEsRUFBRSxRQUFRLElBQUksYUFBYTtpQkFDcEM7YUFDRixDQUFDLENBQUMsQ0FBQztZQUNKLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUM7WUFFdkMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQywrQ0FBK0MsU0FBUyxRQUFRLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZO2dCQUM3QyxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFHLENBQUUsUUFBUSxDQUFDLElBQThCLEVBQUUsUUFBUSxJQUFJLFNBQVMsQ0FBQyxDQUFDO1lBQ25GLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0NBQXdDLFNBQVMsTUFBTSxRQUFRLEtBQUssU0FBUyxLQUFLLENBQUMsQ0FBQztZQUVqRyx5Q0FBeUM7WUFDekMsYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxJQUErQixDQUFDLENBQUM7WUFFaEYsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxLQUFLLENBQUMsOENBQThDLFNBQVMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pGLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVk7UUFDL0MsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNwRCxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUN2RCxTQUFTLEVBQUUsNEJBQTRCO2FBQ3hDLENBQUMsQ0FBQyxDQUFDO1lBRUosSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSx3QkFBd0IsRUFBRSxDQUFDLENBQUM7Z0JBQzVFLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQStCLENBQUM7WUFFdEQseUNBQXlDO1lBQ3pDLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQW1DLENBQUM7WUFDekUsTUFBTSxlQUFlLEdBQWEsRUFBRSxDQUFDO1lBQ3JDLEtBQUssTUFBTSxFQUFFLElBQUksUUFBUSxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxlQUF1QyxDQUFDO2dCQUMzRCxJQUFJLE9BQU8sRUFBRSxNQUFNO29CQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBRUQsR0FBRyxDQUFDLElBQUksQ0FBQztnQkFDUCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUMzQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQy9CLFlBQVksRUFBRSxJQUFJLENBQUMsb0JBQW9CO2dCQUN2QyxhQUFhLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtnQkFDekMsZUFBZTtnQkFDZixRQUFRO2dCQUNSLHNCQUFzQixFQUFFLElBQUksQ0FBQyxzQkFBc0I7Z0JBQ25ELGVBQWU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLENBQUMsS0FBSyxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9ELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLGlDQUFpQyxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQZXJtaXNzaW9uIGV2YWx1YXRpb24gSFRUUCByb3V0ZXMgYW5kIGRlY2lzaW9uIHRyYWNraW5nLlxuICpcbiAqIFByb3ZpZGVzOlxuICogLSBQT1NUIC9ldmFsdWF0ZV9wZXJtaXNzaW9uIOKAlCBldmFsdWF0ZXMgdG9vbCBwZXJtaXNzaW9ucyB2aWEgTUNQLUFRTFxuICogLSBHRVQgL3Blcm1pc3Npb25zL3N0YXR1cyDigJQgcmV0dXJucyBjdXJyZW50IHBvbGljaWVzIGFuZCByZWNlbnQgZGVjaXNpb25zXG4gKiAtIERlY2lzaW9uIHRyYWNraW5nIHJpbmcgYnVmZmVyIGZvciB0aGUgbGl2ZSBkYXNoYm9hcmQgZmVlZFxuICovXG5cbmltcG9ydCBleHByZXNzLCB7IFJvdXRlciB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5cbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5cbi8vIOKUgOKUgCBQZXJtaXNzaW9uIERlY2lzaW9uIFRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUmluZyBidWZmZXIgb2YgcmVjZW50IHBlcm1pc3Npb24gZGVjaXNpb25zIGZvciB0aGUgbGl2ZSBkYXNoYm9hcmQgZmVlZC5cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICB0b29sX25hbWU6IHN0cmluZztcbiAgY29tbWFuZD86IHN0cmluZztcbiAgZGVjaXNpb246IHN0cmluZztcbiAgcmVhc29uPzogc3RyaW5nO1xufVxuXG5jb25zdCBERUNJU0lPTl9CVUZGRVJfU0laRSA9IDIwMDtcbmNvbnN0IHJlY2VudERlY2lzaW9uczogUGVybWlzc2lvbkRlY2lzaW9uW10gPSBbXTtcbmxldCBkZWNpc2lvbkNvdW50ZXIgPSAwO1xuXG4vKiogRXh0cmFjdCBhIHN0cmluZyBmaWVsZCBmcm9tIGEgcmVjb3JkLCB0cnlpbmcgbXVsdGlwbGUga2V5cyBpbiBvcmRlciAqL1xuZnVuY3Rpb24gZXh0cmFjdFN0cmluZyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBrZXlzOiBzdHJpbmdbXSwgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICBjb25zdCB2YWwgPSBvYmo/LltrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIHRyYWNrRGVjaXNpb24odG9vbE5hbWU6IHN0cmluZywgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gIGNvbnN0IGVudHJ5OiBQZXJtaXNzaW9uRGVjaXNpb24gPSB7XG4gICAgaWQ6IGBkLSR7KytkZWNpc2lvbkNvdW50ZXJ9YCxcbiAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB0b29sX25hbWU6IHRvb2xOYW1lLFxuICAgIGNvbW1hbmQ6IHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIGlucHV0Py5jb21tYW5kID09PSAnc3RyaW5nJyA/IGlucHV0LmNvbW1hbmQgOiB1bmRlZmluZWQsXG4gICAgZGVjaXNpb246IGV4dHJhY3RTdHJpbmcocmVzdWx0LCBbJ2RlY2lzaW9uJywgJ2JlaGF2aW9yJ10sICd1bmtub3duJyksXG4gICAgcmVhc29uOiBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydyZWFzb24nLCAnbWVzc2FnZSddLCAnJyksXG4gIH07XG4gIHJlY2VudERlY2lzaW9ucy51bnNoaWZ0KGVudHJ5KTtcbiAgaWYgKHJlY2VudERlY2lzaW9ucy5sZW5ndGggPiBERUNJU0lPTl9CVUZGRVJfU0laRSkge1xuICAgIHJlY2VudERlY2lzaW9ucy5sZW5ndGggPSBERUNJU0lPTl9CVUZGRVJfU0laRTtcbiAgfVxufVxuXG4vKiogSGVscGVyIHRvIGV4dHJhY3Qgc2luZ2xlIHJlc3VsdCBmcm9tIE1DUC1BUUwgYmF0Y2ggcmVzcG9uc2UgKi9cbmZ1bmN0aW9uIGFzU2luZ2xlUmVzdWx0KHJlc3VsdHM6IHVua25vd24pOiB7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0cykpIHJldHVybiByZXN1bHRzWzBdIHx8IHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnRW1wdHkgcmVzdWx0JyB9O1xuICByZXR1cm4gcmVzdWx0cyBhcyB7IHN1Y2Nlc3M6IGJvb2xlYW47IGRhdGE/OiB1bmtub3duOyBlcnJvcj86IHN0cmluZyB9O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHBlcm1pc3Npb24tcmVsYXRlZCByb3V0ZXMgb24gYSBnYXRld2F5IHJvdXRlci5cbiAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIE1DUC1BUUwgaGFuZGxlciBmb3IgcG9saWN5IGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMocm91dGVyOiBSb3V0ZXIsIGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIpOiB2b2lkIHtcbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9ldmFsdWF0ZV9wZXJtaXNzaW9uXG4gICAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBlbmRwb2ludCBmb3IgUHJlVG9vbFVzZSBob29rcy5cbiAgICogUm91dGVzIHRocm91Z2ggZXZhbHVhdGVfcGVybWlzc2lvbiBNQ1AtQVFMIFJFQUQgb3BlcmF0aW9uLlxuICAgKiBGYWlsLW9wZW46IHJldHVybnMgYWxsb3cgb24gYW55IGVycm9yIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3QgcGVybWlzc2lvbkxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKDEyMCwgNjBfMDAwKTtcbiAgcm91dGVyLnBvc3QoJy9ldmFsdWF0ZV9wZXJtaXNzaW9uJywgZXhwcmVzcy5qc29uKCksIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIGlmICghcGVybWlzc2lvbkxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICByZXMuanNvbih7IGRlY2lzaW9uOiAnYWxsb3cnIH0pOyAvLyBmYWlsIG9wZW4gb24gcmF0ZSBsaW1pdFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvZHkgPSByZXEuYm9keSBhcyB7XG4gICAgICB0b29sX25hbWU/OiBzdHJpbmc7XG4gICAgICBpbnB1dD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgcGxhdGZvcm0/OiBzdHJpbmc7XG4gICAgfTtcblxuICAgIC8vIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoTkZDKSBvbiBzdHJpbmcgaW5wdXRzIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICBjb25zdCB0b29sX25hbWUgPSB0eXBlb2YgYm9keS50b29sX25hbWUgPT09ICdzdHJpbmcnID8gYm9keS50b29sX25hbWUubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBib2R5LnBsYXRmb3JtID09PSAnc3RyaW5nJyA/IGJvZHkucGxhdGZvcm0ubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbnB1dCA9IGJvZHkuaW5wdXQ7XG5cbiAgICBpZiAoIXRvb2xfbmFtZSkge1xuICAgICAgcmVzLmpzb24oeyBkZWNpc2lvbjogJ2FsbG93JyB9KTsgLy8gZmFpbCBvcGVuIG9uIGJhZCBpbnB1dFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0TXMgPSBEYXRlLm5vdygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcFJlc3VsdCA9IGFzU2luZ2xlUmVzdWx0KGF3YWl0IGhhbmRsZXIuaGFuZGxlUmVhZCh7XG4gICAgICAgIG9wZXJhdGlvbjogJ2V2YWx1YXRlX3Blcm1pc3Npb24nLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICB0b29sX25hbWUsXG4gICAgICAgICAgaW5wdXQ6IGlucHV0IHx8IHt9LFxuICAgICAgICAgIHBsYXRmb3JtOiBwbGF0Zm9ybSB8fCAnY2xhdWRlX2NvZGUnLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgZWxhcHNlZE1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0TXM7XG5cbiAgICAgIGlmICghb3BSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICBsb2dnZXIud2FybihgW1dlYlVJL0dhdGV3YXldIGV2YWx1YXRlX3Blcm1pc3Npb24gZmFpbGVkICgke2VsYXBzZWRNc31tcyk6ICR7b3BSZXN1bHQuZXJyb3J9YCk7XG4gICAgICAgIHJlcy5qc29uKHsgZGVjaXNpb246ICdhbGxvdycgfSk7IC8vIGZhaWwgb3BlblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gKChvcFJlc3VsdC5kYXRhIGFzIHsgZGVjaXNpb24/OiBzdHJpbmcgfSk/LmRlY2lzaW9uID8/ICd1bmtub3duJyk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uOiAke3Rvb2xfbmFtZX0g4oaSICR7ZGVjaXNpb259ICgke2VsYXBzZWRNc31tcylgKTtcblxuICAgICAgLy8gVHJhY2sgZGVjaXNpb24gZm9yIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAgICAgIHRyYWNrRGVjaXNpb24odG9vbF9uYW1lLCBpbnB1dCB8fCB7fSwgb3BSZXN1bHQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICAgIHJlcy5qc29uKG9wUmVzdWx0LmRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgZWxhcHNlZE1zID0gRGF0ZS5ub3coKSAtIHN0YXJ0TXM7XG4gICAgICBsb2dnZXIuZXJyb3IoYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uIGVycm9yICgke2VsYXBzZWRNc31tcyk6YCwgZXJyKTtcbiAgICAgIHJlcy5qc29uKHsgZGVjaXNpb246ICdhbGxvdycgfSk7IC8vIGZhaWwgb3BlblxuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEdFVCAvYXBpL3Blcm1pc3Npb25zL3N0YXR1c1xuICAgKiBSZXR1cm5zIGN1cnJlbnQgcGVybWlzc2lvbiBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICAgKiBmb3IgdGhlIGxpdmUgcGVybWlzc2lvbnMgZGFzaGJvYXJkLlxuICAgKi9cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL3N0YXR1cycsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3BSZXN1bHQgPSBhc1NpbmdsZVJlc3VsdChhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoe1xuICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghb3BSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBvcFJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGdldCBwb2xpY2llcycgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIEV4dHJhY3QgY29uZmlybSBwYXR0ZXJucyBmcm9tIGVsZW1lbnRzXG4gICAgICBjb25zdCBlbGVtZW50cyA9IChkYXRhLmVsZW1lbnRzIHx8IFtdKSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgICBjb25zdCBjb25maXJtUGF0dGVybnM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGVsIG9mIGVsZW1lbnRzKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpcm0gPSBlbC5jb25maXJtUGF0dGVybnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChjb25maXJtPy5sZW5ndGgpIGNvbmZpcm1QYXR0ZXJucy5wdXNoKC4uLmNvbmZpcm0pO1xuICAgICAgfVxuXG4gICAgICByZXMuanNvbih7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRDb3VudDogZGF0YS5hY3RpdmVFbGVtZW50Q291bnQsXG4gICAgICAgIGhhc0FsbG93bGlzdDogZGF0YS5oYXNBbGxvd2xpc3QsXG4gICAgICAgIGRlbnlQYXR0ZXJuczogZGF0YS5jb21iaW5lZERlbnlQYXR0ZXJucyxcbiAgICAgICAgYWxsb3dQYXR0ZXJuczogZGF0YS5jb21iaW5lZEFsbG93UGF0dGVybnMsXG4gICAgICAgIGNvbmZpcm1QYXR0ZXJucyxcbiAgICAgICAgZWxlbWVudHMsXG4gICAgICAgIHBlcm1pc3Npb25Qcm9tcHRBY3RpdmU6IGRhdGEucGVybWlzc2lvblByb21wdEFjdGl2ZSxcbiAgICAgICAgcmVjZW50RGVjaXNpb25zLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tXZWJVSS9HYXRld2F5XSBwZXJtaXNzaW9ucy9zdGF0dXMgZXJyb3I6JywgZXJyKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gZ2V0IHBlcm1pc3Npb24gc3RhdHVzJyB9KTtcbiAgICB9XG4gIH0pO1xufVxuIl19
|
|
@@ -8,7 +8,12 @@
|
|
|
8
8
|
* and command arguments are hardcoded — no user-supplied shell input.
|
|
9
9
|
*/
|
|
10
10
|
import type { Request, Response } from 'express';
|
|
11
|
-
export declare function createSetupRoutes(
|
|
11
|
+
export declare function createSetupRoutes(opts?: {
|
|
12
|
+
/** Override install-mcp runner. For testing only — prefix signals test-only use. */
|
|
13
|
+
_runInstallMcp?: (client: string, version?: string) => Promise<string>;
|
|
14
|
+
/** Skip the sliding-window rate limiter. For testing only. */
|
|
15
|
+
_skipRateLimit?: boolean;
|
|
16
|
+
}): {
|
|
12
17
|
installHandler: (req: Request, res: Response) => Promise<void>;
|
|
13
18
|
openConfigHandler: (req: Request, res: Response) => Promise<void>;
|
|
14
19
|
versionHandler: (req: Request, res: Response) => Promise<void>;
|
|
@@ -19,4 +24,65 @@ export declare function createSetupRoutes(): {
|
|
|
19
24
|
verifyLicenseHandler: (req: Request, res: Response) => Promise<void>;
|
|
20
25
|
resendVerificationHandler: (req: Request, res: Response) => Promise<void>;
|
|
21
26
|
};
|
|
27
|
+
/** Result of attempting to apply the NVM launcher mitigation. */
|
|
28
|
+
export type NvmLauncherResult = 'applied' | 'not-applicable' | 'failed';
|
|
29
|
+
/**
|
|
30
|
+
* Orchestrates the NVM mitigation: detect → create launcher → patch config → telemetry.
|
|
31
|
+
* Extracted from installHandler to keep its cognitive complexity within SonarCloud limits.
|
|
32
|
+
* Returns a result enum rather than throwing so the caller always gets a clean signal.
|
|
33
|
+
*
|
|
34
|
+
* @param home - Override home directory (injectable for tests)
|
|
35
|
+
*/
|
|
36
|
+
export declare function applyNvmLauncherIfNeeded(client: string, home?: string): Promise<NvmLauncherResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Startup repair: re-creates the wrapper and re-patches all known JSON-format
|
|
39
|
+
* client configs on every server start. Handles two cases:
|
|
40
|
+
* 1. Wrapper was deleted — recreates it so configs pointing to it keep working.
|
|
41
|
+
* 2. Pre-existing install (user installed before this fix shipped) — patches
|
|
42
|
+
* configs that still use bare `npx`.
|
|
43
|
+
*
|
|
44
|
+
* Fire-and-forget from startWebServer. All errors are swallowed and logged.
|
|
45
|
+
*
|
|
46
|
+
* @param home - Override home directory (injectable for tests)
|
|
47
|
+
* @param configPathResolver - Override config path lookup (injectable for tests).
|
|
48
|
+
* Return null to skip a client entirely.
|
|
49
|
+
* Defaults to the production getConfigPath.
|
|
50
|
+
*/
|
|
51
|
+
export declare function repairNvmLauncherOnStartup(home?: string, configPathResolver?: (client: string) => string | null): Promise<void>;
|
|
52
|
+
/**
|
|
53
|
+
* Returns true if NVM is installed on this machine (macOS/Linux only).
|
|
54
|
+
* Checks process.env.NVM_DIR first (handles non-standard install locations),
|
|
55
|
+
* then falls back to ~/.nvm.
|
|
56
|
+
*
|
|
57
|
+
* @param home - Override home directory (defaults to os.homedir(); injectable for tests)
|
|
58
|
+
*/
|
|
59
|
+
export declare function isNvmPresent(home?: string): Promise<boolean>;
|
|
60
|
+
/**
|
|
61
|
+
* Creates ~/.dollhouse/bin/dollhousemcp-nvm.sh and returns its path.
|
|
62
|
+
*
|
|
63
|
+
* The NVM directory is resolved at generation time and hardcoded into the
|
|
64
|
+
* script. This is intentional: Claude Desktop does not source the user's
|
|
65
|
+
* shell profile, so $NVM_DIR would be unset when the wrapper runs. By
|
|
66
|
+
* embedding the absolute path we guarantee the correct NVM is found.
|
|
67
|
+
*
|
|
68
|
+
* The script sources NVM, then checks the active Node major version. If it
|
|
69
|
+
* is below 18 (the DollhouseMCP minimum), it tries `nvm use node` (highest
|
|
70
|
+
* installed) then `nvm use --lts` as a fallback. A final version check
|
|
71
|
+
* writes a warning to stderr if the node is still too old — that warning
|
|
72
|
+
* will appear in Claude Desktop's error log.
|
|
73
|
+
*
|
|
74
|
+
* @param home - Override home directory (injectable for tests)
|
|
75
|
+
* @param nvmDirOverride - Override the resolved NVM path (injectable for tests)
|
|
76
|
+
*/
|
|
77
|
+
export declare function ensureNvmLauncher(home?: string, nvmDirOverride?: string): Promise<string>;
|
|
78
|
+
/**
|
|
79
|
+
* Patches the dollhousemcp entry in an MCP client's JSON config to use
|
|
80
|
+
* the NVM-aware launcher instead of bare `npx`.
|
|
81
|
+
*
|
|
82
|
+
* Only acts on JSON-format configs. TOML configs (codex) are skipped.
|
|
83
|
+
* Silently no-ops if the config file is missing or unreadable.
|
|
84
|
+
*
|
|
85
|
+
* @param configPathOverride - Use this path instead of the platform default (injectable for tests)
|
|
86
|
+
*/
|
|
87
|
+
export declare function patchConfigForNvmLauncher(client: string, wrapperPath: string, configPathOverride?: string): Promise<void>;
|
|
22
88
|
//# sourceMappingURL=setupRoutes.d.ts.map
|
|
@@ -1 +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;AAkWjD,wBAAgB,iBAAiB,IAAI;
|
|
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;AAkWjD,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE;IACvC,oFAAoF;IACpF,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,8DAA8D;IAC9D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG;IACF,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;IAC9D,iBAAiB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,iBAAiB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,oBAAoB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,yBAAyB,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E,CA2cA;AAmCD,iEAAiE;AACjE,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,gBAAgB,GAAG,QAAQ,CAAC;AAOxE;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsB3G;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,SAAY,EAChB,kBAAkB,GAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,IAAoB,GACpE,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,IAAI,SAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBrE;AAyBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,SAAY,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4ClG;AAoBD;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,kBAAkB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4C/H"}
|