@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.
Files changed (69) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/README.md +4 -4
  3. package/README.md.backup +5 -5
  4. package/README.npm.md +4 -4
  5. package/dist/di/Container.d.ts +14 -0
  6. package/dist/di/Container.d.ts.map +1 -1
  7. package/dist/di/Container.js +43 -26
  8. package/dist/elements/agents/AgentManager.d.ts +11 -4
  9. package/dist/elements/agents/AgentManager.d.ts.map +1 -1
  10. package/dist/elements/agents/AgentManager.js +38 -11
  11. package/dist/elements/base/BaseElementManager.d.ts +10 -0
  12. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  13. package/dist/elements/base/BaseElementManager.js +26 -1
  14. package/dist/elements/ensembles/EnsembleManager.d.ts +1 -0
  15. package/dist/elements/ensembles/EnsembleManager.d.ts.map +1 -1
  16. package/dist/elements/ensembles/EnsembleManager.js +13 -2
  17. package/dist/elements/templates/Template.d.ts +33 -1
  18. package/dist/elements/templates/Template.d.ts.map +1 -1
  19. package/dist/elements/templates/Template.js +74 -15
  20. package/dist/elements/templates/TemplateManager.d.ts.map +1 -1
  21. package/dist/elements/templates/TemplateManager.js +8 -1
  22. package/dist/generated/version.d.ts +2 -2
  23. package/dist/generated/version.d.ts.map +1 -1
  24. package/dist/generated/version.js +3 -3
  25. package/dist/handlers/element-crud/createElement.js +2 -2
  26. package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
  27. package/dist/handlers/mcp-aql/SchemaDispatcher.js +8 -1
  28. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts +3 -0
  29. package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
  30. package/dist/handlers/strategies/EnsembleActivationStrategy.js +48 -9
  31. package/dist/index.js +19 -13
  32. package/dist/portfolio/DefaultElementProvider.d.ts +8 -0
  33. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  34. package/dist/portfolio/DefaultElementProvider.js +43 -1
  35. package/dist/security/contentValidator.d.ts +15 -0
  36. package/dist/security/contentValidator.d.ts.map +1 -1
  37. package/dist/security/contentValidator.js +40 -2
  38. package/dist/utils/TemplateRenderer.d.ts +9 -0
  39. package/dist/utils/TemplateRenderer.d.ts.map +1 -1
  40. package/dist/utils/TemplateRenderer.js +21 -1
  41. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  42. package/dist/web/console/IngestRoutes.js +193 -59
  43. package/dist/web/console/SessionNames.d.ts +18 -5
  44. package/dist/web/console/SessionNames.d.ts.map +1 -1
  45. package/dist/web/console/SessionNames.js +63 -8
  46. package/dist/web/console/StaleProcessRecovery.d.ts.map +1 -1
  47. package/dist/web/console/StaleProcessRecovery.js +5 -4
  48. package/dist/web/console/UnifiedConsole.js +3 -3
  49. package/dist/web/console/consoleToken.js +3 -3
  50. package/dist/web/portDiscovery.d.ts +1 -1
  51. package/dist/web/portDiscovery.d.ts.map +1 -1
  52. package/dist/web/portDiscovery.js +2 -2
  53. package/dist/web/public/app.js +65 -11
  54. package/dist/web/public/index.html +2 -0
  55. package/dist/web/public/logs.js +24 -2
  56. package/dist/web/public/metrics.js +22 -4
  57. package/dist/web/public/sessions.js +55 -8
  58. package/dist/web/public/setup.js +11 -2
  59. package/dist/web/public/styles.css +12 -0
  60. package/dist/web/routes/permissionRoutes.js +2 -2
  61. package/dist/web/routes/setupRoutes.d.ts +67 -1
  62. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  63. package/dist/web/routes/setupRoutes.js +298 -6
  64. package/dist/web/routes.d.ts.map +1 -1
  65. package/dist/web/routes.js +4 -2
  66. package/dist/web/server.d.ts.map +1 -1
  67. package/dist/web/server.js +14 -5
  68. package/package.json +5 -3
  69. package/server.json +2 -2
@@ -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('not available'))
156
+ .then(r => r.ok ? r.json() : Promise.reject(new Error('collection request failed')))
121
157
  .then(mergeCollectionData)
122
- .catch(() => { /* collection not available — portfolio-only mode */ });
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. Saved tab from last visit (localStorage)
1941
- // 2. Setup tab on first-ever visit
1942
- // 3. Portfolio (HTML default)
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
- const savedTab = localStorage.getItem(TAB_KEY);
2070
- if (savedTab) {
2071
- switchToTab(savedTab);
2072
- lazyInitTab(savedTab, tabInits);
2073
- } else if (!localStorage.getItem(SETUP_SEEN_KEY)) {
2074
- localStorage.setItem(SETUP_SEEN_KEY, '1');
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">
@@ -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 = () => setStatus('connected');
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 { /* network error, will retry */ }
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
- } catch { /* network error */ }
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.innerHTML = '';
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
- var SESSION_POLL_INTERVAL = 5000;
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-filters');
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) return;
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 > 20) {
445
+ if (document.getElementById('log-session-filter') || retries > SESSION_FILTER_INJECTION_MAX_RETRIES) {
399
446
  clearInterval(tryInject);
400
447
  }
401
- }, 500);
448
+ }, SESSION_FILTER_INJECTION_RETRY_INTERVAL);
402
449
  }
403
450
 
404
451
  if (document.readyState === 'loading') {
@@ -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
- installBtn.textContent = isPinned ? `Configure v${pinnedVersion}` : 'Configure Now';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRy9DLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBY25GLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBQ2pDLE1BQU0sZUFBZSxHQUF5QixFQUFFLENBQUM7QUFDakQsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRXhCLDBFQUEwRTtBQUMxRSxTQUFTLGFBQWEsQ0FBQyxHQUE0QixFQUFFLElBQWMsRUFBRSxRQUFnQjtJQUNuRixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtZQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzFDLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsUUFBZ0IsRUFBRSxLQUE4QixFQUFFLE1BQStCO0lBQ3RHLE1BQU0sS0FBSyxHQUF1QjtRQUNoQyxFQUFFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtRQUM1QixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7UUFDbkMsU0FBUyxFQUFFLFFBQVE7UUFDbkIsT0FBTyxFQUFFLFFBQVEsS0FBSyxNQUFNLElBQUksT0FBTyxLQUFLLEVBQUUsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMs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KiBQZXJtaXNzaW9uIGV2YWx1YXRpb24gSFRUUCByb3V0ZXMgYW5kIGRlY2lzaW9uIHRyYWNraW5nLlxuICpcbiAqIFByb3ZpZGVzOlxuICogLSBQT1NUIC9ldmFsdWF0ZV9wZXJtaXNzaW9uIOKAlCBldmFsdWF0ZXMgdG9vbCBwZXJtaXNzaW9ucyB2aWEgTUNQLUFRTFxuICogLSBHRVQgL3Blcm1pc3Npb25zL3N0YXR1cyDigJQgcmV0dXJucyBjdXJyZW50IHBvbGljaWVzIGFuZCByZWNlbnQgZGVjaXNpb25zXG4gKiAtIERlY2lzaW9uIHRyYWNraW5nIHJpbmcgYnVmZmVyIGZvciB0aGUgbGl2ZSBkYXNoYm9hcmQgZmVlZFxuICovXG5cbmltcG9ydCBleHByZXNzLCB7IFJvdXRlciB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5cbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5cbi8vIOKUgOKUgCBQZXJtaXNzaW9uIERlY2lzaW9uIFRyYWNraW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUmluZyBidWZmZXIgb2YgcmVjZW50IHBlcm1pc3Npb24gZGVjaXNpb25zIGZvciB0aGUgbGl2ZSBkYXNoYm9hcmQgZmVlZC5cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvbiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogc3RyaW5nO1xuICB0b29sX25hbWU6IHN0cmluZztcbiAgY29tbWFuZD86IHN0cmluZztcbiAgZGVjaXNpb246IHN0cmluZztcbiAgcmVhc29uPzogc3RyaW5nO1xufVxuXG5jb25zdCBERUNJU0lPTl9CVUZGRVJfU0laRSA9IDIwMDtcbmNvbnN0IHJlY2VudERlY2lzaW9uczogUGVybWlzc2lvbkRlY2lzaW9uW10gPSBbXTtcbmxldCBkZWNpc2lvbkNvdW50ZXIgPSAwO1xuXG4vKiogRXh0cmFjdCBhIHN0cmluZyBmaWVsZCBmcm9tIGEgcmVjb3JkLCB0cnlpbmcgbXVsdGlwbGUga2V5cyBpbiBvcmRlciAqL1xuZnVuY3Rpb24gZXh0cmFjdFN0cmluZyhvYmo6IFJlY29yZDxzdHJpbmcsIHVua25vd24+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;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;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,CAqbA"}
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"}