@dollhousemcp/mcp-server 2.0.25 → 2.0.26

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 (62) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/auto-dollhouse/portDiscovery.d.ts.map +1 -1
  3. package/dist/auto-dollhouse/portDiscovery.js +7 -4
  4. package/dist/di/Container.d.ts.map +1 -1
  5. package/dist/di/Container.js +4 -2
  6. package/dist/generated/version.d.ts +2 -2
  7. package/dist/generated/version.js +3 -3
  8. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  9. package/dist/handlers/mcp-aql/MCPAQLHandler.js +18 -1
  10. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  11. package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
  12. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  13. package/dist/handlers/mcp-aql/OperationSchema.js +16 -1
  14. package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
  15. package/dist/handlers/mcp-aql/SchemaDispatcher.js +2 -1
  16. package/dist/index.js +14 -2
  17. package/dist/server/tools/BuildInfoTools.d.ts +1 -0
  18. package/dist/server/tools/BuildInfoTools.d.ts.map +1 -1
  19. package/dist/server/tools/BuildInfoTools.js +2 -1
  20. package/dist/server/tools/MCPAQLTools.js +3 -1
  21. package/dist/services/ActivationStore.d.ts +8 -0
  22. package/dist/services/ActivationStore.d.ts.map +1 -1
  23. package/dist/services/ActivationStore.js +28 -29
  24. package/dist/services/BuildInfoService.d.ts +3 -0
  25. package/dist/services/BuildInfoService.d.ts.map +1 -1
  26. package/dist/services/BuildInfoService.js +18 -1
  27. package/dist/services/sessionIdentity.d.ts +24 -0
  28. package/dist/services/sessionIdentity.d.ts.map +1 -0
  29. package/dist/services/sessionIdentity.js +42 -0
  30. package/dist/utils/permissionAuthority.d.ts +38 -0
  31. package/dist/utils/permissionAuthority.d.ts.map +1 -0
  32. package/dist/utils/permissionAuthority.js +341 -0
  33. package/dist/utils/permissionHooks.d.ts.map +1 -1
  34. package/dist/utils/permissionHooks.js +10 -1
  35. package/dist/web/console/UnifiedConsole.d.ts +2 -0
  36. package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
  37. package/dist/web/console/UnifiedConsole.js +3 -1
  38. package/dist/web/portDiscovery.d.ts +7 -0
  39. package/dist/web/portDiscovery.d.ts.map +1 -1
  40. package/dist/web/portDiscovery.js +35 -4
  41. package/dist/web/public/app.js +28 -4
  42. package/dist/web/public/index.html +2 -0
  43. package/dist/web/public/permissions.css +456 -0
  44. package/dist/web/public/permissions.js +553 -16
  45. package/dist/web/public/sessions.css +119 -0
  46. package/dist/web/public/sessions.js +95 -9
  47. package/dist/web/public/setup.js +56 -4
  48. package/dist/web/public/styles.css +21 -2
  49. package/dist/web/routes/permissionRoutes.d.ts +4 -1
  50. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  51. package/dist/web/routes/permissionRoutes.js +118 -6
  52. package/dist/web/routes/setupRoutes.d.ts +18 -0
  53. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  54. package/dist/web/routes/setupRoutes.js +47 -26
  55. package/dist/web/server.d.ts +4 -0
  56. package/dist/web/server.d.ts.map +1 -1
  57. package/dist/web/server.js +19 -1
  58. package/package.json +4 -3
  59. package/scripts/pretooluse-dollhouse.sh +78 -12
  60. package/scripts/pretooluse-vscode.sh +6 -9
  61. package/scripts/pretooluse-windsurf.sh +6 -9
  62. package/server.json +2 -2
@@ -86,6 +86,96 @@
86
86
  border-bottom: 1px solid var(--line, #c8d5e9);
87
87
  }
88
88
 
89
+ .session-dropdown-heading--toggle {
90
+ display: flex;
91
+ align-items: center;
92
+ justify-content: space-between;
93
+ gap: 0.75rem;
94
+ }
95
+
96
+ .session-dropdown-heading-label {
97
+ min-width: 0;
98
+ }
99
+
100
+ .session-dropdown-toggle-group {
101
+ display: inline-flex;
102
+ align-items: center;
103
+ gap: 0.45rem;
104
+ flex-shrink: 0;
105
+ }
106
+
107
+ .session-dropdown-toggle-label {
108
+ font-family: var(--font-mono, monospace);
109
+ font-size: 0.68rem;
110
+ font-weight: 700;
111
+ color: var(--ink-500, #677893);
112
+ text-transform: none;
113
+ letter-spacing: 0.02em;
114
+ }
115
+
116
+ .session-dropdown-switch {
117
+ --session-toggle-width: 3.8rem;
118
+ --session-toggle-height: 1.55rem;
119
+ appearance: none;
120
+ border: 1px solid var(--line, #c8d5e9);
121
+ border-radius: 999px;
122
+ background: var(--paper-strong, #fff);
123
+ color: var(--ink-700, #324563);
124
+ width: var(--session-toggle-width);
125
+ height: var(--session-toggle-height);
126
+ padding: 0;
127
+ cursor: pointer;
128
+ transition: border-color 0.15s, background 0.15s, color 0.15s;
129
+ position: relative;
130
+ display: inline-grid;
131
+ grid-template-columns: 1fr 1fr;
132
+ align-items: center;
133
+ overflow: hidden;
134
+ }
135
+
136
+ .session-dropdown-switch[data-state="on"] {
137
+ background: color-mix(in srgb, var(--signal-2, #3b82f6) 12%, var(--paper-strong, #fff));
138
+ border-color: color-mix(in srgb, var(--signal-2, #3b82f6) 45%, var(--line, #c8d5e9));
139
+ color: var(--signal, #1e40af);
140
+ }
141
+
142
+ .session-dropdown-switch:hover,
143
+ .session-dropdown-switch:focus-visible {
144
+ border-color: var(--signal-2, #3b82f6);
145
+ outline: none;
146
+ }
147
+
148
+ .session-dropdown-switch-label {
149
+ position: relative;
150
+ z-index: 1;
151
+ text-align: center;
152
+ font-family: var(--font-mono, monospace);
153
+ font-size: 0.66rem;
154
+ font-weight: 700;
155
+ color: var(--ink-500, #677893);
156
+ transition: color 0.15s;
157
+ }
158
+
159
+ .session-dropdown-switch[data-state="off"] .session-dropdown-switch-label--off,
160
+ .session-dropdown-switch[data-state="on"] .session-dropdown-switch-label--on {
161
+ color: var(--signal, #1e40af);
162
+ }
163
+
164
+ .session-dropdown-switch-thumb {
165
+ position: absolute;
166
+ top: 2px;
167
+ left: 2px;
168
+ width: calc((var(--session-toggle-width) - 6px) / 2);
169
+ height: calc(var(--session-toggle-height) - 6px);
170
+ border-radius: 999px;
171
+ background: color-mix(in srgb, var(--signal-2, #3b82f6) 16%, var(--paper-strong, #fff));
172
+ transition: transform 0.18s ease;
173
+ }
174
+
175
+ .session-dropdown-switch[data-state="on"] .session-dropdown-switch-thumb {
176
+ transform: translateX(calc((var(--session-toggle-width) - 6px) / 2));
177
+ }
178
+
89
179
  .session-dropdown-divider {
90
180
  height: 1px;
91
181
  background: var(--line, #c8d5e9);
@@ -197,6 +287,35 @@
197
287
  color: var(--ink-900, #e0e8f0);
198
288
  }
199
289
 
290
+ [data-theme="dark"] .session-dropdown-toggle-label {
291
+ color: var(--ink-500, #8899bb);
292
+ }
293
+
294
+ [data-theme="dark"] .session-dropdown-switch {
295
+ background: var(--paper-strong, #1a1a2e);
296
+ border-color: var(--line, #2a3a5e);
297
+ color: var(--ink-900, #e0e8f0);
298
+ }
299
+
300
+ [data-theme="dark"] .session-dropdown-switch[data-state="on"] {
301
+ background: color-mix(in srgb, var(--signal-2, #3b82f6) 18%, var(--paper-strong, #1a1a2e));
302
+ border-color: color-mix(in srgb, var(--signal-2, #3b82f6) 55%, var(--line, #2a3a5e));
303
+ color: var(--signal-2, #93c5fd);
304
+ }
305
+
306
+ [data-theme="dark"] .session-dropdown-switch-label {
307
+ color: var(--ink-500, #8899bb);
308
+ }
309
+
310
+ [data-theme="dark"] .session-dropdown-switch[data-state="off"] .session-dropdown-switch-label--off,
311
+ [data-theme="dark"] .session-dropdown-switch[data-state="on"] .session-dropdown-switch-label--on {
312
+ color: var(--signal-2, #93c5fd);
313
+ }
314
+
315
+ [data-theme="dark"] .session-dropdown-switch-thumb {
316
+ background: color-mix(in srgb, var(--signal-2, #3b82f6) 24%, var(--paper-strong, #1a1a2e));
317
+ }
318
+
200
319
  /* Kill button */
201
320
  .session-kill-btn {
202
321
  display: inline-flex;
@@ -24,6 +24,7 @@
24
24
  var SESSION_FILTER_INJECTION_RETRY_INTERVAL = getConfiguredNumber('sessionFilterInjectionRetryIntervalMs', 500);
25
25
  var SESSION_FILTER_INJECTION_MAX_RETRIES = getConfiguredNumber('sessionFilterInjectionMaxRetries', 20);
26
26
  var LEADER_RELOAD_DEBOUNCE_MS = getConfiguredNumber('leaderReloadDebounceMs', 150);
27
+ var POLICY_DEBUG_VISIBILITY_KEY = 'dollhouse.policyDebugVisible';
27
28
  var sessions = [];
28
29
  var policySessions = [];
29
30
  var filterSessionId = '';
@@ -31,6 +32,23 @@
31
32
  var lastSessionKey = ''; // tracks session list identity to avoid unnecessary rebuilds
32
33
  var lastReloadTargetVersion = '';
33
34
  var pendingLeaderReloadTimer = null;
35
+ var showPolicySessions = loadPolicyDebugVisibility();
36
+
37
+ function loadPolicyDebugVisibility() {
38
+ try {
39
+ return window.localStorage.getItem(POLICY_DEBUG_VISIBILITY_KEY) === 'true';
40
+ } catch (err) {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ function persistPolicyDebugVisibility(nextVisible) {
46
+ try {
47
+ window.localStorage.setItem(POLICY_DEBUG_VISIBILITY_KEY, nextVisible ? 'true' : 'false');
48
+ } catch (err) {
49
+ // best-effort only
50
+ }
51
+ }
34
52
 
35
53
  function parseSemver(version) {
36
54
  if (typeof version !== 'string') return null;
@@ -175,6 +193,9 @@
175
193
 
176
194
  function getSelectableSessions() {
177
195
  var live = getLiveSessions();
196
+ if (!showPolicySessions) {
197
+ return live;
198
+ }
178
199
  var liveIds = new Set(live.map(function(s) { return s.sessionId; }));
179
200
  var merged = live.slice();
180
201
  for (var i = 0; i < policySessions.length; i++) {
@@ -234,7 +255,31 @@
234
255
  function sessionListKey(list) {
235
256
  return list.map(function(s) {
236
257
  return s.sessionId + ':' + s.status + ':' + (isPolicyOnlySession(s) ? 'policy' : 'live');
237
- }).join(',');
258
+ }).join(',')
259
+ + '|policyDebug:' + (showPolicySessions ? 'on' : 'off')
260
+ + '|knownPolicy:' + policySessions.map(function(session) { return session.sessionId; }).join(',');
261
+ }
262
+
263
+ function setPolicyDebugVisibility(nextVisible, keepDropdownOpen) {
264
+ var normalized = !!nextVisible;
265
+ if (showPolicySessions === normalized) return;
266
+ showPolicySessions = normalized;
267
+ persistPolicyDebugVisibility(showPolicySessions);
268
+
269
+ if (!showPolicySessions) {
270
+ var current = getSelectableSessions().find(function(session) {
271
+ return session.sessionId === filterSessionId;
272
+ });
273
+ if (!current && filterSessionId) {
274
+ applyFilter('');
275
+ }
276
+ }
277
+
278
+ updateSessionIndicator({ keepOpen: !!keepDropdownOpen });
279
+ updateSessionFilterOptions();
280
+ window.dispatchEvent(new CustomEvent('dollhouse:policy-debug-visibility-changed', {
281
+ detail: { visible: showPolicySessions },
282
+ }));
238
283
  }
239
284
 
240
285
  // Apply session filter and update all UI to reflect it
@@ -343,10 +388,11 @@
343
388
  }
344
389
 
345
390
  // Build or rebuild the session indicator — only when session list actually changes
346
- function updateSessionIndicator() {
391
+ function updateSessionIndicator(options) {
392
+ var keepOpen = !!(options && options.keepOpen);
347
393
  var active = getLiveSessions();
348
394
  var selectable = getSelectableSessions();
349
- var policyOnly = selectable.filter(function(s) { return isPolicyOnlySession(s); });
395
+ var visiblePolicyOnly = selectable.filter(function(s) { return isPolicyOnlySession(s); });
350
396
  var key = sessionListKey(selectable);
351
397
 
352
398
  // If sessions haven't changed, just refresh selection state
@@ -385,7 +431,7 @@
385
431
  var dropdown = document.createElement('div');
386
432
  dropdown.className = 'session-dropdown';
387
433
  dropdown.setAttribute('role', 'listbox');
388
- dropdown.hidden = true;
434
+ dropdown.hidden = !keepOpen;
389
435
 
390
436
  // "All Sessions" item
391
437
  var allItem = document.createElement('div');
@@ -403,7 +449,7 @@
403
449
 
404
450
  var allCount = document.createElement('span');
405
451
  allCount.className = 'session-dropdown-role';
406
- allCount.textContent = allSessionsSummary(count, policyOnly.length);
452
+ allCount.textContent = allSessionsSummary(count, visiblePolicyOnly.length);
407
453
  allItem.appendChild(allCount);
408
454
 
409
455
  allItem.addEventListener('click', function(e) {
@@ -425,6 +471,42 @@
425
471
  dropdown.appendChild(heading);
426
472
  }
427
473
 
474
+ function appendDebugHeading() {
475
+ var heading = document.createElement('div');
476
+ heading.className = 'session-dropdown-heading session-dropdown-heading--toggle';
477
+
478
+ var title = document.createElement('span');
479
+ title.className = 'session-dropdown-heading-label';
480
+ title.textContent = 'Persisted Policy State (Debug Info)';
481
+ heading.appendChild(title);
482
+
483
+ var controls = document.createElement('div');
484
+ controls.className = 'session-dropdown-toggle-group';
485
+
486
+ var visibleLabel = document.createElement('span');
487
+ visibleLabel.className = 'session-dropdown-toggle-label';
488
+ visibleLabel.textContent = 'Visible';
489
+ controls.appendChild(visibleLabel);
490
+
491
+ var toggle = document.createElement('button');
492
+ toggle.type = 'button';
493
+ toggle.className = 'session-dropdown-switch';
494
+ toggle.dataset.state = showPolicySessions ? 'on' : 'off';
495
+ toggle.setAttribute('aria-pressed', showPolicySessions ? 'true' : 'false');
496
+ toggle.setAttribute('aria-label', 'Toggle persisted policy state debug visibility');
497
+ toggle.innerHTML = '<span class="session-dropdown-switch-label session-dropdown-switch-label--off">Off</span>'
498
+ + '<span class="session-dropdown-switch-label session-dropdown-switch-label--on">On</span>'
499
+ + '<span class="session-dropdown-switch-thumb" aria-hidden="true"></span>';
500
+ toggle.addEventListener('click', function(e) {
501
+ e.stopPropagation();
502
+ setPolicyDebugVisibility(!showPolicySessions, true);
503
+ });
504
+ controls.appendChild(toggle);
505
+
506
+ heading.appendChild(controls);
507
+ dropdown.appendChild(heading);
508
+ }
509
+
428
510
  // Session items — leader first, then followers
429
511
  var sorted = active.slice().sort(function(a, b) {
430
512
  if (a.isLeader && !b.isLeader) return -1;
@@ -546,11 +628,11 @@
546
628
  }
547
629
  }
548
630
 
549
- if (policyOnly.length > 0) {
631
+ if (policySessions.length > 0) {
550
632
  appendDivider();
551
- appendHeading('Persisted Policy State (Debug Info)');
552
- for (var j = 0; j < policyOnly.length; j++) {
553
- appendSessionItem(policyOnly[j]);
633
+ appendDebugHeading();
634
+ for (var j = 0; j < visiblePolicyOnly.length; j++) {
635
+ appendSessionItem(visiblePolicyOnly[j]);
554
636
  }
555
637
  }
556
638
 
@@ -561,6 +643,7 @@
561
643
  indicator.appendChild(wrapper);
562
644
 
563
645
  dropdownBuilt = true;
646
+ box.setAttribute('aria-expanded', keepOpen ? 'true' : 'false');
564
647
 
565
648
  // Apply current selection state
566
649
  refreshSelectionState();
@@ -661,8 +744,11 @@
661
744
  getFilterSessionId: function() { return filterSessionId; },
662
745
  displayName: displayName,
663
746
  getSessions: function() { return sessions; },
747
+ getLiveSessions: getLiveSessions,
664
748
  getSelectableSessions: getSelectableSessions,
665
749
  setPolicySessions: setPolicySessions,
750
+ isPolicyDebugVisible: function() { return showPolicySessions; },
751
+ setPolicyDebugVisibility: setPolicyDebugVisibility,
666
752
  };
667
753
 
668
754
  function init() {
@@ -32,12 +32,64 @@
32
32
  const HOOK_BASE_SCRIPT = `#!/bin/bash
33
33
  # pretooluse-dollhouse.sh — shared hook bridge for DollhouseMCP
34
34
 
35
- PORT_FILE="$HOME/.dollhouse/run/permission-server.port"
35
+ RUN_DIR="$HOME/.dollhouse/run"
36
+ PORT_FILE="$RUN_DIR/permission-server.port"
36
37
  HOOK_PLATFORM="\${DOLLHOUSE_HOOK_PLATFORM:-claude_code}"
37
38
 
38
- [[ -f "$PORT_FILE" ]] || exit 0
39
- PORT=$(cat "$PORT_FILE" 2>/dev/null)
40
- [[ "$PORT" =~ ^[0-9]+$ ]] || exit 0
39
+ read_port_from_file() {
40
+ local file_path="$1"
41
+ local port_value
42
+
43
+ [[ -f "$file_path" ]] || return 1
44
+ port_value=$(cat "$file_path" 2>/dev/null)
45
+ [[ "$port_value" =~ ^[0-9]+$ ]] || return 1
46
+ printf '%s\\n' "$port_value"
47
+ }
48
+
49
+ restore_latest_port_file() {
50
+ local port_value="$1"
51
+
52
+ [[ "$port_value" =~ ^[0-9]+$ ]] || return 1
53
+ mkdir -p "$RUN_DIR" 2>/dev/null || return 1
54
+ printf '%s' "$port_value" > "$PORT_FILE" 2>/dev/null || return 1
55
+ }
56
+
57
+ find_latest_live_pid_port_file() {
58
+ local candidate
59
+ local file_name
60
+ local pid
61
+
62
+ while IFS= read -r candidate; do
63
+ [[ -e "$candidate" ]] || continue
64
+ file_name="\${candidate##*/}"
65
+ pid="\${file_name#permission-server-}"
66
+ pid="\${pid%.port}"
67
+
68
+ if [[ "$pid" =~ ^[0-9]+$ ]] && kill -0 "$pid" 2>/dev/null; then
69
+ printf '%s\\n' "$candidate"
70
+ return 0
71
+ fi
72
+ done < <(ls -1t "$RUN_DIR"/permission-server-*.port 2>/dev/null || true)
73
+
74
+ return 1
75
+ }
76
+
77
+ resolve_permission_port() {
78
+ local candidate_file
79
+ local port_value
80
+
81
+ if port_value=$(read_port_from_file "$PORT_FILE"); then
82
+ printf '%s\\n' "$port_value"
83
+ return 0
84
+ fi
85
+
86
+ candidate_file=$(find_latest_live_pid_port_file) || return 1
87
+ port_value=$(read_port_from_file "$candidate_file") || return 1
88
+ restore_latest_port_file "$port_value" >/dev/null 2>&1 || true
89
+ printf '%s\\n' "$port_value"
90
+ }
91
+
92
+ PORT=$(resolve_permission_port) || exit 0
41
93
 
42
94
  INPUT=$(cat)
43
95
  TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // .toolName // .tool // .name // empty' 2>/dev/null)
@@ -221,6 +221,12 @@ p, li { max-width: 69ch; }
221
221
  color: var(--ink-950);
222
222
  }
223
223
 
224
+ .stat--session strong {
225
+ font-family: var(--font-mono);
226
+ font-size: 0.8rem;
227
+ letter-spacing: 0.01em;
228
+ }
229
+
224
230
  /* Theme toggle */
225
231
  .theme-toggle {
226
232
  border: 1px solid color-mix(in srgb, var(--signal) 24%, var(--line));
@@ -986,7 +992,7 @@ body.modal-open { overflow: hidden; }
986
992
 
987
993
  .modal-header {
988
994
  display: grid;
989
- grid-template-areas: "heading close" "meta close";
995
+ grid-template-areas: "heading actions" "meta actions";
990
996
  grid-template-columns: 1fr auto;
991
997
  gap: 0.2rem 0.65rem;
992
998
  padding: 0.9rem 1rem 0.75rem;
@@ -1049,8 +1055,21 @@ body.modal-open { overflow: hidden; }
1049
1055
  flex-wrap: wrap;
1050
1056
  }
1051
1057
 
1058
+ .modal-header-actions {
1059
+ grid-area: actions;
1060
+ display: inline-flex;
1061
+ align-items: center;
1062
+ gap: 0.45rem;
1063
+ justify-self: end;
1064
+ }
1065
+
1066
+ .modal-header-actions .modal-action-btn {
1067
+ min-height: 1.85rem;
1068
+ border-radius: 999px;
1069
+ padding: 0.26rem 0.78rem;
1070
+ }
1071
+
1052
1072
  .modal-close {
1053
- grid-area: close;
1054
1073
  align-self: start;
1055
1074
  appearance: none;
1056
1075
  border: 1px solid color-mix(in srgb, var(--line) 82%, var(--paper-strong));
@@ -12,5 +12,8 @@ import type { MCPAQLHandler } from '../../handlers/mcp-aql/MCPAQLHandler.js';
12
12
  * Register permission-related routes on a gateway router.
13
13
  * Must be called with the MCP-AQL handler for policy evaluation.
14
14
  */
15
- export declare function registerPermissionRoutes(router: Router, handler: MCPAQLHandler): void;
15
+ export interface RegisterPermissionRoutesOptions {
16
+ homeDir?: string;
17
+ }
18
+ export declare function registerPermissionRoutes(router: Router, handler: MCPAQLHandler, options?: RegisterPermissionRoutesOptions): void;
16
19
  //# sourceMappingURL=permissionRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissionRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/permissionRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AA+Q7E;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA0IrF"}
1
+ {"version":3,"file":"permissionRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/permissionRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AA8T7E;;;GAGG;AACH,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,+BAAoC,GAC5C,IAAI,CA+NN"}