forkit-connect 0.1.13 → 0.1.15
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/dist/cli.js +14 -14
- package/dist/launcher.js +79 -142
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -90,7 +90,7 @@ const PUBLIC_COMMANDS = [
|
|
|
90
90
|
['workspace', 'List, select, or inspect optional governed workspace/project scope'],
|
|
91
91
|
['runtime', 'Register or review governed runtimes for the current repo/worktree'],
|
|
92
92
|
['register', 'Register ready local models into the current scope'],
|
|
93
|
-
['ignore', '
|
|
93
|
+
['ignore', 'Deny one detected local model on this device'],
|
|
94
94
|
['doctor', 'Run local environment diagnostics'],
|
|
95
95
|
];
|
|
96
96
|
const ADVANCED_COMMAND_GROUPS = [
|
|
@@ -139,7 +139,7 @@ function usage() {
|
|
|
139
139
|
console.log(' --no-api-key Skip automatic runtime API key creation');
|
|
140
140
|
console.log(' --dry-run Show the inferred runtime payload without creating it');
|
|
141
141
|
console.log(' --all-ready Register every ready local model in the current scope');
|
|
142
|
-
console.log(' --ignore-model <name>
|
|
142
|
+
console.log(' --ignore-model <name> Deny a detected model on this device with --ignore-digest');
|
|
143
143
|
console.log(' --ignore-digest <sha> Digest used with --ignore-model');
|
|
144
144
|
console.log(' --digest <sha> Digest used by ignore when the model name is ambiguous');
|
|
145
145
|
console.log(' --interval-seconds <n> Override daemon scan interval');
|
|
@@ -1022,7 +1022,7 @@ function buildInteractiveInboxSections(inbox) {
|
|
|
1022
1022
|
shellLine('Ready to connect', inbox.groups.ready_to_connect.length),
|
|
1023
1023
|
shellLine('Needs confirmation', inbox.groups.needs_confirmation.length),
|
|
1024
1024
|
shellLine('Connected', inbox.groups.connected.length),
|
|
1025
|
-
shellLine('
|
|
1025
|
+
shellLine('Denied on this device', inbox.groups.ignored.length),
|
|
1026
1026
|
...(inbox.summary.next_recommended_action ? [shellLine('Next action', formatSmartInboxActionValue(inbox.summary.next_recommended_action))] : []),
|
|
1027
1027
|
],
|
|
1028
1028
|
},
|
|
@@ -1044,7 +1044,7 @@ function buildInteractiveInboxItemSections(item, group) {
|
|
|
1044
1044
|
: group === 'connected'
|
|
1045
1045
|
? 'Connected'
|
|
1046
1046
|
: group === 'ignored'
|
|
1047
|
-
? '
|
|
1047
|
+
? 'Denied on this device'
|
|
1048
1048
|
: group.replaceAll('_', ' ');
|
|
1049
1049
|
const detailKeys = [
|
|
1050
1050
|
'verification_summary',
|
|
@@ -1424,7 +1424,7 @@ function formatSmartInboxActionValue(action, itemType, connectableModelName) {
|
|
|
1424
1424
|
case 'defer':
|
|
1425
1425
|
return 'Ask Later';
|
|
1426
1426
|
case 'ignore':
|
|
1427
|
-
return '
|
|
1427
|
+
return 'Deny on This Device';
|
|
1428
1428
|
default:
|
|
1429
1429
|
return action.replaceAll('_', ' ');
|
|
1430
1430
|
}
|
|
@@ -1451,7 +1451,7 @@ function printSmartInbox(inbox) {
|
|
|
1451
1451
|
printInboxGroup('Ready to Connect', inbox.groups.ready_to_connect);
|
|
1452
1452
|
printInboxGroup('Needs Confirmation', inbox.groups.needs_confirmation);
|
|
1453
1453
|
printInboxGroup('Connected', inbox.groups.connected);
|
|
1454
|
-
printInboxGroup('
|
|
1454
|
+
printInboxGroup('Denied on This Device', inbox.groups.ignored);
|
|
1455
1455
|
if (inbox.summary.next_recommended_action) {
|
|
1456
1456
|
console.log(`Next recommended action: ${formatSmartInboxActionValue(inbox.summary.next_recommended_action)}`);
|
|
1457
1457
|
}
|
|
@@ -1881,11 +1881,11 @@ async function run() {
|
|
|
1881
1881
|
if (ignoreModel && ignoreDigest) {
|
|
1882
1882
|
const ignored = service.markModelIgnored(ignoreModel, ignoreDigest);
|
|
1883
1883
|
if (!ignored) {
|
|
1884
|
-
console.error(`[forkit-connect] Model not found for
|
|
1884
|
+
console.error(`[forkit-connect] Model not found for deny-on-this-device: ${ignoreModel} ${ignoreDigest}`);
|
|
1885
1885
|
process.exitCode = 2;
|
|
1886
1886
|
return;
|
|
1887
1887
|
}
|
|
1888
|
-
console.log(`[forkit-connect]
|
|
1888
|
+
console.log(`[forkit-connect] Denied model on this device: ${ignoreModel} (${ignoreDigest})`);
|
|
1889
1889
|
return;
|
|
1890
1890
|
}
|
|
1891
1891
|
const result = await service.runDiscoveryCycle();
|
|
@@ -2840,7 +2840,7 @@ async function run() {
|
|
|
2840
2840
|
case 'connected':
|
|
2841
2841
|
return 'Connected';
|
|
2842
2842
|
case 'ignored':
|
|
2843
|
-
return '
|
|
2843
|
+
return 'Denied on this device';
|
|
2844
2844
|
default:
|
|
2845
2845
|
return group.replaceAll('_', ' ');
|
|
2846
2846
|
}
|
|
@@ -2907,21 +2907,21 @@ async function run() {
|
|
|
2907
2907
|
}
|
|
2908
2908
|
const ignored = service.markModelIgnored(model.model, model.digest);
|
|
2909
2909
|
if (!ignored) {
|
|
2910
|
-
console.error('
|
|
2910
|
+
console.error('Deny on this device failed.');
|
|
2911
2911
|
process.exitCode = 2;
|
|
2912
2912
|
return;
|
|
2913
2913
|
}
|
|
2914
|
-
console.log(`[forkit-connect]
|
|
2914
|
+
console.log(`[forkit-connect] Denied model on this device: ${model.model} (${model.digest})`);
|
|
2915
2915
|
process.exitCode = 0;
|
|
2916
2916
|
return;
|
|
2917
2917
|
}
|
|
2918
2918
|
if (item.item_type === 'runtime') {
|
|
2919
2919
|
service.markRuntimeIgnored(selector);
|
|
2920
|
-
console.log(`[forkit-connect]
|
|
2920
|
+
console.log(`[forkit-connect] Denied runtime on this device: ${item.display_name}`);
|
|
2921
2921
|
process.exitCode = 0;
|
|
2922
2922
|
return;
|
|
2923
2923
|
}
|
|
2924
|
-
console.log('[forkit-connect]
|
|
2924
|
+
console.log('[forkit-connect] Deny on this device is not available for this inbox item type from the public menu yet.');
|
|
2925
2925
|
};
|
|
2926
2926
|
const runInteractiveDeferInboxItem = (item) => {
|
|
2927
2927
|
const selector = extractInboxItemSelector(item);
|
|
@@ -4060,7 +4060,7 @@ async function run() {
|
|
|
4060
4060
|
}
|
|
4061
4061
|
const ignored = service.markModelIgnored(resolvedModel.model, resolvedModel.digest);
|
|
4062
4062
|
if (!ignored) {
|
|
4063
|
-
console.error('
|
|
4063
|
+
console.error('Deny on this device failed.');
|
|
4064
4064
|
process.exitCode = 2;
|
|
4065
4065
|
return;
|
|
4066
4066
|
}
|
package/dist/launcher.js
CHANGED
|
@@ -687,8 +687,8 @@ function buildDiscovery(service) {
|
|
|
687
687
|
let actionLabel = 'Register';
|
|
688
688
|
let actionTone = 'primary';
|
|
689
689
|
if (group === 'ignored') {
|
|
690
|
-
statusLabel = '
|
|
691
|
-
statusMeta = '
|
|
690
|
+
statusLabel = 'Denied on this device';
|
|
691
|
+
statusMeta = 'This device will keep it out of the active review queue until you reopen it.';
|
|
692
692
|
statusTone = 'muted';
|
|
693
693
|
actionLabel = 'Review';
|
|
694
694
|
actionTone = 'muted';
|
|
@@ -777,7 +777,14 @@ function buildDiscovery(service) {
|
|
|
777
777
|
let statusTone = 'ok';
|
|
778
778
|
let actionLabel = 'Register';
|
|
779
779
|
let actionTone = 'primary';
|
|
780
|
-
if (
|
|
780
|
+
if (group === 'ignored') {
|
|
781
|
+
statusLabel = 'Denied on this device';
|
|
782
|
+
statusMeta = 'This device will keep it out of the active review queue until you reopen it.';
|
|
783
|
+
statusTone = 'muted';
|
|
784
|
+
actionLabel = 'Review';
|
|
785
|
+
actionTone = 'muted';
|
|
786
|
+
}
|
|
787
|
+
else if (agent.status === 'inactive') {
|
|
781
788
|
statusLabel = 'Inactive';
|
|
782
789
|
statusMeta = 'Paused locally until the agent is seen again.';
|
|
783
790
|
statusTone = 'muted';
|
|
@@ -861,8 +868,8 @@ function buildDiscovery(service) {
|
|
|
861
868
|
statusTone = 'ok';
|
|
862
869
|
}
|
|
863
870
|
else if (group === 'ignored') {
|
|
864
|
-
statusLabel = '
|
|
865
|
-
statusMeta = '
|
|
871
|
+
statusLabel = 'Denied on this device';
|
|
872
|
+
statusMeta = 'This device will keep runtime review out of the active queue until you reopen it.';
|
|
866
873
|
statusTone = 'muted';
|
|
867
874
|
}
|
|
868
875
|
else if (group === 'needs_confirmation') {
|
|
@@ -1800,11 +1807,12 @@ function renderLauncherHtml(launcherToken) {
|
|
|
1800
1807
|
|
|
1801
1808
|
.quick-review-chip:focus-visible,
|
|
1802
1809
|
.quick-review-primary:focus-visible,
|
|
1803
|
-
.quick-review-
|
|
1810
|
+
.quick-review-secondary:focus-visible,
|
|
1811
|
+
.quick-review-danger:focus-visible,
|
|
1812
|
+
.quick-review-tertiary:focus-visible,
|
|
1804
1813
|
.review-mode-button:focus-visible,
|
|
1805
1814
|
.quick-review-field select:focus-visible,
|
|
1806
|
-
.discovery-review-field select:focus-visible
|
|
1807
|
-
.quick-review-options-menu button:focus-visible {
|
|
1815
|
+
.discovery-review-field select:focus-visible {
|
|
1808
1816
|
outline: 2px solid rgba(157, 238, 245, 0.72);
|
|
1809
1817
|
outline-offset: 2px;
|
|
1810
1818
|
}
|
|
@@ -2083,9 +2091,8 @@ function renderLauncherHtml(launcherToken) {
|
|
|
2083
2091
|
|
|
2084
2092
|
.quick-review-actions {
|
|
2085
2093
|
display: grid;
|
|
2086
|
-
grid-template-columns: minmax(0, 1fr) auto;
|
|
2087
2094
|
gap: 10px;
|
|
2088
|
-
align-items:
|
|
2095
|
+
align-items: stretch;
|
|
2089
2096
|
}
|
|
2090
2097
|
|
|
2091
2098
|
.review-resolution-actions {
|
|
@@ -2130,94 +2137,66 @@ function renderLauncherHtml(launcherToken) {
|
|
|
2130
2137
|
}
|
|
2131
2138
|
|
|
2132
2139
|
.quick-review-primary:disabled,
|
|
2133
|
-
.quick-review-
|
|
2140
|
+
.quick-review-secondary:disabled,
|
|
2141
|
+
.quick-review-danger:disabled,
|
|
2142
|
+
.quick-review-tertiary:disabled {
|
|
2134
2143
|
opacity: 0.45;
|
|
2135
2144
|
cursor: not-allowed;
|
|
2136
2145
|
}
|
|
2137
2146
|
|
|
2138
|
-
.quick-review-
|
|
2139
|
-
position: relative;
|
|
2140
|
-
}
|
|
2141
|
-
|
|
2142
|
-
.quick-review-options-button {
|
|
2143
|
-
min-height: 52px;
|
|
2144
|
-
padding: 0 16px;
|
|
2145
|
-
border-radius: 16px;
|
|
2146
|
-
border: 1px solid rgba(241, 235, 223, 0.14);
|
|
2147
|
-
background: rgba(255,255,255,0.05);
|
|
2148
|
-
color: #fff7ea;
|
|
2149
|
-
font-size: 0.92rem;
|
|
2150
|
-
font-weight: 600;
|
|
2151
|
-
cursor: pointer;
|
|
2152
|
-
min-width: 122px;
|
|
2153
|
-
transition: background 160ms ease, border-color 160ms ease;
|
|
2154
|
-
}
|
|
2155
|
-
|
|
2156
|
-
.quick-review-options-button:hover {
|
|
2157
|
-
background: rgba(255,255,255,0.08);
|
|
2158
|
-
border-color: rgba(157, 238, 245, 0.22);
|
|
2159
|
-
}
|
|
2160
|
-
|
|
2161
|
-
.quick-review-options-menu {
|
|
2162
|
-
position: absolute;
|
|
2163
|
-
top: calc(100% + 8px);
|
|
2164
|
-
right: 0;
|
|
2165
|
-
min-width: 214px;
|
|
2147
|
+
.quick-review-secondary-actions {
|
|
2166
2148
|
display: grid;
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
border-radius: 18px;
|
|
2170
|
-
border: 1px solid rgba(241, 235, 223, 0.12);
|
|
2171
|
-
background: rgba(19, 20, 31, 0.98);
|
|
2172
|
-
box-shadow: 0 22px 44px rgba(7, 10, 24, 0.38);
|
|
2149
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
2150
|
+
gap: 10px;
|
|
2173
2151
|
}
|
|
2174
2152
|
|
|
2175
|
-
.quick-review-
|
|
2153
|
+
.quick-review-secondary,
|
|
2154
|
+
.quick-review-danger,
|
|
2155
|
+
.quick-review-tertiary {
|
|
2176
2156
|
min-height: 46px;
|
|
2177
|
-
border-radius:
|
|
2178
|
-
border: 1px solid transparent;
|
|
2179
|
-
background: rgba(255,255,255,0.04);
|
|
2180
|
-
color: #f7efe4;
|
|
2181
|
-
text-align: left;
|
|
2182
|
-
padding: 10px 12px;
|
|
2157
|
+
border-radius: 14px;
|
|
2183
2158
|
font-size: 0.9rem;
|
|
2184
2159
|
font-weight: 600;
|
|
2185
2160
|
cursor: pointer;
|
|
2161
|
+
transition: background 160ms ease, border-color 160ms ease, color 160ms ease;
|
|
2186
2162
|
}
|
|
2187
2163
|
|
|
2188
|
-
.quick-review-
|
|
2189
|
-
|
|
2190
|
-
|
|
2191
|
-
|
|
2192
|
-
|
|
2193
|
-
display: grid;
|
|
2194
|
-
gap: 2px;
|
|
2164
|
+
.quick-review-secondary {
|
|
2165
|
+
border: 1px solid rgba(241, 235, 223, 0.14);
|
|
2166
|
+
background: rgba(255,255,255,0.05);
|
|
2167
|
+
color: #fff7ea;
|
|
2168
|
+
padding: 0 14px;
|
|
2195
2169
|
}
|
|
2196
2170
|
|
|
2197
|
-
.quick-review-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
color: #fff7ea;
|
|
2201
|
-
font-weight: 600;
|
|
2171
|
+
.quick-review-secondary:hover {
|
|
2172
|
+
background: rgba(255,255,255,0.08);
|
|
2173
|
+
border-color: rgba(157, 238, 245, 0.22);
|
|
2202
2174
|
}
|
|
2203
2175
|
|
|
2204
|
-
.quick-review-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
color:
|
|
2176
|
+
.quick-review-danger {
|
|
2177
|
+
border: 1px solid rgba(255, 125, 149, 0.22);
|
|
2178
|
+
background: rgba(109, 29, 46, 0.24);
|
|
2179
|
+
color: #ffd4da;
|
|
2180
|
+
padding: 0 14px;
|
|
2208
2181
|
}
|
|
2209
2182
|
|
|
2210
|
-
.quick-review-
|
|
2211
|
-
background: rgba(
|
|
2212
|
-
border-color: rgba(
|
|
2183
|
+
.quick-review-danger:hover {
|
|
2184
|
+
background: rgba(124, 33, 52, 0.34);
|
|
2185
|
+
border-color: rgba(255, 160, 180, 0.32);
|
|
2213
2186
|
}
|
|
2214
2187
|
|
|
2215
|
-
.quick-review-
|
|
2216
|
-
|
|
2188
|
+
.quick-review-tertiary {
|
|
2189
|
+
min-height: 0;
|
|
2190
|
+
border: none;
|
|
2191
|
+
background: transparent;
|
|
2192
|
+
color: rgba(157, 238, 245, 0.92);
|
|
2193
|
+
justify-self: start;
|
|
2194
|
+
padding: 0;
|
|
2217
2195
|
}
|
|
2218
2196
|
|
|
2219
|
-
.quick-review-
|
|
2220
|
-
color: #
|
|
2197
|
+
.quick-review-tertiary:hover {
|
|
2198
|
+
color: #bdf6fb;
|
|
2199
|
+
text-decoration: underline;
|
|
2221
2200
|
}
|
|
2222
2201
|
|
|
2223
2202
|
.status-chip {
|
|
@@ -6541,29 +6520,11 @@ function renderLauncherHtml(launcherToken) {
|
|
|
6541
6520
|
</div>
|
|
6542
6521
|
<div class="quick-review-actions">
|
|
6543
6522
|
<button class="quick-review-primary" id="quick-review-primary" type="button" disabled>Approve and register</button>
|
|
6544
|
-
<div class="quick-review-
|
|
6545
|
-
<button class="quick-review-
|
|
6546
|
-
<
|
|
6547
|
-
<button id="quick-review-open-discovery" type="button">
|
|
6548
|
-
<span class="quick-review-menu-copy">
|
|
6549
|
-
<span class="quick-review-menu-label">Open full review</span>
|
|
6550
|
-
<span class="quick-review-menu-meta">See the full local discovery context.</span>
|
|
6551
|
-
</span>
|
|
6552
|
-
</button>
|
|
6553
|
-
<button id="quick-review-defer" type="button">
|
|
6554
|
-
<span class="quick-review-menu-copy">
|
|
6555
|
-
<span class="quick-review-menu-label">Not now (24h)</span>
|
|
6556
|
-
<span class="quick-review-menu-meta">Hide this prompt until tomorrow.</span>
|
|
6557
|
-
</span>
|
|
6558
|
-
</button>
|
|
6559
|
-
<button id="quick-review-ignore" class="danger" type="button">
|
|
6560
|
-
<span class="quick-review-menu-copy">
|
|
6561
|
-
<span class="quick-review-menu-label">Ignore locally</span>
|
|
6562
|
-
<span class="quick-review-menu-meta">Keep it out of this device review queue.</span>
|
|
6563
|
-
</span>
|
|
6564
|
-
</button>
|
|
6565
|
-
</div>
|
|
6523
|
+
<div class="quick-review-secondary-actions">
|
|
6524
|
+
<button class="quick-review-secondary" id="quick-review-defer" type="button" disabled>Not now</button>
|
|
6525
|
+
<button class="quick-review-danger" id="quick-review-ignore" type="button" disabled>Deny on this device</button>
|
|
6566
6526
|
</div>
|
|
6527
|
+
<button class="quick-review-tertiary" id="quick-review-open-discovery" type="button" disabled>Open full review</button>
|
|
6567
6528
|
</div>
|
|
6568
6529
|
<div class="review-resolution-actions" id="quick-review-resolution" hidden>
|
|
6569
6530
|
<button class="review-resolution-button" id="quick-review-resolution-primary" type="button" hidden></button>
|
|
@@ -6952,8 +6913,8 @@ function renderLauncherHtml(launcherToken) {
|
|
|
6952
6913
|
</div>
|
|
6953
6914
|
<div class="discovery-review-actions">
|
|
6954
6915
|
<button class="primary" id="discovery-review-primary" type="button" disabled>Review</button>
|
|
6955
|
-
<button class="secondary" id="discovery-review-defer" type="button" disabled>
|
|
6956
|
-
<button class="danger" id="discovery-review-ignore" type="button" disabled>
|
|
6916
|
+
<button class="secondary" id="discovery-review-defer" type="button" disabled>Not now</button>
|
|
6917
|
+
<button class="danger" id="discovery-review-ignore" type="button" disabled>Deny on this device</button>
|
|
6957
6918
|
</div>
|
|
6958
6919
|
<div class="review-resolution-actions" id="discovery-review-resolution" hidden>
|
|
6959
6920
|
<button class="review-resolution-button" id="discovery-review-resolution-primary" type="button" hidden></button>
|
|
@@ -7878,14 +7839,6 @@ function renderLauncherHtml(launcherToken) {
|
|
|
7878
7839
|
}
|
|
7879
7840
|
}
|
|
7880
7841
|
|
|
7881
|
-
function setQuickReviewOptionsOpen(open) {
|
|
7882
|
-
const button = document.getElementById('quick-review-options');
|
|
7883
|
-
const menu = document.getElementById('quick-review-options-menu');
|
|
7884
|
-
if (!button || !menu) return;
|
|
7885
|
-
menu.hidden = !open;
|
|
7886
|
-
button.setAttribute('aria-expanded', open ? 'true' : 'false');
|
|
7887
|
-
}
|
|
7888
|
-
|
|
7889
7842
|
function setQuickReviewPanelOpen(open) {
|
|
7890
7843
|
const toggle = document.getElementById('quick-review-toggle');
|
|
7891
7844
|
const panel = document.getElementById('quick-review-panel');
|
|
@@ -7901,9 +7854,6 @@ function renderLauncherHtml(launcherToken) {
|
|
|
7901
7854
|
}
|
|
7902
7855
|
: {});
|
|
7903
7856
|
}
|
|
7904
|
-
if (!open) {
|
|
7905
|
-
setQuickReviewOptionsOpen(false);
|
|
7906
|
-
}
|
|
7907
7857
|
}
|
|
7908
7858
|
|
|
7909
7859
|
function updateQuickReviewScopeSummary(scopeMode) {
|
|
@@ -8001,7 +7951,6 @@ function renderLauncherHtml(launcherToken) {
|
|
|
8001
7951
|
const workspaceSelect = document.getElementById('quick-review-workspace');
|
|
8002
7952
|
const projectSelect = document.getElementById('quick-review-project');
|
|
8003
7953
|
const primaryButton = document.getElementById('quick-review-primary');
|
|
8004
|
-
const optionsButton = document.getElementById('quick-review-options');
|
|
8005
7954
|
const openDiscoveryButton = document.getElementById('quick-review-open-discovery');
|
|
8006
7955
|
const deferButton = document.getElementById('quick-review-defer');
|
|
8007
7956
|
const ignoreButton = document.getElementById('quick-review-ignore');
|
|
@@ -8036,17 +7985,16 @@ function renderLauncherHtml(launcherToken) {
|
|
|
8036
7985
|
primaryButton.textContent = primaryLabel;
|
|
8037
7986
|
primaryButton.disabled = item.inboxGroup === 'ignored';
|
|
8038
7987
|
}
|
|
8039
|
-
if (optionsButton) {
|
|
8040
|
-
optionsButton.disabled = false;
|
|
8041
|
-
}
|
|
8042
7988
|
if (openDiscoveryButton) {
|
|
8043
|
-
openDiscoveryButton.
|
|
7989
|
+
openDiscoveryButton.disabled = false;
|
|
8044
7990
|
}
|
|
8045
7991
|
if (deferButton) {
|
|
8046
7992
|
deferButton.hidden = !canReviewDefer(item);
|
|
7993
|
+
deferButton.disabled = !canReviewDefer(item);
|
|
8047
7994
|
}
|
|
8048
7995
|
if (ignoreButton) {
|
|
8049
7996
|
ignoreButton.hidden = !canReviewIgnore(item);
|
|
7997
|
+
ignoreButton.disabled = !canReviewIgnore(item);
|
|
8050
7998
|
}
|
|
8051
7999
|
|
|
8052
8000
|
const showScopeChoice = canChooseReviewScope(item);
|
|
@@ -8177,24 +8125,22 @@ function renderLauncherHtml(launcherToken) {
|
|
|
8177
8125
|
setActivityMessage(result.message || 'Review deferred.', result.ok ? 'ok' : 'warn');
|
|
8178
8126
|
await refreshAll();
|
|
8179
8127
|
resetReviewResolutionActions('quick-review');
|
|
8180
|
-
setQuickReviewOptionsOpen(false);
|
|
8181
8128
|
}
|
|
8182
8129
|
|
|
8183
8130
|
async function submitQuickReviewIgnore() {
|
|
8184
8131
|
const item = getQuickReviewItem();
|
|
8185
8132
|
if (!item || !canReviewIgnore(item)) {
|
|
8186
|
-
setQuickReviewStatus('
|
|
8133
|
+
setQuickReviewStatus('Deny on this device is not available for this item.', 'warn');
|
|
8187
8134
|
return;
|
|
8188
8135
|
}
|
|
8189
8136
|
const result = await postAction('/api/discovery/review/ignore', 'Ignoring this review item...', {
|
|
8190
8137
|
method: 'POST',
|
|
8191
8138
|
body: JSON.stringify({ kind: item.kind, selector: item.selector }),
|
|
8192
8139
|
});
|
|
8193
|
-
setQuickReviewStatus(result.message || 'Item
|
|
8194
|
-
setActivityMessage(result.message || 'Item
|
|
8140
|
+
setQuickReviewStatus(result.message || 'Item denied on this device.', result.ok ? 'ok' : 'warn');
|
|
8141
|
+
setActivityMessage(result.message || 'Item denied on this device.', result.ok ? 'ok' : 'warn');
|
|
8195
8142
|
await refreshAll();
|
|
8196
8143
|
resetReviewResolutionActions('quick-review');
|
|
8197
|
-
setQuickReviewOptionsOpen(false);
|
|
8198
8144
|
}
|
|
8199
8145
|
|
|
8200
8146
|
function setDiscoveryReviewButtons(config) {
|
|
@@ -8417,7 +8363,7 @@ function renderLauncherHtml(launcherToken) {
|
|
|
8417
8363
|
async function submitDiscoveryReviewDefer() {
|
|
8418
8364
|
const item = getSelectedDiscoveryItem();
|
|
8419
8365
|
if (!item || !canReviewDefer(item)) {
|
|
8420
|
-
setDiscoveryReviewStatus('
|
|
8366
|
+
setDiscoveryReviewStatus('Not now is not available for this item.', 'warn');
|
|
8421
8367
|
return;
|
|
8422
8368
|
}
|
|
8423
8369
|
const result = await postAction('/api/discovery/review/defer', 'Deferring this review...', {
|
|
@@ -8433,15 +8379,15 @@ function renderLauncherHtml(launcherToken) {
|
|
|
8433
8379
|
async function submitDiscoveryReviewIgnore() {
|
|
8434
8380
|
const item = getSelectedDiscoveryItem();
|
|
8435
8381
|
if (!item || !canReviewIgnore(item)) {
|
|
8436
|
-
setDiscoveryReviewStatus('
|
|
8382
|
+
setDiscoveryReviewStatus('Deny on this device is not available for this item.', 'warn');
|
|
8437
8383
|
return;
|
|
8438
8384
|
}
|
|
8439
8385
|
const result = await postAction('/api/discovery/review/ignore', 'Ignoring this review item...', {
|
|
8440
8386
|
method: 'POST',
|
|
8441
8387
|
body: JSON.stringify({ kind: item.kind, selector: item.selector }),
|
|
8442
8388
|
});
|
|
8443
|
-
setDiscoveryReviewStatus(result.message || 'Item
|
|
8444
|
-
setActivityMessage(result.message || 'Item
|
|
8389
|
+
setDiscoveryReviewStatus(result.message || 'Item denied on this device.', result.ok ? 'ok' : 'warn');
|
|
8390
|
+
setActivityMessage(result.message || 'Item denied on this device.', result.ok ? 'ok' : 'warn');
|
|
8445
8391
|
await refreshAll();
|
|
8446
8392
|
resetReviewResolutionActions('discovery-review');
|
|
8447
8393
|
}
|
|
@@ -9689,14 +9635,14 @@ function renderLauncherHtml(launcherToken) {
|
|
|
9689
9635
|
selectedDiscoveryId = item.id;
|
|
9690
9636
|
if (item.kind === 'runtime') {
|
|
9691
9637
|
if (item.inboxGroup === 'ignored') {
|
|
9692
|
-
setActivityMessage(item.detailSummary || item.statusMeta || (item.name + ' is currently
|
|
9638
|
+
setActivityMessage(item.detailSummary || item.statusMeta || (item.name + ' is currently denied on this device.'), 'warn');
|
|
9693
9639
|
return;
|
|
9694
9640
|
}
|
|
9695
9641
|
setView('runtime');
|
|
9696
9642
|
return;
|
|
9697
9643
|
}
|
|
9698
9644
|
if (item.inboxGroup === 'ignored') {
|
|
9699
|
-
setActivityMessage(item.detailSummary || item.statusMeta || (item.name + ' is currently
|
|
9645
|
+
setActivityMessage(item.detailSummary || item.statusMeta || (item.name + ' is currently denied on this device.'), 'warn');
|
|
9700
9646
|
return;
|
|
9701
9647
|
}
|
|
9702
9648
|
if (item.kind === 'model' && (item.actionLabel === 'Open' || item.actionLabel === 'Review')) {
|
|
@@ -9704,7 +9650,7 @@ function renderLauncherHtml(launcherToken) {
|
|
|
9704
9650
|
return;
|
|
9705
9651
|
}
|
|
9706
9652
|
if (item.kind === 'model' && item.actionLabel === 'Undo') {
|
|
9707
|
-
setActivityMessage('
|
|
9653
|
+
setActivityMessage('Restore from denied-on-this-device state is not available from the launcher yet.', 'warn');
|
|
9708
9654
|
return;
|
|
9709
9655
|
}
|
|
9710
9656
|
if (item.kind === 'model') {
|
|
@@ -9726,14 +9672,14 @@ function renderLauncherHtml(launcherToken) {
|
|
|
9726
9672
|
selectedDiscoveryId = item.id;
|
|
9727
9673
|
if (item.kind === 'runtime') {
|
|
9728
9674
|
if (item.inboxGroup === 'ignored') {
|
|
9729
|
-
setActivityMessage(item.detailSummary || item.statusMeta || (item.name + ' is currently
|
|
9675
|
+
setActivityMessage(item.detailSummary || item.statusMeta || (item.name + ' is currently denied on this device.'), 'warn');
|
|
9730
9676
|
return;
|
|
9731
9677
|
}
|
|
9732
9678
|
setView('runtime');
|
|
9733
9679
|
return;
|
|
9734
9680
|
}
|
|
9735
9681
|
if (item.inboxGroup === 'ignored') {
|
|
9736
|
-
setActivityMessage(item.detailSummary || item.statusMeta || (item.name + ' is currently
|
|
9682
|
+
setActivityMessage(item.detailSummary || item.statusMeta || (item.name + ' is currently denied on this device.'), 'warn');
|
|
9737
9683
|
return;
|
|
9738
9684
|
}
|
|
9739
9685
|
if (item.actionLabel === 'Open' || item.actionLabel === 'Review') {
|
|
@@ -9742,7 +9688,7 @@ function renderLauncherHtml(launcherToken) {
|
|
|
9742
9688
|
}
|
|
9743
9689
|
if (item.kind === 'model') {
|
|
9744
9690
|
if (item.actionLabel === 'Undo') {
|
|
9745
|
-
setActivityMessage('
|
|
9691
|
+
setActivityMessage('Restore from denied-on-this-device state is not available from the launcher yet.', 'warn');
|
|
9746
9692
|
return;
|
|
9747
9693
|
}
|
|
9748
9694
|
await openRegistrationScopeDialog(item);
|
|
@@ -10296,18 +10242,9 @@ function renderLauncherHtml(launcherToken) {
|
|
|
10296
10242
|
void handleReviewResolutionAction('quick-review', String(quickReviewResolutionSecondary.dataset.action || '').trim());
|
|
10297
10243
|
});
|
|
10298
10244
|
}
|
|
10299
|
-
const quickReviewOptionsButton = document.getElementById('quick-review-options');
|
|
10300
|
-
if (quickReviewOptionsButton) {
|
|
10301
|
-
quickReviewOptionsButton.addEventListener('click', (event) => {
|
|
10302
|
-
event.stopPropagation();
|
|
10303
|
-
const menu = document.getElementById('quick-review-options-menu');
|
|
10304
|
-
setQuickReviewOptionsOpen(Boolean(menu && menu.hidden));
|
|
10305
|
-
});
|
|
10306
|
-
}
|
|
10307
10245
|
const quickReviewOpenDiscovery = document.getElementById('quick-review-open-discovery');
|
|
10308
10246
|
if (quickReviewOpenDiscovery) {
|
|
10309
10247
|
quickReviewOpenDiscovery.addEventListener('click', () => {
|
|
10310
|
-
setQuickReviewOptionsOpen(false);
|
|
10311
10248
|
setQuickReviewPanelOpen(false);
|
|
10312
10249
|
setView('discovery');
|
|
10313
10250
|
renderDiscoveryRows();
|
|
@@ -11260,17 +11197,17 @@ function createLauncherApp(options) {
|
|
|
11260
11197
|
}
|
|
11261
11198
|
if (kind === 'model') {
|
|
11262
11199
|
options.service.ignoreDetectedModel(selector);
|
|
11263
|
-
response.json({ ok: true, message: 'Model review
|
|
11200
|
+
response.json({ ok: true, message: 'Model review denied on this device.' });
|
|
11264
11201
|
return;
|
|
11265
11202
|
}
|
|
11266
11203
|
if (kind === 'runtime') {
|
|
11267
11204
|
options.service.ignoreRuntimeSuggestion(selector);
|
|
11268
|
-
response.json({ ok: true, message: 'Runtime review
|
|
11205
|
+
response.json({ ok: true, message: 'Runtime review denied on this device.' });
|
|
11269
11206
|
return;
|
|
11270
11207
|
}
|
|
11271
11208
|
if (kind === 'agent') {
|
|
11272
11209
|
options.service.ignoreDetectedAgent(selector);
|
|
11273
|
-
response.json({ ok: true, message: 'Agent review
|
|
11210
|
+
response.json({ ok: true, message: 'Agent review denied on this device.' });
|
|
11274
11211
|
return;
|
|
11275
11212
|
}
|
|
11276
11213
|
response.status(400).json({ ok: false, message: 'Unsupported review kind.' });
|