@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.
Files changed (18) hide show
  1. package/package.json +6 -6
  2. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +457 -76
  3. package/wwwroot/_framework/MindExecution.Core.kf4752v5yl.dll +0 -0
  4. package/wwwroot/_framework/{MindExecution.Kernel.9wfplilp5l.dll → MindExecution.Kernel.79mgmkpsy1.dll} +0 -0
  5. package/wwwroot/_framework/{MindExecution.Plugins.Admin.sb1vkmct0w.dll → MindExecution.Plugins.Admin.8ey1m70q79.dll} +0 -0
  6. package/wwwroot/_framework/{MindExecution.Plugins.Business.zr7rkofx44.dll → MindExecution.Plugins.Business.8rvwgqzxaz.dll} +0 -0
  7. package/wwwroot/_framework/{MindExecution.Plugins.Concept.g6wd36v92i.dll → MindExecution.Plugins.Concept.ynnk3bqf03.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Directory.bb5flwt0u7.dll → MindExecution.Plugins.Directory.vi24rmnuyq.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll → MindExecution.Plugins.PlanMaster.9r08m5atjr.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.l811fqx9e0.dll → MindExecution.Plugins.YouTube.fjkbniwa4o.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Shared.oseamdg577.dll → MindExecution.Shared.e0qnm5vtax.dll} +0 -0
  12. package/wwwroot/_framework/MindExecution.Web.wk9yv02eva.dll +0 -0
  13. package/wwwroot/_framework/blazor.boot.json +21 -21
  14. package/wwwroot/index.html +1 -1
  15. package/wwwroot/service-worker-assets.js +24 -24
  16. package/wwwroot/service-worker.js +1 -1
  17. package/wwwroot/_framework/MindExecution.Core.27f2blpou6.dll +0 -0
  18. 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.5",
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 devices = parseRemoteFleetDevices(nodeModel);
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(device => device?.connected === true || device?.Connected === true).length));
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('Mode', 'All', 'default'));
12127
- top.appendChild(createRemoteFleetStat('Paging', 'None', 'default'));
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 sendConnectedButton = createRemoteFleetButton('Send connected', 'Dispatch task to all connected task-capable devices', 'task-connected');
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?.connected === true || device?.Connected === true;
12302
- const name = String(device?.name || device?.Name || device?.hostname || device?.Hostname || device?.deviceId || device?.DeviceId || 'device');
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 = String(device?.deviceId || device?.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 = /^data:image\/(png|jpe?g|webp|svg\+xml);base64,/i.test(thumbnailDataUrl);
12312
- const taskEnabled = device?.computerAgentEnabled === true || device?.ComputerAgentEnabled === true;
12313
- const aiAssistEnabled = device?.aiAssistEnabled === true || device?.AiAssistEnabled === true;
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
- const preview = document.createElement('div');
12337
- preview.style.cssText = `
12338
- position: relative;
12339
- width: 100%;
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
- height: 100%;
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
- text-overflow: ellipsis;
12392
- white-space: nowrap;
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
- preview.appendChild(badge);
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
- card.appendChild(metrics);
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
- sendConnectedButton.disabled = false;
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
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-pNivN7EJaBIokgTOUsXUgk3uMPTdJMPxWR5WEc3XWNk=",
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.27f2blpou6.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.9wfplilp5l.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.sb1vkmct0w.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.zr7rkofx44.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.g6wd36v92i.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.bb5flwt0u7.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.l811fqx9e0.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.oseamdg577.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.96r3nnp9is.dll": "MindExecution.Web.dll",
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.27f2blpou6.dll": "sha256-bqjP4oZY0UUVrmz+2Ctlf51S2Uo5Y/AKoPqoHy4pOnw=",
282
- "MindExecution.Kernel.9wfplilp5l.dll": "sha256-uWkVGORohTBq4U8aic2oWXUFy9SnLejWJO5jA4AYUv4=",
283
- "MindExecution.Plugins.Concept.g6wd36v92i.dll": "sha256-2DAMmcKQQlL5nDSjz2wZpO3rsJZCKV47BD19znoecJc=",
284
- "MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll": "sha256-ThFpjeyaMI19u6kLpApau9CFMDFKu0qAXvW45raEf4A=",
285
- "MindExecution.Shared.oseamdg577.dll": "sha256-aNNAxyXR5QAJc8/7NHb0SkPoCV/ZfKxUpI1EutwVPoU=",
286
- "MindExecution.Web.96r3nnp9is.dll": "sha256-Ua8v/da0JRYdWnLlYTo7RN8X+fLqj0Fx2ep9gtN0GS4="
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.sb1vkmct0w.dll": "sha256-iDuN0GDy4cf1SBO0F9oNo6GO3m98b3TfcSaQWtQK5q8=",
290
- "MindExecution.Plugins.Business.zr7rkofx44.dll": "sha256-H4Q/ZDzQZhQkspAue90LyhKxSx6KmvoqYZrQYavlsN4=",
291
- "MindExecution.Plugins.Directory.bb5flwt0u7.dll": "sha256-WbJHd3y3nymvVCvYGNYYw7/ywI8NraYmG8Y2IFch1u8=",
292
- "MindExecution.Plugins.YouTube.l811fqx9e0.dll": "sha256-e9zKVUmEONig5ScJXvPEPBQf+MAVyfEqyCTncHnO8Y0="
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,
@@ -558,7 +558,7 @@
558
558
  }
559
559
 
560
560
  const base = '_content/MindExecution.Shared/js/';
561
- const scriptVersion = '20260612-remote-ai-v465';
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": "wLEvF+gp",
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-hBSas6gvVUMu0hBpxyG+W6xv8+NN7JcjiSq0+C6ZjGU=",
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-bqjP4oZY0UUVrmz+2Ctlf51S2Uo5Y/AKoPqoHy4pOnw=",
414
- "url": "_framework/MindExecution.Core.27f2blpou6.dll"
413
+ "hash": "sha256-MK+6sYNYxso5bmurLtzuQOy6PiIr6jHmV0DMzHSg+sc=",
414
+ "url": "_framework/MindExecution.Core.kf4752v5yl.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-uWkVGORohTBq4U8aic2oWXUFy9SnLejWJO5jA4AYUv4=",
418
- "url": "_framework/MindExecution.Kernel.9wfplilp5l.dll"
417
+ "hash": "sha256-qwoCzn5eUut0Qz0kvhUJmtlPAtoMtYtMTv9c4ekX84o=",
418
+ "url": "_framework/MindExecution.Kernel.79mgmkpsy1.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-iDuN0GDy4cf1SBO0F9oNo6GO3m98b3TfcSaQWtQK5q8=",
422
- "url": "_framework/MindExecution.Plugins.Admin.sb1vkmct0w.dll"
421
+ "hash": "sha256-oMlSl7sNr3GfLsqVskx6UNQMyoGJANENnZIL62rfG+c=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.8ey1m70q79.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-H4Q/ZDzQZhQkspAue90LyhKxSx6KmvoqYZrQYavlsN4=",
426
- "url": "_framework/MindExecution.Plugins.Business.zr7rkofx44.dll"
425
+ "hash": "sha256-xJBBAfZAEw5jQcNThJNI3vKn2rLWuCRV7Oo8onCFwOo=",
426
+ "url": "_framework/MindExecution.Plugins.Business.8rvwgqzxaz.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-2DAMmcKQQlL5nDSjz2wZpO3rsJZCKV47BD19znoecJc=",
430
- "url": "_framework/MindExecution.Plugins.Concept.g6wd36v92i.dll"
429
+ "hash": "sha256-Mvw1k0NexULKDOElumjmqjK4jl2MS5NNvFrTnBDZ2qc=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.ynnk3bqf03.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-WbJHd3y3nymvVCvYGNYYw7/ywI8NraYmG8Y2IFch1u8=",
434
- "url": "_framework/MindExecution.Plugins.Directory.bb5flwt0u7.dll"
433
+ "hash": "sha256-x+iwabNhSVcOgBw2RlEp7HSQ7Eep/nvCn+lZVNGxCK8=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.vi24rmnuyq.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-ThFpjeyaMI19u6kLpApau9CFMDFKu0qAXvW45raEf4A=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll"
437
+ "hash": "sha256-K2De6QooRNGCQL7zfYyZ4aeMZZE2etfT4Aj52u7y+RQ=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.9r08m5atjr.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-e9zKVUmEONig5ScJXvPEPBQf+MAVyfEqyCTncHnO8Y0=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.l811fqx9e0.dll"
441
+ "hash": "sha256-RUR2I22IaFbLmHY/Gcw7wfwiybsIs8m+kgMfo1i78+w=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.fjkbniwa4o.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-aNNAxyXR5QAJc8/7NHb0SkPoCV/ZfKxUpI1EutwVPoU=",
446
- "url": "_framework/MindExecution.Shared.oseamdg577.dll"
445
+ "hash": "sha256-bh3YoyPl9H4U9q8TO3u6hoJLMoWW0sYxJyJwj8heek0=",
446
+ "url": "_framework/MindExecution.Shared.e0qnm5vtax.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-Ua8v/da0JRYdWnLlYTo7RN8X+fLqj0Fx2ep9gtN0GS4=",
450
- "url": "_framework/MindExecution.Web.96r3nnp9is.dll"
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-kTyP4Fsv/AOm0/MqoZ+M1/9yt5ZgNrXfJE8PEsMaTqQ=",
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-Cf/mSFH1jP/r7yYXdv2Fyy4jqSjg5ouxZIKPgeRRLQI=",
837
+ "hash": "sha256-TU40FZ+Rzj9ZDbwOAysHnWs1F2588obb2+wwcp7Mcy4=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: wLEvF+gp */
1
+ /* Manifest version: tyUOiEjY */
2
2
  // Hosted deployments should prefer the network over stale offline caches.
3
3
  // This service worker immediately clears old Blazor offline caches and unregisters itself.
4
4