@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.
- package/CHANGELOG.md +4 -0
- package/dist/auto-dollhouse/portDiscovery.d.ts.map +1 -1
- package/dist/auto-dollhouse/portDiscovery.js +7 -4
- package/dist/di/Container.d.ts.map +1 -1
- package/dist/di/Container.js +4 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +18 -1
- package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationRouter.js +6 -1
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +16 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/SchemaDispatcher.js +2 -1
- package/dist/index.js +14 -2
- package/dist/server/tools/BuildInfoTools.d.ts +1 -0
- package/dist/server/tools/BuildInfoTools.d.ts.map +1 -1
- package/dist/server/tools/BuildInfoTools.js +2 -1
- package/dist/server/tools/MCPAQLTools.js +3 -1
- package/dist/services/ActivationStore.d.ts +8 -0
- package/dist/services/ActivationStore.d.ts.map +1 -1
- package/dist/services/ActivationStore.js +28 -29
- package/dist/services/BuildInfoService.d.ts +3 -0
- package/dist/services/BuildInfoService.d.ts.map +1 -1
- package/dist/services/BuildInfoService.js +18 -1
- package/dist/services/sessionIdentity.d.ts +24 -0
- package/dist/services/sessionIdentity.d.ts.map +1 -0
- package/dist/services/sessionIdentity.js +42 -0
- package/dist/utils/permissionAuthority.d.ts +38 -0
- package/dist/utils/permissionAuthority.d.ts.map +1 -0
- package/dist/utils/permissionAuthority.js +341 -0
- package/dist/utils/permissionHooks.d.ts.map +1 -1
- package/dist/utils/permissionHooks.js +10 -1
- package/dist/web/console/UnifiedConsole.d.ts +2 -0
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
- package/dist/web/console/UnifiedConsole.js +3 -1
- package/dist/web/portDiscovery.d.ts +7 -0
- package/dist/web/portDiscovery.d.ts.map +1 -1
- package/dist/web/portDiscovery.js +35 -4
- package/dist/web/public/app.js +28 -4
- package/dist/web/public/index.html +2 -0
- package/dist/web/public/permissions.css +456 -0
- package/dist/web/public/permissions.js +553 -16
- package/dist/web/public/sessions.css +119 -0
- package/dist/web/public/sessions.js +95 -9
- package/dist/web/public/setup.js +56 -4
- package/dist/web/public/styles.css +21 -2
- package/dist/web/routes/permissionRoutes.d.ts +4 -1
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +118 -6
- package/dist/web/routes/setupRoutes.d.ts +18 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +47 -26
- package/dist/web/server.d.ts +4 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +19 -1
- package/package.json +4 -3
- package/scripts/pretooluse-dollhouse.sh +78 -12
- package/scripts/pretooluse-vscode.sh +6 -9
- package/scripts/pretooluse-windsurf.sh +6 -9
- 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
|
|
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 =
|
|
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,
|
|
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 (
|
|
631
|
+
if (policySessions.length > 0) {
|
|
550
632
|
appendDivider();
|
|
551
|
-
|
|
552
|
-
for (var j = 0; j <
|
|
553
|
-
appendSessionItem(
|
|
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() {
|
package/dist/web/public/setup.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
|
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
|
|
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;
|
|
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"}
|