@mindexec/cli 0.2.5 → 0.2.6
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/package.json +6 -6
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +457 -76
- package/wwwroot/_framework/MindExecution.Core.kf4752v5yl.dll +0 -0
- package/wwwroot/_framework/{MindExecution.Kernel.9wfplilp5l.dll → MindExecution.Kernel.79mgmkpsy1.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Admin.sb1vkmct0w.dll → MindExecution.Plugins.Admin.8ey1m70q79.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Business.zr7rkofx44.dll → MindExecution.Plugins.Business.8rvwgqzxaz.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Concept.g6wd36v92i.dll → MindExecution.Plugins.Concept.ynnk3bqf03.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Directory.bb5flwt0u7.dll → MindExecution.Plugins.Directory.vi24rmnuyq.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll → MindExecution.Plugins.PlanMaster.9r08m5atjr.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.YouTube.l811fqx9e0.dll → MindExecution.Plugins.YouTube.fjkbniwa4o.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Shared.oseamdg577.dll → MindExecution.Shared.e0qnm5vtax.dll} +0 -0
- package/wwwroot/_framework/MindExecution.Web.wk9yv02eva.dll +0 -0
- package/wwwroot/_framework/blazor.boot.json +21 -21
- package/wwwroot/index.html +1 -1
- package/wwwroot/service-worker-assets.js +24 -24
- package/wwwroot/service-worker.js +1 -1
- package/wwwroot/_framework/MindExecution.Core.27f2blpou6.dll +0 -0
- package/wwwroot/_framework/MindExecution.Web.96r3nnp9is.dll +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mindexec/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.6",
|
|
4
4
|
"description": "MindExec local runtime and bridge CLI",
|
|
5
5
|
"main": "server.js",
|
|
6
6
|
"type": "module",
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
"start-bridge.bat",
|
|
9
9
|
"start-bridge.sh",
|
|
10
10
|
"launch-bridge.cjs",
|
|
11
|
-
"server.js",
|
|
12
|
-
"remote-hub.js",
|
|
13
|
-
"codex-runtime.js",
|
|
11
|
+
"server.js",
|
|
12
|
+
"remote-hub.js",
|
|
13
|
+
"codex-runtime.js",
|
|
14
14
|
"port-guard.cjs",
|
|
15
15
|
"wwwroot/",
|
|
16
16
|
"scripts/",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
"scripts": {
|
|
21
21
|
"start": "node launch-bridge.cjs",
|
|
22
22
|
"dev": "node launch-bridge.cjs --watch",
|
|
23
|
-
"test:syntax": "node --check server.js && node --check remote-hub.js && node --check codex-runtime.js && node --check launch-bridge.cjs && node --check port-guard.cjs && node --check scripts/setup-tree-sitter-grammars.mjs && node --check scripts/remote-hub-smoke.mjs",
|
|
24
|
-
"test:remote": "node scripts/remote-hub-smoke.mjs",
|
|
23
|
+
"test:syntax": "node --check server.js && node --check remote-hub.js && node --check codex-runtime.js && node --check launch-bridge.cjs && node --check port-guard.cjs && node --check scripts/setup-tree-sitter-grammars.mjs && node --check scripts/remote-hub-smoke.mjs",
|
|
24
|
+
"test:remote": "node scripts/remote-hub-smoke.mjs",
|
|
25
25
|
"pack:dry": "npm pack --dry-run",
|
|
26
26
|
"setup:grammars": "node scripts/setup-tree-sitter-grammars.mjs",
|
|
27
27
|
"postinstall": "npm run setup:grammars"
|
|
@@ -12005,8 +12005,11 @@
|
|
|
12005
12005
|
return `${Math.floor(seconds / 86400)}d ago`;
|
|
12006
12006
|
}
|
|
12007
12007
|
|
|
12008
|
-
function createRemoteFleetStat(label, value, tone = 'default') {
|
|
12008
|
+
function createRemoteFleetStat(label, value, tone = 'default', key = '') {
|
|
12009
12009
|
const item = document.createElement('div');
|
|
12010
|
+
if (key) {
|
|
12011
|
+
item.dataset.remoteFleetStat = key;
|
|
12012
|
+
}
|
|
12010
12013
|
item.style.cssText = `
|
|
12011
12014
|
display: flex;
|
|
12012
12015
|
flex-direction: column;
|
|
@@ -12029,6 +12032,7 @@
|
|
|
12029
12032
|
`;
|
|
12030
12033
|
|
|
12031
12034
|
const valueEl = document.createElement('strong');
|
|
12035
|
+
valueEl.dataset.remoteFleetStatValue = 'true';
|
|
12032
12036
|
valueEl.textContent = value;
|
|
12033
12037
|
valueEl.style.cssText = `
|
|
12034
12038
|
color: ${tone === 'online' ? '#047857' : '#0f172a'};
|
|
@@ -12073,6 +12077,130 @@
|
|
|
12073
12077
|
return button;
|
|
12074
12078
|
}
|
|
12075
12079
|
|
|
12080
|
+
function createRemoteFleetSelect(options, value, title) {
|
|
12081
|
+
const select = document.createElement('select');
|
|
12082
|
+
select.title = title || '';
|
|
12083
|
+
select.setAttribute('aria-label', title || 'Remote fleet option');
|
|
12084
|
+
select.style.cssText = `
|
|
12085
|
+
min-width: 0;
|
|
12086
|
+
height: 34px;
|
|
12087
|
+
border-radius: 7px;
|
|
12088
|
+
border: 1px solid rgba(148, 163, 184, 0.34);
|
|
12089
|
+
background: rgba(255, 255, 255, 0.94);
|
|
12090
|
+
color: #0f172a;
|
|
12091
|
+
padding: 0 8px;
|
|
12092
|
+
font-size: 11px;
|
|
12093
|
+
font-weight: 850;
|
|
12094
|
+
letter-spacing: 0;
|
|
12095
|
+
outline: none;
|
|
12096
|
+
pointer-events: auto;
|
|
12097
|
+
`;
|
|
12098
|
+
options.forEach(option => {
|
|
12099
|
+
const optionEl = document.createElement('option');
|
|
12100
|
+
optionEl.value = option.value;
|
|
12101
|
+
optionEl.textContent = option.label;
|
|
12102
|
+
select.appendChild(optionEl);
|
|
12103
|
+
});
|
|
12104
|
+
select.value = value;
|
|
12105
|
+
return select;
|
|
12106
|
+
}
|
|
12107
|
+
|
|
12108
|
+
function getRemoteFleetDeviceField(device, camelKey, pascalKey, fallback = '') {
|
|
12109
|
+
const value = device?.[camelKey] ?? device?.[pascalKey] ?? fallback;
|
|
12110
|
+
return value === undefined || value === null ? fallback : value;
|
|
12111
|
+
}
|
|
12112
|
+
|
|
12113
|
+
function getRemoteFleetDeviceId(device) {
|
|
12114
|
+
return String(getRemoteFleetDeviceField(device, 'deviceId', 'DeviceId', '')).trim();
|
|
12115
|
+
}
|
|
12116
|
+
|
|
12117
|
+
function getRemoteFleetDeviceName(device) {
|
|
12118
|
+
return String(
|
|
12119
|
+
getRemoteFleetDeviceField(device, 'name', 'Name')
|
|
12120
|
+
|| getRemoteFleetDeviceField(device, 'hostname', 'Hostname')
|
|
12121
|
+
|| getRemoteFleetDeviceId(device)
|
|
12122
|
+
|| 'device');
|
|
12123
|
+
}
|
|
12124
|
+
|
|
12125
|
+
function isRemoteFleetDeviceConnected(device) {
|
|
12126
|
+
return getRemoteFleetDeviceField(device, 'connected', 'Connected', false) === true;
|
|
12127
|
+
}
|
|
12128
|
+
|
|
12129
|
+
function isRemoteFleetDeviceTaskCapable(device) {
|
|
12130
|
+
return getRemoteFleetDeviceField(device, 'computerAgentEnabled', 'ComputerAgentEnabled', false) === true;
|
|
12131
|
+
}
|
|
12132
|
+
|
|
12133
|
+
function isRemoteFleetDeviceAiCapable(device) {
|
|
12134
|
+
return getRemoteFleetDeviceField(device, 'aiAssistEnabled', 'AiAssistEnabled', false) === true;
|
|
12135
|
+
}
|
|
12136
|
+
|
|
12137
|
+
function hasRemoteFleetThumbnail(device) {
|
|
12138
|
+
const dataUrl = String(getRemoteFleetDeviceField(device, 'thumbnailDataUrl', 'ThumbnailDataUrl', ''));
|
|
12139
|
+
return /^data:image\/(png|jpe?g|webp|svg\+xml);base64,/i.test(dataUrl);
|
|
12140
|
+
}
|
|
12141
|
+
|
|
12142
|
+
function getRemoteFleetTimestampMs(value) {
|
|
12143
|
+
const timestamp = Date.parse(String(value || ''));
|
|
12144
|
+
return Number.isFinite(timestamp) ? timestamp : 0;
|
|
12145
|
+
}
|
|
12146
|
+
|
|
12147
|
+
function getRemoteFleetDeviceLastSeenMs(device) {
|
|
12148
|
+
return Math.max(
|
|
12149
|
+
getRemoteFleetTimestampMs(getRemoteFleetDeviceField(device, 'lastSeenAt', 'LastSeenAt', '')),
|
|
12150
|
+
getRemoteFleetTimestampMs(getRemoteFleetDeviceField(device, 'lastStatusAt', 'LastStatusAt', '')),
|
|
12151
|
+
getRemoteFleetTimestampMs(getRemoteFleetDeviceField(device, 'thumbnailReceivedAt', 'ThumbnailReceivedAt', '')));
|
|
12152
|
+
}
|
|
12153
|
+
|
|
12154
|
+
function getRemoteFleetDeviceNumber(device, camelKey, pascalKey) {
|
|
12155
|
+
const number = Number(getRemoteFleetDeviceField(device, camelKey, pascalKey, Number.NaN));
|
|
12156
|
+
return Number.isFinite(number) ? number : Number.NaN;
|
|
12157
|
+
}
|
|
12158
|
+
|
|
12159
|
+
function buildRemoteFleetSearchText(device) {
|
|
12160
|
+
return [
|
|
12161
|
+
getRemoteFleetDeviceId(device),
|
|
12162
|
+
getRemoteFleetDeviceName(device),
|
|
12163
|
+
getRemoteFleetDeviceField(device, 'hostname', 'Hostname', ''),
|
|
12164
|
+
getRemoteFleetDeviceField(device, 'platform', 'Platform', ''),
|
|
12165
|
+
getRemoteFleetDeviceField(device, 'release', 'Release', ''),
|
|
12166
|
+
getRemoteFleetDeviceField(device, 'arch', 'Arch', ''),
|
|
12167
|
+
getRemoteFleetDeviceField(device, 'agentVersion', 'AgentVersion', ''),
|
|
12168
|
+
getRemoteFleetDeviceField(device, 'latestTaskTitle', 'LatestTaskTitle', ''),
|
|
12169
|
+
getRemoteFleetDeviceField(device, 'latestTaskStatus', 'LatestTaskStatus', ''),
|
|
12170
|
+
getRemoteFleetDeviceField(device, 'latestTaskResultSummary', 'LatestTaskResultSummary', ''),
|
|
12171
|
+
getRemoteFleetDeviceField(device, 'latestTaskError', 'LatestTaskError', '')
|
|
12172
|
+
].join(' ').toLowerCase();
|
|
12173
|
+
}
|
|
12174
|
+
|
|
12175
|
+
function compareRemoteFleetDevices(left, right, sortMode) {
|
|
12176
|
+
const connectedDelta = Number(isRemoteFleetDeviceConnected(right)) - Number(isRemoteFleetDeviceConnected(left));
|
|
12177
|
+
const byName = () => getRemoteFleetDeviceName(left).localeCompare(getRemoteFleetDeviceName(right))
|
|
12178
|
+
|| getRemoteFleetDeviceId(left).localeCompare(getRemoteFleetDeviceId(right));
|
|
12179
|
+
|
|
12180
|
+
switch (sortMode) {
|
|
12181
|
+
case 'recent':
|
|
12182
|
+
return getRemoteFleetDeviceLastSeenMs(right) - getRemoteFleetDeviceLastSeenMs(left) || byName();
|
|
12183
|
+
case 'memory': {
|
|
12184
|
+
const leftMem = getRemoteFleetDeviceNumber(left, 'usedMemRatio', 'UsedMemRatio');
|
|
12185
|
+
const rightMem = getRemoteFleetDeviceNumber(right, 'usedMemRatio', 'UsedMemRatio');
|
|
12186
|
+
return (Number.isFinite(rightMem) ? rightMem : -1) - (Number.isFinite(leftMem) ? leftMem : -1) || byName();
|
|
12187
|
+
}
|
|
12188
|
+
case 'load': {
|
|
12189
|
+
const leftLoad = getRemoteFleetDeviceNumber(left, 'load1', 'Load1');
|
|
12190
|
+
const rightLoad = getRemoteFleetDeviceNumber(right, 'load1', 'Load1');
|
|
12191
|
+
return (Number.isFinite(rightLoad) ? rightLoad : -1) - (Number.isFinite(leftLoad) ? leftLoad : -1) || byName();
|
|
12192
|
+
}
|
|
12193
|
+
case 'task':
|
|
12194
|
+
return String(getRemoteFleetDeviceField(right, 'latestTaskUpdatedAt', 'LatestTaskUpdatedAt', ''))
|
|
12195
|
+
.localeCompare(String(getRemoteFleetDeviceField(left, 'latestTaskUpdatedAt', 'LatestTaskUpdatedAt', ''))) || byName();
|
|
12196
|
+
case 'status':
|
|
12197
|
+
return connectedDelta || byName();
|
|
12198
|
+
case 'name':
|
|
12199
|
+
default:
|
|
12200
|
+
return byName();
|
|
12201
|
+
}
|
|
12202
|
+
}
|
|
12203
|
+
|
|
12076
12204
|
async function syncRemoteFleetNodeStateFromResult(result) {
|
|
12077
12205
|
const nodeState = result?.nodeState || result?.refresh?.nodeState;
|
|
12078
12206
|
if (nodeState && window.mindMap?.syncNodeStates) {
|
|
@@ -12084,12 +12212,20 @@
|
|
|
12084
12212
|
if (!bodyView) return;
|
|
12085
12213
|
|
|
12086
12214
|
const nodeId = String(nodeModel?.id ?? nodeModel?.Id ?? '');
|
|
12087
|
-
const
|
|
12215
|
+
const searchState = bodyView.dataset.remoteFleetSearch || '';
|
|
12216
|
+
const filterState = bodyView.dataset.remoteFleetFilter || 'all';
|
|
12217
|
+
const sortState = bodyView.dataset.remoteFleetSort || 'status';
|
|
12218
|
+
const densityState = bodyView.dataset.remoteFleetDensity || 'cards';
|
|
12219
|
+
const aiAssistState = bodyView.dataset.remoteFleetAiAssist === 'true';
|
|
12220
|
+
const devices = [...parseRemoteFleetDevices(nodeModel)]
|
|
12221
|
+
.sort((left, right) => compareRemoteFleetDevices(left, right, sortState));
|
|
12088
12222
|
const total = Number(getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetDeviceCount', devices.length));
|
|
12089
12223
|
const connected = Number(getRemoteFleetMetadataValue(
|
|
12090
12224
|
nodeModel,
|
|
12091
12225
|
'RemoteFleetConnectedDeviceCount',
|
|
12092
|
-
devices.filter(
|
|
12226
|
+
devices.filter(isRemoteFleetDeviceConnected).length));
|
|
12227
|
+
const taskCapableCount = devices.filter(device => isRemoteFleetDeviceConnected(device) && isRemoteFleetDeviceTaskCapable(device)).length;
|
|
12228
|
+
const aiCapableCount = devices.filter(device => isRemoteFleetDeviceConnected(device) && isRemoteFleetDeviceAiCapable(device)).length;
|
|
12093
12229
|
const endpoint = getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetHubEndpoint', '127.0.0.1:5197');
|
|
12094
12230
|
const command = getRemoteFleetMetadataValue(
|
|
12095
12231
|
nodeModel,
|
|
@@ -12123,8 +12259,8 @@
|
|
|
12123
12259
|
`;
|
|
12124
12260
|
top.appendChild(createRemoteFleetStat('Hub', hubStatus === 'online' ? 'Online' : 'Offline', hubStatus === 'online' ? 'online' : 'default'));
|
|
12125
12261
|
top.appendChild(createRemoteFleetStat('Connected', `${Number.isFinite(connected) ? connected : 0}/${Number.isFinite(total) ? total : devices.length}`, connected > 0 ? 'online' : 'default'));
|
|
12126
|
-
top.appendChild(createRemoteFleetStat('
|
|
12127
|
-
top.appendChild(createRemoteFleetStat('
|
|
12262
|
+
top.appendChild(createRemoteFleetStat('Task', String(taskCapableCount), taskCapableCount > 0 ? 'online' : 'default'));
|
|
12263
|
+
top.appendChild(createRemoteFleetStat('AI', String(aiCapableCount), aiCapableCount > 0 ? 'online' : 'default'));
|
|
12128
12264
|
bodyView.appendChild(top);
|
|
12129
12265
|
|
|
12130
12266
|
const commandRow = document.createElement('div');
|
|
@@ -12160,10 +12296,86 @@
|
|
|
12160
12296
|
commandRow.appendChild(refreshButton);
|
|
12161
12297
|
bodyView.appendChild(commandRow);
|
|
12162
12298
|
|
|
12299
|
+
const filterRow = document.createElement('div');
|
|
12300
|
+
filterRow.style.cssText = `
|
|
12301
|
+
display: grid;
|
|
12302
|
+
grid-template-columns: minmax(150px, 1.2fr) minmax(96px, 0.7fr) minmax(96px, 0.7fr) minmax(84px, 0.55fr) auto;
|
|
12303
|
+
gap: 8px;
|
|
12304
|
+
align-items: center;
|
|
12305
|
+
flex: 0 0 auto;
|
|
12306
|
+
`;
|
|
12307
|
+
|
|
12308
|
+
const searchInput = document.createElement('input');
|
|
12309
|
+
searchInput.type = 'search';
|
|
12310
|
+
searchInput.value = searchState;
|
|
12311
|
+
searchInput.placeholder = 'Search devices';
|
|
12312
|
+
searchInput.dataset.remoteFleetSearch = 'true';
|
|
12313
|
+
searchInput.autocomplete = 'off';
|
|
12314
|
+
searchInput.spellcheck = false;
|
|
12315
|
+
searchInput.style.cssText = `
|
|
12316
|
+
min-width: 0;
|
|
12317
|
+
height: 34px;
|
|
12318
|
+
border-radius: 7px;
|
|
12319
|
+
border: 1px solid rgba(148, 163, 184, 0.34);
|
|
12320
|
+
background: rgba(255, 255, 255, 0.94);
|
|
12321
|
+
color: #0f172a;
|
|
12322
|
+
padding: 0 10px;
|
|
12323
|
+
font-size: 12px;
|
|
12324
|
+
font-weight: 750;
|
|
12325
|
+
letter-spacing: 0;
|
|
12326
|
+
outline: none;
|
|
12327
|
+
pointer-events: auto;
|
|
12328
|
+
`;
|
|
12329
|
+
|
|
12330
|
+
const filterSelect = createRemoteFleetSelect([
|
|
12331
|
+
{ value: 'all', label: 'All' },
|
|
12332
|
+
{ value: 'connected', label: 'Online' },
|
|
12333
|
+
{ value: 'offline', label: 'Offline' },
|
|
12334
|
+
{ value: 'task', label: 'Task' },
|
|
12335
|
+
{ value: 'ai', label: 'AI' },
|
|
12336
|
+
{ value: 'frames', label: 'Frames' },
|
|
12337
|
+
{ value: 'issues', label: 'Issues' }
|
|
12338
|
+
], filterState, 'Device filter');
|
|
12339
|
+
|
|
12340
|
+
const sortSelect = createRemoteFleetSelect([
|
|
12341
|
+
{ value: 'status', label: 'Status' },
|
|
12342
|
+
{ value: 'name', label: 'Name' },
|
|
12343
|
+
{ value: 'recent', label: 'Recent' },
|
|
12344
|
+
{ value: 'memory', label: 'Memory' },
|
|
12345
|
+
{ value: 'load', label: 'Load' },
|
|
12346
|
+
{ value: 'task', label: 'Task' }
|
|
12347
|
+
], sortState, 'Device sort');
|
|
12348
|
+
|
|
12349
|
+
const densitySelect = createRemoteFleetSelect([
|
|
12350
|
+
{ value: 'cards', label: 'Cards' },
|
|
12351
|
+
{ value: 'dense', label: 'Dense' }
|
|
12352
|
+
], densityState, 'Device density');
|
|
12353
|
+
|
|
12354
|
+
const matchCount = document.createElement('div');
|
|
12355
|
+
matchCount.dataset.remoteFleetMatchCount = 'true';
|
|
12356
|
+
matchCount.style.cssText = `
|
|
12357
|
+
min-width: 72px;
|
|
12358
|
+
color: #334155;
|
|
12359
|
+
font-size: 11px;
|
|
12360
|
+
font-weight: 900;
|
|
12361
|
+
letter-spacing: 0;
|
|
12362
|
+
text-align: right;
|
|
12363
|
+
white-space: nowrap;
|
|
12364
|
+
overflow: hidden;
|
|
12365
|
+
text-overflow: ellipsis;
|
|
12366
|
+
`;
|
|
12367
|
+
|
|
12368
|
+
filterRow.appendChild(searchInput);
|
|
12369
|
+
filterRow.appendChild(filterSelect);
|
|
12370
|
+
filterRow.appendChild(sortSelect);
|
|
12371
|
+
filterRow.appendChild(densitySelect);
|
|
12372
|
+
filterRow.appendChild(matchCount);
|
|
12373
|
+
bodyView.appendChild(filterRow);
|
|
12374
|
+
|
|
12163
12375
|
const taskRow = document.createElement('div');
|
|
12164
12376
|
taskRow.style.cssText = `
|
|
12165
12377
|
display: grid;
|
|
12166
|
-
grid-template-columns: minmax(0, 1fr) auto auto;
|
|
12378
|
+
grid-template-columns: minmax(0, 1fr) auto auto auto;
|
|
12167
12379
|
gap: 8px;
|
|
12168
12380
|
align-items: stretch;
|
|
12169
12381
|
flex: 0 0 auto;
|
|
@@ -12212,6 +12424,7 @@
|
|
|
12212
12424
|
`;
|
|
12213
12425
|
const aiToggle = document.createElement('input');
|
|
12214
12426
|
aiToggle.type = 'checkbox';
|
|
12427
|
+
aiToggle.checked = aiAssistState;
|
|
12215
12428
|
aiToggle.dataset.remoteFleetAiToggle = 'true';
|
|
12216
12429
|
aiToggle.style.cssText = `
|
|
12217
12430
|
width: 14px;
|
|
@@ -12223,10 +12436,13 @@
|
|
|
12223
12436
|
aiToggleText.textContent = 'AI';
|
|
12224
12437
|
aiToggleLabel.appendChild(aiToggle);
|
|
12225
12438
|
aiToggleLabel.appendChild(aiToggleText);
|
|
12226
|
-
const
|
|
12439
|
+
const sendVisibleButton = createRemoteFleetButton('Send visible', 'Dispatch task to visible connected task-capable devices', 'task-visible');
|
|
12440
|
+
sendVisibleButton.style.height = '54px';
|
|
12441
|
+
const sendConnectedButton = createRemoteFleetButton('Send all', 'Dispatch task to all connected task-capable devices', 'task-connected');
|
|
12227
12442
|
sendConnectedButton.style.height = '54px';
|
|
12228
12443
|
taskRow.appendChild(taskInput);
|
|
12229
12444
|
taskRow.appendChild(aiToggleLabel);
|
|
12445
|
+
taskRow.appendChild(sendVisibleButton);
|
|
12230
12446
|
taskRow.appendChild(sendConnectedButton);
|
|
12231
12447
|
bodyView.appendChild(taskRow);
|
|
12232
12448
|
|
|
@@ -12273,7 +12489,7 @@
|
|
|
12273
12489
|
overflow-y: auto;
|
|
12274
12490
|
overflow-x: hidden;
|
|
12275
12491
|
display: grid;
|
|
12276
|
-
grid-template-columns: repeat(auto-fill, minmax(168px, 1fr));
|
|
12492
|
+
grid-template-columns: ${densityState === 'dense' ? 'repeat(auto-fill, minmax(220px, 1fr))' : 'repeat(auto-fill, minmax(168px, 1fr))'};
|
|
12277
12493
|
align-content: start;
|
|
12278
12494
|
gap: 8px;
|
|
12279
12495
|
padding-right: 4px;
|
|
@@ -12298,19 +12514,19 @@
|
|
|
12298
12514
|
grid.appendChild(empty);
|
|
12299
12515
|
} else {
|
|
12300
12516
|
devices.forEach(device => {
|
|
12301
|
-
const connectedDevice = device
|
|
12302
|
-
const name =
|
|
12517
|
+
const connectedDevice = isRemoteFleetDeviceConnected(device);
|
|
12518
|
+
const name = getRemoteFleetDeviceName(device);
|
|
12303
12519
|
const platform = [device?.platform || device?.Platform, device?.arch || device?.Arch]
|
|
12304
12520
|
.filter(Boolean)
|
|
12305
12521
|
.join(' / ') || 'unknown';
|
|
12306
12522
|
const release = String(device?.release || device?.Release || '');
|
|
12307
|
-
const deviceId =
|
|
12523
|
+
const deviceId = getRemoteFleetDeviceId(device);
|
|
12308
12524
|
const thumbnailEnabled = device?.thumbnailEnabled === true || device?.ThumbnailEnabled === true;
|
|
12309
12525
|
const thumbnailDataUrl = String(device?.thumbnailDataUrl || device?.ThumbnailDataUrl || '');
|
|
12310
12526
|
const thumbnailCapturedAt = String(device?.thumbnailCapturedAt || device?.ThumbnailCapturedAt || '');
|
|
12311
|
-
const hasThumbnail =
|
|
12312
|
-
const taskEnabled = device
|
|
12313
|
-
const aiAssistEnabled = device
|
|
12527
|
+
const hasThumbnail = hasRemoteFleetThumbnail(device);
|
|
12528
|
+
const taskEnabled = isRemoteFleetDeviceTaskCapable(device);
|
|
12529
|
+
const aiAssistEnabled = isRemoteFleetDeviceAiCapable(device);
|
|
12314
12530
|
const aiModel = String(device?.aiModel || device?.AiModel || '');
|
|
12315
12531
|
const latestTaskStatus = String(device?.latestTaskStatus || device?.LatestTaskStatus || '');
|
|
12316
12532
|
const latestTaskTitle = String(device?.latestTaskTitle || device?.LatestTaskTitle || '');
|
|
@@ -12320,80 +12536,88 @@
|
|
|
12320
12536
|
const latestTaskResult = String(device?.latestTaskResultSummary || device?.LatestTaskResultSummary || '');
|
|
12321
12537
|
const card = document.createElement('article');
|
|
12322
12538
|
card.dataset.deviceId = deviceId;
|
|
12539
|
+
card.dataset.remoteFleetSearchText = buildRemoteFleetSearchText(device);
|
|
12540
|
+
card.dataset.remoteFleetConnected = connectedDevice ? 'true' : 'false';
|
|
12541
|
+
card.dataset.remoteFleetTaskCapable = taskEnabled ? 'true' : 'false';
|
|
12542
|
+
card.dataset.remoteFleetAiCapable = aiAssistEnabled ? 'true' : 'false';
|
|
12543
|
+
card.dataset.remoteFleetHasFrame = hasThumbnail ? 'true' : 'false';
|
|
12544
|
+
card.dataset.remoteFleetIssue = (!connectedDevice || latestTaskStatus === 'failed' || !!latestTaskError) ? 'true' : 'false';
|
|
12323
12545
|
card.style.cssText = `
|
|
12324
12546
|
display: flex;
|
|
12325
12547
|
flex-direction: column;
|
|
12326
|
-
gap: 8px;
|
|
12548
|
+
gap: ${densityState === 'dense' ? '6px' : '8px'};
|
|
12327
12549
|
min-width: 0;
|
|
12328
|
-
min-height: 134px;
|
|
12329
|
-
padding: 10px;
|
|
12550
|
+
min-height: ${densityState === 'dense' ? '92px' : '134px'};
|
|
12551
|
+
padding: ${densityState === 'dense' ? '8px' : '10px'};
|
|
12330
12552
|
border-radius: 8px;
|
|
12331
12553
|
background: #ffffff;
|
|
12332
12554
|
border: 1px solid ${connectedDevice ? 'rgba(16, 185, 129, 0.34)' : 'rgba(148, 163, 184, 0.28)'};
|
|
12333
12555
|
box-shadow: 0 8px 20px rgba(15, 23, 42, 0.06);
|
|
12334
12556
|
`;
|
|
12335
12557
|
|
|
12336
|
-
|
|
12337
|
-
|
|
12338
|
-
|
|
12339
|
-
|
|
12340
|
-
aspect-ratio: 16 / 9;
|
|
12341
|
-
overflow: hidden;
|
|
12342
|
-
border-radius: 7px;
|
|
12343
|
-
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
|
|
12344
|
-
border: 1px solid rgba(15, 23, 42, 0.12);
|
|
12345
|
-
`;
|
|
12346
|
-
if (hasThumbnail) {
|
|
12347
|
-
const image = document.createElement('img');
|
|
12348
|
-
image.src = thumbnailDataUrl;
|
|
12349
|
-
image.alt = `${name} thumbnail`;
|
|
12350
|
-
image.loading = 'lazy';
|
|
12351
|
-
image.decoding = 'async';
|
|
12352
|
-
image.style.cssText = `
|
|
12558
|
+
if (densityState !== 'dense') {
|
|
12559
|
+
const preview = document.createElement('div');
|
|
12560
|
+
preview.style.cssText = `
|
|
12561
|
+
position: relative;
|
|
12353
12562
|
width: 100%;
|
|
12354
|
-
|
|
12355
|
-
object-fit: cover;
|
|
12356
|
-
display: block;
|
|
12357
|
-
`;
|
|
12358
|
-
preview.appendChild(image);
|
|
12359
|
-
} else {
|
|
12360
|
-
const placeholder = document.createElement('div');
|
|
12361
|
-
placeholder.textContent = thumbnailEnabled ? 'No frame yet' : 'Status only';
|
|
12362
|
-
placeholder.style.cssText = `
|
|
12363
|
-
position: absolute;
|
|
12364
|
-
inset: 0;
|
|
12365
|
-
display: flex;
|
|
12366
|
-
align-items: center;
|
|
12367
|
-
justify-content: center;
|
|
12368
|
-
color: rgba(226, 232, 240, 0.78);
|
|
12369
|
-
font-size: 11px;
|
|
12370
|
-
font-weight: 900;
|
|
12371
|
-
letter-spacing: 0;
|
|
12372
|
-
`;
|
|
12373
|
-
preview.appendChild(placeholder);
|
|
12374
|
-
}
|
|
12375
|
-
if (thumbnailCapturedAt) {
|
|
12376
|
-
const badge = document.createElement('span');
|
|
12377
|
-
badge.textContent = formatRemoteFleetAge(thumbnailCapturedAt);
|
|
12378
|
-
badge.style.cssText = `
|
|
12379
|
-
position: absolute;
|
|
12380
|
-
right: 6px;
|
|
12381
|
-
bottom: 6px;
|
|
12382
|
-
max-width: calc(100% - 12px);
|
|
12383
|
-
padding: 3px 6px;
|
|
12384
|
-
border-radius: 999px;
|
|
12385
|
-
background: rgba(15, 23, 42, 0.74);
|
|
12386
|
-
color: #e2e8f0;
|
|
12387
|
-
font-size: 9px;
|
|
12388
|
-
font-weight: 900;
|
|
12389
|
-
line-height: 1;
|
|
12563
|
+
aspect-ratio: 16 / 9;
|
|
12390
12564
|
overflow: hidden;
|
|
12391
|
-
|
|
12392
|
-
|
|
12565
|
+
border-radius: 7px;
|
|
12566
|
+
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
|
|
12567
|
+
border: 1px solid rgba(15, 23, 42, 0.12);
|
|
12393
12568
|
`;
|
|
12394
|
-
|
|
12569
|
+
if (hasThumbnail) {
|
|
12570
|
+
const image = document.createElement('img');
|
|
12571
|
+
image.src = thumbnailDataUrl;
|
|
12572
|
+
image.alt = `${name} thumbnail`;
|
|
12573
|
+
image.loading = 'lazy';
|
|
12574
|
+
image.decoding = 'async';
|
|
12575
|
+
image.style.cssText = `
|
|
12576
|
+
width: 100%;
|
|
12577
|
+
height: 100%;
|
|
12578
|
+
object-fit: cover;
|
|
12579
|
+
display: block;
|
|
12580
|
+
`;
|
|
12581
|
+
preview.appendChild(image);
|
|
12582
|
+
} else {
|
|
12583
|
+
const placeholder = document.createElement('div');
|
|
12584
|
+
placeholder.textContent = thumbnailEnabled ? 'No frame yet' : 'Status only';
|
|
12585
|
+
placeholder.style.cssText = `
|
|
12586
|
+
position: absolute;
|
|
12587
|
+
inset: 0;
|
|
12588
|
+
display: flex;
|
|
12589
|
+
align-items: center;
|
|
12590
|
+
justify-content: center;
|
|
12591
|
+
color: rgba(226, 232, 240, 0.78);
|
|
12592
|
+
font-size: 11px;
|
|
12593
|
+
font-weight: 900;
|
|
12594
|
+
letter-spacing: 0;
|
|
12595
|
+
`;
|
|
12596
|
+
preview.appendChild(placeholder);
|
|
12597
|
+
}
|
|
12598
|
+
if (thumbnailCapturedAt) {
|
|
12599
|
+
const badge = document.createElement('span');
|
|
12600
|
+
badge.textContent = formatRemoteFleetAge(thumbnailCapturedAt);
|
|
12601
|
+
badge.style.cssText = `
|
|
12602
|
+
position: absolute;
|
|
12603
|
+
right: 6px;
|
|
12604
|
+
bottom: 6px;
|
|
12605
|
+
max-width: calc(100% - 12px);
|
|
12606
|
+
padding: 3px 6px;
|
|
12607
|
+
border-radius: 999px;
|
|
12608
|
+
background: rgba(15, 23, 42, 0.74);
|
|
12609
|
+
color: #e2e8f0;
|
|
12610
|
+
font-size: 9px;
|
|
12611
|
+
font-weight: 900;
|
|
12612
|
+
line-height: 1;
|
|
12613
|
+
overflow: hidden;
|
|
12614
|
+
text-overflow: ellipsis;
|
|
12615
|
+
white-space: nowrap;
|
|
12616
|
+
`;
|
|
12617
|
+
preview.appendChild(badge);
|
|
12618
|
+
}
|
|
12619
|
+
card.appendChild(preview);
|
|
12395
12620
|
}
|
|
12396
|
-
card.appendChild(preview);
|
|
12397
12621
|
|
|
12398
12622
|
const cardHeader = document.createElement('div');
|
|
12399
12623
|
cardHeader.style.cssText = 'display:flex;align-items:flex-start;gap:8px;min-width:0;';
|
|
@@ -12470,7 +12694,23 @@
|
|
|
12470
12694
|
addMetric('Uptime', formatRemoteFleetDuration(device?.uptimeSec ?? device?.UptimeSec));
|
|
12471
12695
|
addMetric('Mem', formatRemoteFleetPercent(device?.usedMemRatio ?? device?.UsedMemRatio));
|
|
12472
12696
|
addMetric('Load', formatRemoteFleetNumber(device?.load1 ?? device?.Load1, 2));
|
|
12473
|
-
|
|
12697
|
+
if (densityState === 'dense') {
|
|
12698
|
+
const denseMeta = document.createElement('div');
|
|
12699
|
+
denseMeta.textContent = `Seen ${formatRemoteFleetAge(device?.lastSeenAt || device?.LastSeenAt)} - Mem ${formatRemoteFleetPercent(device?.usedMemRatio ?? device?.UsedMemRatio)} - Load ${formatRemoteFleetNumber(device?.load1 ?? device?.Load1, 2)}`;
|
|
12700
|
+
denseMeta.style.cssText = `
|
|
12701
|
+
color: #475569;
|
|
12702
|
+
font-size: 10px;
|
|
12703
|
+
font-weight: 750;
|
|
12704
|
+
line-height: 1.2;
|
|
12705
|
+
overflow: hidden;
|
|
12706
|
+
text-overflow: ellipsis;
|
|
12707
|
+
white-space: nowrap;
|
|
12708
|
+
letter-spacing: 0;
|
|
12709
|
+
`;
|
|
12710
|
+
card.appendChild(denseMeta);
|
|
12711
|
+
} else {
|
|
12712
|
+
card.appendChild(metrics);
|
|
12713
|
+
}
|
|
12474
12714
|
|
|
12475
12715
|
if (latestTaskStatus || latestTaskTitle || latestTaskResult || latestTaskError) {
|
|
12476
12716
|
const taskBox = document.createElement('div');
|
|
@@ -12559,12 +12799,31 @@
|
|
|
12559
12799
|
card.appendChild(actions);
|
|
12560
12800
|
grid.appendChild(card);
|
|
12561
12801
|
});
|
|
12802
|
+
|
|
12803
|
+
const noMatch = document.createElement('div');
|
|
12804
|
+
noMatch.dataset.remoteFleetNoMatch = 'true';
|
|
12805
|
+
noMatch.textContent = 'No matching devices.';
|
|
12806
|
+
noMatch.style.cssText = `
|
|
12807
|
+
grid-column: 1 / -1;
|
|
12808
|
+
display: none;
|
|
12809
|
+
align-items: center;
|
|
12810
|
+
min-height: 74px;
|
|
12811
|
+
padding: 14px;
|
|
12812
|
+
border-radius: 8px;
|
|
12813
|
+
border: 1px dashed rgba(100, 116, 139, 0.36);
|
|
12814
|
+
color: #475569;
|
|
12815
|
+
font-size: 13px;
|
|
12816
|
+
font-weight: 850;
|
|
12817
|
+
background: rgba(255, 255, 255, 0.74);
|
|
12818
|
+
`;
|
|
12819
|
+
grid.appendChild(noMatch);
|
|
12562
12820
|
}
|
|
12563
12821
|
|
|
12564
12822
|
bodyView.appendChild(grid);
|
|
12565
12823
|
|
|
12566
12824
|
const footer = document.createElement('div');
|
|
12567
12825
|
footer.textContent = `Endpoint ${endpoint} · refreshed ${formatRemoteFleetAge(refreshedAt)}`;
|
|
12826
|
+
footer.textContent = `Endpoint ${endpoint} - all devices, no paging - refreshed ${formatRemoteFleetAge(refreshedAt)}`;
|
|
12568
12827
|
footer.style.cssText = `
|
|
12569
12828
|
flex: 0 0 auto;
|
|
12570
12829
|
color: #64748b;
|
|
@@ -12600,6 +12859,127 @@
|
|
|
12600
12859
|
|
|
12601
12860
|
const readTaskInstruction = () => String(taskInput.value || '').trim();
|
|
12602
12861
|
const useAiAssist = () => aiToggle.checked === true;
|
|
12862
|
+
const getDeviceCards = () => Array.from(grid.querySelectorAll('article[data-device-id]'));
|
|
12863
|
+
const getVisibleEligibleDeviceIds = () => {
|
|
12864
|
+
const wantsAi = useAiAssist();
|
|
12865
|
+
return getDeviceCards()
|
|
12866
|
+
.filter(card => card.style.display !== 'none'
|
|
12867
|
+
&& card.dataset.remoteFleetConnected === 'true'
|
|
12868
|
+
&& card.dataset.remoteFleetTaskCapable === 'true'
|
|
12869
|
+
&& (!wantsAi || card.dataset.remoteFleetAiCapable === 'true'))
|
|
12870
|
+
.map(card => String(card.dataset.deviceId || '').trim())
|
|
12871
|
+
.filter(Boolean);
|
|
12872
|
+
};
|
|
12873
|
+
|
|
12874
|
+
const applyRemoteFleetFilters = () => {
|
|
12875
|
+
const searchText = String(searchInput.value || '').trim().toLowerCase();
|
|
12876
|
+
const terms = searchText.split(/\s+/).filter(Boolean);
|
|
12877
|
+
const filterMode = String(filterSelect.value || 'all');
|
|
12878
|
+
let visible = 0;
|
|
12879
|
+
let eligible = 0;
|
|
12880
|
+
const wantsAi = useAiAssist();
|
|
12881
|
+
|
|
12882
|
+
getDeviceCards().forEach(card => {
|
|
12883
|
+
const matchesSearch = terms.length === 0
|
|
12884
|
+
|| terms.every(term => String(card.dataset.remoteFleetSearchText || '').includes(term));
|
|
12885
|
+
const matchesMode = filterMode === 'all'
|
|
12886
|
+
|| (filterMode === 'connected' && card.dataset.remoteFleetConnected === 'true')
|
|
12887
|
+
|| (filterMode === 'offline' && card.dataset.remoteFleetConnected !== 'true')
|
|
12888
|
+
|| (filterMode === 'task' && card.dataset.remoteFleetConnected === 'true' && card.dataset.remoteFleetTaskCapable === 'true')
|
|
12889
|
+
|| (filterMode === 'ai' && card.dataset.remoteFleetConnected === 'true' && card.dataset.remoteFleetAiCapable === 'true')
|
|
12890
|
+
|| (filterMode === 'frames' && card.dataset.remoteFleetHasFrame === 'true')
|
|
12891
|
+
|| (filterMode === 'issues' && card.dataset.remoteFleetIssue === 'true');
|
|
12892
|
+
const show = matchesSearch && matchesMode;
|
|
12893
|
+
card.style.display = show ? 'flex' : 'none';
|
|
12894
|
+
if (show) {
|
|
12895
|
+
visible += 1;
|
|
12896
|
+
if (card.dataset.remoteFleetConnected === 'true'
|
|
12897
|
+
&& card.dataset.remoteFleetTaskCapable === 'true'
|
|
12898
|
+
&& (!wantsAi || card.dataset.remoteFleetAiCapable === 'true')) {
|
|
12899
|
+
eligible += 1;
|
|
12900
|
+
}
|
|
12901
|
+
}
|
|
12902
|
+
});
|
|
12903
|
+
|
|
12904
|
+
const noMatch = grid.querySelector('[data-remote-fleet-no-match="true"]');
|
|
12905
|
+
if (noMatch) {
|
|
12906
|
+
noMatch.style.display = devices.length > 0 && visible === 0 ? 'flex' : 'none';
|
|
12907
|
+
}
|
|
12908
|
+
|
|
12909
|
+
matchCount.textContent = `${visible}/${devices.length}`;
|
|
12910
|
+
matchCount.title = `${visible} visible, ${eligible} targetable`;
|
|
12911
|
+
sendVisibleButton.disabled = eligible <= 0;
|
|
12912
|
+
sendVisibleButton.title = eligible > 0
|
|
12913
|
+
? `Dispatch to ${eligible} visible target(s)`
|
|
12914
|
+
: 'No visible targetable devices';
|
|
12915
|
+
const allTargetCount = wantsAi ? aiCapableCount : taskCapableCount;
|
|
12916
|
+
sendConnectedButton.disabled = allTargetCount <= 0;
|
|
12917
|
+
sendConnectedButton.title = allTargetCount > 0
|
|
12918
|
+
? `Dispatch to ${allTargetCount} connected target(s)`
|
|
12919
|
+
: 'No connected targetable devices';
|
|
12920
|
+
grid.querySelectorAll('[data-remote-fleet-action="task-device"]').forEach(button => {
|
|
12921
|
+
const card = button.closest('article[data-device-id]');
|
|
12922
|
+
button.disabled = wantsAi && card?.dataset.remoteFleetAiCapable !== 'true';
|
|
12923
|
+
button.title = button.disabled ? 'AI assist is not enabled on this device' : 'Dispatch task to this device';
|
|
12924
|
+
});
|
|
12925
|
+
|
|
12926
|
+
bodyView.dataset.remoteFleetSearch = searchText;
|
|
12927
|
+
bodyView.dataset.remoteFleetFilter = filterMode;
|
|
12928
|
+
bodyView.dataset.remoteFleetSort = String(sortSelect.value || 'status');
|
|
12929
|
+
bodyView.dataset.remoteFleetDensity = String(densitySelect.value || 'cards');
|
|
12930
|
+
bodyView.dataset.remoteFleetAiAssist = wantsAi ? 'true' : 'false';
|
|
12931
|
+
};
|
|
12932
|
+
|
|
12933
|
+
[searchInput, filterSelect, sortSelect, densitySelect, aiToggle].forEach(control => {
|
|
12934
|
+
['mousedown', 'mouseup', 'click', 'dblclick', 'keydown'].forEach(eventName => {
|
|
12935
|
+
control.addEventListener(eventName, event => event.stopPropagation());
|
|
12936
|
+
});
|
|
12937
|
+
});
|
|
12938
|
+
|
|
12939
|
+
searchInput.addEventListener('input', applyRemoteFleetFilters);
|
|
12940
|
+
filterSelect.addEventListener('change', applyRemoteFleetFilters);
|
|
12941
|
+
aiToggle.addEventListener('change', applyRemoteFleetFilters);
|
|
12942
|
+
sortSelect.addEventListener('change', () => {
|
|
12943
|
+
bodyView.dataset.remoteFleetSort = String(sortSelect.value || 'status');
|
|
12944
|
+
renderRemoteFleetMonitor(bodyView, nodeModel);
|
|
12945
|
+
});
|
|
12946
|
+
densitySelect.addEventListener('change', () => {
|
|
12947
|
+
bodyView.dataset.remoteFleetDensity = String(densitySelect.value || 'cards');
|
|
12948
|
+
renderRemoteFleetMonitor(bodyView, nodeModel);
|
|
12949
|
+
});
|
|
12950
|
+
applyRemoteFleetFilters();
|
|
12951
|
+
|
|
12952
|
+
sendVisibleButton.addEventListener('click', async event => {
|
|
12953
|
+
event.preventDefault();
|
|
12954
|
+
event.stopPropagation();
|
|
12955
|
+
const instruction = readTaskInstruction();
|
|
12956
|
+
if (!instruction) {
|
|
12957
|
+
setTaskFeedback('Write a task first.', 'error');
|
|
12958
|
+
taskInput.focus();
|
|
12959
|
+
return;
|
|
12960
|
+
}
|
|
12961
|
+
|
|
12962
|
+
const targetIds = getVisibleEligibleDeviceIds();
|
|
12963
|
+
if (targetIds.length === 0) {
|
|
12964
|
+
setTaskFeedback('No visible targetable devices.', 'error');
|
|
12965
|
+
return;
|
|
12966
|
+
}
|
|
12967
|
+
|
|
12968
|
+
sendVisibleButton.disabled = true;
|
|
12969
|
+
setTaskFeedback('Dispatching task to visible devices...');
|
|
12970
|
+
try {
|
|
12971
|
+
const result = await invokeDotNetAsync('DispatchRemoteFleetTaskBatchFromJs', nodeId, targetIds, instruction, useAiAssist());
|
|
12972
|
+
await syncRemoteFleetNodeStateFromResult(result);
|
|
12973
|
+
if (result?.success) {
|
|
12974
|
+
const mode = useAiAssist() ? 'AI task' : 'remote task';
|
|
12975
|
+
setTaskFeedback(`Queued ${result.queued || targetIds.length} visible ${mode}(s).`, 'success');
|
|
12976
|
+
} else {
|
|
12977
|
+
setTaskFeedback(result?.error || 'Task dispatch failed.', 'error');
|
|
12978
|
+
}
|
|
12979
|
+
} finally {
|
|
12980
|
+
applyRemoteFleetFilters();
|
|
12981
|
+
}
|
|
12982
|
+
});
|
|
12603
12983
|
|
|
12604
12984
|
sendConnectedButton.addEventListener('click', async event => {
|
|
12605
12985
|
event.preventDefault();
|
|
@@ -12623,7 +13003,7 @@
|
|
|
12623
13003
|
setTaskFeedback(result?.error || 'Task dispatch failed.', 'error');
|
|
12624
13004
|
}
|
|
12625
13005
|
} finally {
|
|
12626
|
-
|
|
13006
|
+
applyRemoteFleetFilters();
|
|
12627
13007
|
}
|
|
12628
13008
|
});
|
|
12629
13009
|
|
|
@@ -12670,6 +13050,7 @@
|
|
|
12670
13050
|
}
|
|
12671
13051
|
} finally {
|
|
12672
13052
|
button.disabled = false;
|
|
13053
|
+
applyRemoteFleetFilters();
|
|
12673
13054
|
}
|
|
12674
13055
|
});
|
|
12675
13056
|
});
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mainAssemblyName": "MindExecution.Web",
|
|
3
3
|
"resources": {
|
|
4
|
-
"hash": "sha256
|
|
4
|
+
"hash": "sha256-/odScRNovgEc8hBO1R9VAaBYER2ZEkgcGNL8jCOVsoU=",
|
|
5
5
|
"fingerprinting": {
|
|
6
6
|
"Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
|
|
7
7
|
"Markdig.d1j7v41cl1.dll": "Markdig.dll",
|
|
@@ -123,16 +123,16 @@
|
|
|
123
123
|
"System.m05i39uvk9.dll": "System.dll",
|
|
124
124
|
"netstandard.0xet7jg7ky.dll": "netstandard.dll",
|
|
125
125
|
"System.Private.CoreLib.rkafq04oma.dll": "System.Private.CoreLib.dll",
|
|
126
|
-
"MindExecution.Core.
|
|
127
|
-
"MindExecution.Kernel.
|
|
128
|
-
"MindExecution.Plugins.Admin.
|
|
129
|
-
"MindExecution.Plugins.Business.
|
|
130
|
-
"MindExecution.Plugins.Concept.
|
|
131
|
-
"MindExecution.Plugins.Directory.
|
|
132
|
-
"MindExecution.Plugins.PlanMaster.
|
|
133
|
-
"MindExecution.Plugins.YouTube.
|
|
134
|
-
"MindExecution.Shared.
|
|
135
|
-
"MindExecution.Web.
|
|
126
|
+
"MindExecution.Core.kf4752v5yl.dll": "MindExecution.Core.dll",
|
|
127
|
+
"MindExecution.Kernel.79mgmkpsy1.dll": "MindExecution.Kernel.dll",
|
|
128
|
+
"MindExecution.Plugins.Admin.8ey1m70q79.dll": "MindExecution.Plugins.Admin.dll",
|
|
129
|
+
"MindExecution.Plugins.Business.8rvwgqzxaz.dll": "MindExecution.Plugins.Business.dll",
|
|
130
|
+
"MindExecution.Plugins.Concept.ynnk3bqf03.dll": "MindExecution.Plugins.Concept.dll",
|
|
131
|
+
"MindExecution.Plugins.Directory.vi24rmnuyq.dll": "MindExecution.Plugins.Directory.dll",
|
|
132
|
+
"MindExecution.Plugins.PlanMaster.9r08m5atjr.dll": "MindExecution.Plugins.PlanMaster.dll",
|
|
133
|
+
"MindExecution.Plugins.YouTube.fjkbniwa4o.dll": "MindExecution.Plugins.YouTube.dll",
|
|
134
|
+
"MindExecution.Shared.e0qnm5vtax.dll": "MindExecution.Shared.dll",
|
|
135
|
+
"MindExecution.Web.wk9yv02eva.dll": "MindExecution.Web.dll",
|
|
136
136
|
"dotnet.js": "dotnet.js",
|
|
137
137
|
"dotnet.native.xsn1d6x2kd.js": "dotnet.native.js",
|
|
138
138
|
"dotnet.native.vz0adxojrz.wasm": "dotnet.native.wasm",
|
|
@@ -278,18 +278,18 @@
|
|
|
278
278
|
"System.Xml.XDocument.c539ki6cuq.dll": "sha256-MPTRJkptrL9nGa2tl4kF46+wErNUYRPCGblX3ANoKoY=",
|
|
279
279
|
"System.m05i39uvk9.dll": "sha256-5jDfIdbYAigw7/Q/lMzt5W/+cayGbW9ko9FvuaN1GsQ=",
|
|
280
280
|
"netstandard.0xet7jg7ky.dll": "sha256-xENDv620uJ8fHwLJ2bdhrTHz4QPjvqXOztnk2a4wr0c=",
|
|
281
|
-
"MindExecution.Core.
|
|
282
|
-
"MindExecution.Kernel.
|
|
283
|
-
"MindExecution.Plugins.Concept.
|
|
284
|
-
"MindExecution.Plugins.PlanMaster.
|
|
285
|
-
"MindExecution.Shared.
|
|
286
|
-
"MindExecution.Web.
|
|
281
|
+
"MindExecution.Core.kf4752v5yl.dll": "sha256-MK+6sYNYxso5bmurLtzuQOy6PiIr6jHmV0DMzHSg+sc=",
|
|
282
|
+
"MindExecution.Kernel.79mgmkpsy1.dll": "sha256-qwoCzn5eUut0Qz0kvhUJmtlPAtoMtYtMTv9c4ekX84o=",
|
|
283
|
+
"MindExecution.Plugins.Concept.ynnk3bqf03.dll": "sha256-Mvw1k0NexULKDOElumjmqjK4jl2MS5NNvFrTnBDZ2qc=",
|
|
284
|
+
"MindExecution.Plugins.PlanMaster.9r08m5atjr.dll": "sha256-K2De6QooRNGCQL7zfYyZ4aeMZZE2etfT4Aj52u7y+RQ=",
|
|
285
|
+
"MindExecution.Shared.e0qnm5vtax.dll": "sha256-bh3YoyPl9H4U9q8TO3u6hoJLMoWW0sYxJyJwj8heek0=",
|
|
286
|
+
"MindExecution.Web.wk9yv02eva.dll": "sha256-AHwwn1rOC7uDlpCJJLndmyf97G7nM018K4WpzRuPwTg="
|
|
287
287
|
},
|
|
288
288
|
"lazyAssembly": {
|
|
289
|
-
"MindExecution.Plugins.Admin.
|
|
290
|
-
"MindExecution.Plugins.Business.
|
|
291
|
-
"MindExecution.Plugins.Directory.
|
|
292
|
-
"MindExecution.Plugins.YouTube.
|
|
289
|
+
"MindExecution.Plugins.Admin.8ey1m70q79.dll": "sha256-oMlSl7sNr3GfLsqVskx6UNQMyoGJANENnZIL62rfG+c=",
|
|
290
|
+
"MindExecution.Plugins.Business.8rvwgqzxaz.dll": "sha256-xJBBAfZAEw5jQcNThJNI3vKn2rLWuCRV7Oo8onCFwOo=",
|
|
291
|
+
"MindExecution.Plugins.Directory.vi24rmnuyq.dll": "sha256-x+iwabNhSVcOgBw2RlEp7HSQ7Eep/nvCn+lZVNGxCK8=",
|
|
292
|
+
"MindExecution.Plugins.YouTube.fjkbniwa4o.dll": "sha256-RUR2I22IaFbLmHY/Gcw7wfwiybsIs8m+kgMfo1i78+w="
|
|
293
293
|
}
|
|
294
294
|
},
|
|
295
295
|
"cacheBootResources": true,
|
package/wwwroot/index.html
CHANGED
|
@@ -558,7 +558,7 @@
|
|
|
558
558
|
}
|
|
559
559
|
|
|
560
560
|
const base = '_content/MindExecution.Shared/js/';
|
|
561
|
-
const scriptVersion = '20260612-remote-
|
|
561
|
+
const scriptVersion = '20260612-remote-fleet-scale-v466';
|
|
562
562
|
const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
|
|
563
563
|
console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
|
|
564
564
|
const criticalScripts = [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
self.assetsManifest = {
|
|
2
|
-
"version": "
|
|
2
|
+
"version": "tyUOiEjY",
|
|
3
3
|
"assets": [
|
|
4
4
|
{
|
|
5
5
|
"hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"url": "_content/MindExecution.Shared/js/mind-map-core.js.backup"
|
|
87
87
|
},
|
|
88
88
|
{
|
|
89
|
-
"hash": "sha256-
|
|
89
|
+
"hash": "sha256-UIJj28RUmbRzdxZB7yxJHs88G8t0QTV1mCQOJeHywK8=",
|
|
90
90
|
"url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
|
|
91
91
|
},
|
|
92
92
|
{
|
|
@@ -410,44 +410,44 @@
|
|
|
410
410
|
"url": "_framework/MimeMapping.og9ys58ylm.dll"
|
|
411
411
|
},
|
|
412
412
|
{
|
|
413
|
-
"hash": "sha256-
|
|
414
|
-
"url": "_framework/MindExecution.Core.
|
|
413
|
+
"hash": "sha256-MK+6sYNYxso5bmurLtzuQOy6PiIr6jHmV0DMzHSg+sc=",
|
|
414
|
+
"url": "_framework/MindExecution.Core.kf4752v5yl.dll"
|
|
415
415
|
},
|
|
416
416
|
{
|
|
417
|
-
"hash": "sha256-
|
|
418
|
-
"url": "_framework/MindExecution.Kernel.
|
|
417
|
+
"hash": "sha256-qwoCzn5eUut0Qz0kvhUJmtlPAtoMtYtMTv9c4ekX84o=",
|
|
418
|
+
"url": "_framework/MindExecution.Kernel.79mgmkpsy1.dll"
|
|
419
419
|
},
|
|
420
420
|
{
|
|
421
|
-
"hash": "sha256-
|
|
422
|
-
"url": "_framework/MindExecution.Plugins.Admin.
|
|
421
|
+
"hash": "sha256-oMlSl7sNr3GfLsqVskx6UNQMyoGJANENnZIL62rfG+c=",
|
|
422
|
+
"url": "_framework/MindExecution.Plugins.Admin.8ey1m70q79.dll"
|
|
423
423
|
},
|
|
424
424
|
{
|
|
425
|
-
"hash": "sha256-
|
|
426
|
-
"url": "_framework/MindExecution.Plugins.Business.
|
|
425
|
+
"hash": "sha256-xJBBAfZAEw5jQcNThJNI3vKn2rLWuCRV7Oo8onCFwOo=",
|
|
426
|
+
"url": "_framework/MindExecution.Plugins.Business.8rvwgqzxaz.dll"
|
|
427
427
|
},
|
|
428
428
|
{
|
|
429
|
-
"hash": "sha256-
|
|
430
|
-
"url": "_framework/MindExecution.Plugins.Concept.
|
|
429
|
+
"hash": "sha256-Mvw1k0NexULKDOElumjmqjK4jl2MS5NNvFrTnBDZ2qc=",
|
|
430
|
+
"url": "_framework/MindExecution.Plugins.Concept.ynnk3bqf03.dll"
|
|
431
431
|
},
|
|
432
432
|
{
|
|
433
|
-
"hash": "sha256-
|
|
434
|
-
"url": "_framework/MindExecution.Plugins.Directory.
|
|
433
|
+
"hash": "sha256-x+iwabNhSVcOgBw2RlEp7HSQ7Eep/nvCn+lZVNGxCK8=",
|
|
434
|
+
"url": "_framework/MindExecution.Plugins.Directory.vi24rmnuyq.dll"
|
|
435
435
|
},
|
|
436
436
|
{
|
|
437
|
-
"hash": "sha256-
|
|
438
|
-
"url": "_framework/MindExecution.Plugins.PlanMaster.
|
|
437
|
+
"hash": "sha256-K2De6QooRNGCQL7zfYyZ4aeMZZE2etfT4Aj52u7y+RQ=",
|
|
438
|
+
"url": "_framework/MindExecution.Plugins.PlanMaster.9r08m5atjr.dll"
|
|
439
439
|
},
|
|
440
440
|
{
|
|
441
|
-
"hash": "sha256-
|
|
442
|
-
"url": "_framework/MindExecution.Plugins.YouTube.
|
|
441
|
+
"hash": "sha256-RUR2I22IaFbLmHY/Gcw7wfwiybsIs8m+kgMfo1i78+w=",
|
|
442
|
+
"url": "_framework/MindExecution.Plugins.YouTube.fjkbniwa4o.dll"
|
|
443
443
|
},
|
|
444
444
|
{
|
|
445
|
-
"hash": "sha256-
|
|
446
|
-
"url": "_framework/MindExecution.Shared.
|
|
445
|
+
"hash": "sha256-bh3YoyPl9H4U9q8TO3u6hoJLMoWW0sYxJyJwj8heek0=",
|
|
446
|
+
"url": "_framework/MindExecution.Shared.e0qnm5vtax.dll"
|
|
447
447
|
},
|
|
448
448
|
{
|
|
449
|
-
"hash": "sha256-
|
|
450
|
-
"url": "_framework/MindExecution.Web.
|
|
449
|
+
"hash": "sha256-AHwwn1rOC7uDlpCJJLndmyf97G7nM018K4WpzRuPwTg=",
|
|
450
|
+
"url": "_framework/MindExecution.Web.wk9yv02eva.dll"
|
|
451
451
|
},
|
|
452
452
|
{
|
|
453
453
|
"hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
|
|
@@ -770,7 +770,7 @@
|
|
|
770
770
|
"url": "_framework/Websocket.Client.vapounvmnl.dll"
|
|
771
771
|
},
|
|
772
772
|
{
|
|
773
|
-
"hash": "sha256-
|
|
773
|
+
"hash": "sha256-v2ZTmYhjrtyEfbHSvkcdnYwoI+IoWSf/opZgluPefHA=",
|
|
774
774
|
"url": "_framework/blazor.boot.json"
|
|
775
775
|
},
|
|
776
776
|
{
|
|
@@ -834,7 +834,7 @@
|
|
|
834
834
|
"url": "image-manifest.json"
|
|
835
835
|
},
|
|
836
836
|
{
|
|
837
|
-
"hash": "sha256-
|
|
837
|
+
"hash": "sha256-TU40FZ+Rzj9ZDbwOAysHnWs1F2588obb2+wwcp7Mcy4=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|
|
Binary file
|
|
Binary file
|