@mindexec/cli 0.2.30 → 0.2.32

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.30",
3
+ "version": "0.2.32",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -412,7 +412,7 @@ function wait(ms = 0) {
412
412
  return new Promise(resolve => setTimeout(resolve, ms));
413
413
  }
414
414
 
415
- function buildMonitorNode(devices, hubStatus, latestTaskBatch = null, recentTaskBatches = []) {
415
+ function buildMonitorNode(devices, hubStatus, latestTaskBatch = null, recentTaskBatches = [], lastError = '') {
416
416
  const connected = devices.filter(device => device.Connected).length;
417
417
  const endpoint = hubStatus.agentEndpoint || '127.0.0.1:5197';
418
418
  const pairToken = hubStatus.pairToken || 'render-smoke-token';
@@ -447,7 +447,7 @@ function buildMonitorNode(devices, hubStatus, latestTaskBatch = null, recentTask
447
447
  RemoteFleetDevicesJson: JSON.stringify(devices),
448
448
  RemoteFleetLatestTaskBatchJson: latestTaskBatch ? JSON.stringify(latestTaskBatch) : '',
449
449
  RemoteFleetRecentTaskBatchesJson: JSON.stringify(recentTaskBatches),
450
- RemoteFleetLastError: ''
450
+ RemoteFleetLastError: String(lastError || '')
451
451
  }
452
452
  };
453
453
  }
@@ -463,7 +463,7 @@ function createRemoteFleetTemplateShell(document, focusDeviceId = '') {
463
463
  icon.setAttribute('class', 'template-card__icon template-card__icon--remote-fleet');
464
464
  const titleWrap = document.createElement('div');
465
465
  titleWrap.setAttribute('class', 'template-card__title-block');
466
- titleWrap.textContent = 'Remote Fleet Monitor';
466
+ titleWrap.textContent = 'Multi Desktop Monitor';
467
467
  header.appendChild(icon);
468
468
  header.appendChild(titleWrap);
469
469
  const bodyView = document.createElement('div');
@@ -703,6 +703,13 @@ try {
703
703
  assert.equal(bodyView.querySelector('[data-remote-fleet-search="true"]'), null);
704
704
  assert.equal(bodyView.querySelectorAll('select').length, 0);
705
705
  assert.ok(bodyView.querySelector('[data-remote-fleet-device-grid="true"]'));
706
+ const statusFooter = bodyView.querySelector('[data-remote-fleet-status-rail="true"]');
707
+ assert.ok(statusFooter);
708
+ const bodyChildOrder = Array.from(bodyView.children).map(child =>
709
+ Object.keys(child.dataset || {}).join(',') || child.tagName).join('|');
710
+ assert.ok(bodyChildOrder.endsWith('remoteFleetStatusRail'), bodyChildOrder);
711
+ assert.ok(statusFooter.style.cssText.includes('flex-direction: row'));
712
+ assert.equal(statusFooter.querySelectorAll('[data-remote-fleet-status-item]').length, 4);
706
713
  const initialDetailPanel = bodyView.querySelector('[data-remote-fleet-detail-panel="true"]');
707
714
  assert.equal(initialDetailPanel?.dataset.deviceId, focusedDevice.DeviceId);
708
715
  assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="pin-device"]').length, 1);
@@ -761,6 +768,10 @@ try {
761
768
  assert.ok(stopHostCall);
762
769
  assert.equal(stopHostCall.args[0], 'remote-fleet-render-smoke');
763
770
  assert.equal(stopHostCall.args[1], false);
771
+ hub.setHostTarget({
772
+ nodeId: 'remote-fleet-render-smoke',
773
+ enabled: false
774
+ });
764
775
 
765
776
  assert.ok(livePanel?.textContent.includes('RemoteFast 20 fps'), livePanel?.textContent || bodyView.textContent);
766
777
  assert.equal(bodyView.querySelector('code'), null);
@@ -800,12 +811,29 @@ try {
800
811
  const { nodeShell: emptyShell, bodyView: emptyBody } = createRemoteFleetTemplateShell(document);
801
812
  document.body.appendChild(emptyShell);
802
813
  manager.renderRemoteFleetMonitorForTest(emptyBody, buildMonitorNode([], hub.getStatus({ includeSecrets: true })));
803
- assert.equal(emptyBody.querySelectorAll('[data-remote-fleet-empty-screen="true"]').length, 6);
814
+ const emptyScreens = emptyBody.querySelectorAll('[data-remote-fleet-empty-screen="true"]');
815
+ assert.ok(emptyScreens.length >= 24, `expected empty monitor to fill space, got ${emptyScreens.length}`);
816
+ assert.notEqual(emptyScreens.length, 6);
817
+ assert.ok(Array.from(emptyBody.children).map(child =>
818
+ Object.keys(child.dataset || {}).join(',') || child.tagName).join('|').endsWith('remoteFleetStatusRail'));
804
819
  assert.equal(emptyBody.textContent.includes('No devices connected yet.'), false);
805
820
  assert.equal(emptyBody.textContent.includes('Select a screen'), false);
806
821
  assert.equal(emptyBody.textContent.includes('No screen'), false);
807
822
  assert.equal(emptyBody.textContent.includes('Endpoint 127.0.0.1'), false);
808
823
 
824
+ const { nodeShell: errorShell, bodyView: errorBody } = createRemoteFleetTemplateShell(document);
825
+ document.body.appendChild(errorShell);
826
+ manager.renderRemoteFleetMonitorForTest(errorBody, buildMonitorNode([], hub.getStatus({ includeSecrets: true }), null, [], 'RemoteHub is unavailable. Start LocalBridge and retry.'));
827
+ const errorFooter = errorBody.querySelector('[data-remote-fleet-status-rail="true"]');
828
+ const footerError = errorFooter?.querySelector('[data-remote-fleet-status-error="true"]');
829
+ assert.ok(errorFooter);
830
+ assert.ok(footerError);
831
+ assert.ok(Array.from(errorBody.children).map(child =>
832
+ Object.keys(child.dataset || {}).join(',') || child.tagName).join('|').endsWith('remoteFleetStatusRail'));
833
+ assert.equal(footerError.textContent.includes('RemoteHub is unavailable'), true);
834
+ assert.equal(Array.from(errorBody.children).some(child =>
835
+ child !== errorFooter && (child.textContent || '').includes('RemoteHub is unavailable')), false);
836
+
809
837
  const deviceBody = document.createElement('div');
810
838
  document.body.appendChild(deviceBody);
811
839
  manager.renderRemoteFleetDeviceForTest(deviceBody, buildDeviceNode(focusedDevice, hub.getStatus()));
@@ -815,6 +843,12 @@ try {
815
843
  assert.ok(deviceBody.textContent.includes('Task timed out waiting for the agent response.'));
816
844
  assert.ok(deviceBody.textContent.includes(focusedDevice.DeviceId));
817
845
 
846
+ nodeShell.remove();
847
+ emptyShell.remove();
848
+ errorShell.remove();
849
+ deviceBody.remove();
850
+ await wait(2200);
851
+
818
852
  console.log(`RemoteFleet render smoke OK (${SYNTHETIC_COUNT} synthetic devices, ${connectedCount} connected, ${aiCount} AI-ready)`);
819
853
  } finally {
820
854
  await hub.close();
@@ -29,6 +29,8 @@
29
29
  let _cssImageDisplayPumpScheduled = false;
30
30
  const CSS_VIDEO_PROXY_MAX_DEVICE_PIXEL_RATIO = 2;
31
31
  const VIDEO_PLAYBACK_INTENT_METADATA_KEY = 'VideoPlaybackIntent';
32
+ const REMOTE_FLEET_DISPLAY_NAME = 'Multi Desktop Monitor';
33
+ const REMOTE_FLEET_LEGACY_DISPLAY_NAME = 'Remote Fleet Monitor';
32
34
  const _cssVideoProxyStateByVideo = new WeakMap();
33
35
  // ▲▲▲ [Perf] ▲▲▲
34
36
 
@@ -11737,11 +11739,18 @@
11737
11739
  return container;
11738
11740
  }
11739
11741
 
11742
+ function getRemoteFleetDisplayTitle(value) {
11743
+ const title = String(value ?? '').trim();
11744
+ if (!title || title === REMOTE_FLEET_LEGACY_DISPLAY_NAME) {
11745
+ return REMOTE_FLEET_DISPLAY_NAME;
11746
+ }
11747
+ return title;
11748
+ }
11749
+
11740
11750
  function createRemoteFleetTemplateNodeElement(nodeModel) {
11741
11751
  const width = Number(nodeModel.width ?? nodeModel.Width ?? 960);
11742
11752
  const height = Number(nodeModel.height ?? nodeModel.Height ?? 620);
11743
- const title = String(nodeModel.prompt ?? nodeModel.Prompt ?? 'Remote Fleet Monitor').trim()
11744
- || 'Remote Fleet Monitor';
11753
+ const title = getRemoteFleetDisplayTitle(nodeModel.prompt ?? nodeModel.Prompt);
11745
11754
 
11746
11755
  const container = document.createElement('div');
11747
11756
  container.id = `node-${nodeModel.id}`;
@@ -12259,43 +12268,79 @@
12259
12268
  return item;
12260
12269
  }
12261
12270
 
12262
- function createRemoteFleetStatusRail(items) {
12271
+ function createRemoteFleetStatusRail(items, errorMessage = '') {
12263
12272
  const rail = document.createElement('aside');
12264
12273
  rail.dataset.remoteFleetStatusRail = 'true';
12265
12274
  rail.style.cssText = `
12266
12275
  flex: 0 0 auto;
12267
- align-self: flex-start;
12276
+ align-self: stretch;
12268
12277
  display: flex;
12269
- flex-direction: column;
12270
- gap: 3px;
12271
- min-width: 132px;
12272
- max-width: min(100%, 176px);
12273
- padding: 5px 6px;
12278
+ flex-direction: row;
12279
+ align-items: center;
12280
+ justify-content: flex-end;
12281
+ gap: 6px;
12282
+ width: 100%;
12283
+ min-width: 0;
12284
+ min-height: 28px;
12285
+ padding: 4px 6px;
12274
12286
  border-radius: 7px;
12275
12287
  border: 1px solid rgba(148, 163, 184, 0.22);
12276
12288
  background: rgba(255, 255, 255, 0.70);
12277
12289
  `;
12278
12290
 
12291
+ const normalizedError = String(errorMessage || '').trim();
12292
+ if (normalizedError) {
12293
+ const error = document.createElement('div');
12294
+ error.dataset.remoteFleetStatusError = 'true';
12295
+ error.textContent = normalizedError;
12296
+ error.title = normalizedError;
12297
+ error.style.cssText = `
12298
+ flex: 1 1 auto;
12299
+ min-width: 0;
12300
+ display: inline-flex;
12301
+ align-items: center;
12302
+ height: 22px;
12303
+ padding: 0 9px;
12304
+ border-radius: 999px;
12305
+ border: 1px solid rgba(148, 163, 184, 0.22);
12306
+ background: rgba(15, 23, 42, 0.05);
12307
+ color: #334155;
12308
+ font-size: 10px;
12309
+ font-weight: 850;
12310
+ line-height: 1;
12311
+ letter-spacing: 0;
12312
+ overflow: hidden;
12313
+ text-overflow: ellipsis;
12314
+ white-space: nowrap;
12315
+ `;
12316
+ rail.appendChild(error);
12317
+ }
12318
+
12279
12319
  (items || []).forEach(item => {
12280
12320
  const tone = String(item?.tone || 'default');
12281
12321
  const row = document.createElement('div');
12282
12322
  row.dataset.remoteFleetStatusItem = item?.key || '';
12283
12323
  row.style.cssText = `
12284
- display: grid;
12285
- grid-template-columns: 7px minmax(0, 1fr) auto;
12324
+ flex: 0 0 auto;
12325
+ display: inline-flex;
12286
12326
  align-items: center;
12287
- gap: 5px;
12288
- min-height: 16px;
12327
+ gap: 4px;
12328
+ height: 22px;
12289
12329
  min-width: 0;
12330
+ padding: 0 7px;
12331
+ border-radius: 999px;
12332
+ background: ${tone === 'online' ? 'rgba(16, 185, 129, 0.09)' : 'rgba(15, 23, 42, 0.04)'};
12333
+ border: 1px solid ${tone === 'online' ? 'rgba(16, 185, 129, 0.18)' : 'rgba(148, 163, 184, 0.18)'};
12290
12334
  `;
12291
12335
 
12292
12336
  const dot = document.createElement('span');
12293
12337
  dot.style.cssText = `
12294
- width: 7px;
12295
- height: 7px;
12338
+ flex: 0 0 auto;
12339
+ width: 6px;
12340
+ height: 6px;
12296
12341
  border-radius: 999px;
12297
12342
  background: ${tone === 'online' ? '#10b981' : tone === 'warn' ? '#f59e0b' : '#94a3b8'};
12298
- box-shadow: ${tone === 'online' ? '0 0 0 3px rgba(16, 185, 129, 0.12)' : 'none'};
12343
+ box-shadow: ${tone === 'online' ? '0 0 0 2px rgba(16, 185, 129, 0.11)' : 'none'};
12299
12344
  `;
12300
12345
 
12301
12346
  const labelEl = document.createElement('span');
@@ -12321,7 +12366,7 @@
12321
12366
  font-weight: 950;
12322
12367
  line-height: 1;
12323
12368
  letter-spacing: 0;
12324
- max-width: 76px;
12369
+ max-width: 86px;
12325
12370
  overflow: hidden;
12326
12371
  text-overflow: ellipsis;
12327
12372
  white-space: nowrap;
@@ -12416,7 +12461,17 @@
12416
12461
  return titleActions;
12417
12462
  }
12418
12463
 
12419
- function createRemoteFleetEmptyScreens() {
12464
+ function getRemoteFleetEmptyScreenCount(nodeModel) {
12465
+ const width = Number(nodeModel?.width ?? nodeModel?.Width ?? 960);
12466
+ const height = Number(nodeModel?.height ?? nodeModel?.Height ?? 620);
12467
+ const usableWidth = Number.isFinite(width) ? Math.max(360, width - 44) : 916;
12468
+ const usableHeight = Number.isFinite(height) ? Math.max(260, height - 128) : 492;
12469
+ const columns = Math.max(3, Math.floor(usableWidth / 142));
12470
+ const rows = Math.max(3, Math.ceil(usableHeight / 88));
12471
+ return Math.max(12, Math.min(80, columns * rows));
12472
+ }
12473
+
12474
+ function createRemoteFleetEmptyScreens(nodeModel) {
12420
12475
  const shell = document.createElement('section');
12421
12476
  shell.dataset.remoteFleetEmptyScreens = 'true';
12422
12477
  shell.style.cssText = `
@@ -12424,18 +12479,19 @@
12424
12479
  min-height: 0;
12425
12480
  overflow: hidden;
12426
12481
  display: grid;
12427
- grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
12482
+ grid-template-columns: repeat(auto-fill, minmax(132px, 1fr));
12428
12483
  align-content: start;
12429
- gap: 10px;
12484
+ gap: 8px;
12430
12485
  padding: 2px 4px 6px 0;
12431
12486
  `;
12432
12487
 
12433
- for (let index = 0; index < 6; index += 1) {
12488
+ const screenCount = getRemoteFleetEmptyScreenCount(nodeModel);
12489
+ for (let index = 0; index < screenCount; index += 1) {
12434
12490
  const screen = document.createElement('div');
12435
12491
  screen.dataset.remoteFleetEmptyScreen = 'true';
12436
12492
  screen.style.cssText = `
12437
12493
  aspect-ratio: 16 / 9;
12438
- min-height: 96px;
12494
+ min-height: 72px;
12439
12495
  border-radius: 8px;
12440
12496
  border: 1px solid rgba(203, 213, 225, 0.72);
12441
12497
  background: #ffffff;
@@ -13463,7 +13519,7 @@
13463
13519
  value: String(aiCapableCount),
13464
13520
  tone: aiCapableCount > 0 ? 'online' : 'default'
13465
13521
  }
13466
- ]);
13522
+ ], lastError);
13467
13523
 
13468
13524
  const filterRow = document.createElement('div');
13469
13525
  filterRow.style.cssText = `
@@ -13945,23 +14001,6 @@
13945
14001
  bodyView.appendChild(livePanel);
13946
14002
  }
13947
14003
 
13948
- if (lastError.trim()) {
13949
- const errorEl = document.createElement('div');
13950
- errorEl.textContent = lastError;
13951
- errorEl.style.cssText = `
13952
- flex: 0 0 auto;
13953
- padding: 8px 10px;
13954
- border-radius: 7px;
13955
- background: rgba(248, 113, 113, 0.12);
13956
- color: #991b1b;
13957
- font-size: 12px;
13958
- line-height: 1.35;
13959
- font-weight: 700;
13960
- overflow-wrap: break-word;
13961
- `;
13962
- bodyView.appendChild(errorEl);
13963
- }
13964
-
13965
14004
  const createDevicePreview = (device, mode = 'tile') => {
13966
14005
  const name = getRemoteFleetDeviceName(device);
13967
14006
  const connectedDevice = isRemoteFleetDeviceConnected(device);
@@ -14246,7 +14285,7 @@
14246
14285
  overflow-y: auto;
14247
14286
  overflow-x: hidden;
14248
14287
  display: grid;
14249
- grid-template-columns: ${densityState === 'dense' ? 'repeat(auto-fill, minmax(118px, 1fr))' : 'repeat(auto-fill, minmax(148px, 1fr))'};
14288
+ grid-template-columns: ${densityState === 'dense' ? 'repeat(auto-fill, minmax(104px, 1fr))' : 'repeat(auto-fill, minmax(132px, 1fr))'};
14250
14289
  align-content: start;
14251
14290
  gap: 8px;
14252
14291
  padding-right: 4px;
@@ -14378,7 +14417,7 @@
14378
14417
  if (devices.length === 0) {
14379
14418
  monitorWorkspace.style.display = 'flex';
14380
14419
  monitorWorkspace.style.flexDirection = 'column';
14381
- monitorWorkspace.appendChild(createRemoteFleetEmptyScreens());
14420
+ monitorWorkspace.appendChild(createRemoteFleetEmptyScreens(nodeModel));
14382
14421
  } else {
14383
14422
  monitorWorkspace.appendChild(grid);
14384
14423
  monitorWorkspace.appendChild(createSelectedDevicePanel(selectedDevice));
@@ -18343,7 +18382,7 @@
18343
18382
 
18344
18383
  const titleEl = card.querySelector('.template-card__title');
18345
18384
  if (titleEl) {
18346
- const nextTitle = String(prompt || 'Remote Fleet Monitor').trim() || 'Remote Fleet Monitor';
18385
+ const nextTitle = getRemoteFleetDisplayTitle(prompt);
18347
18386
  if (titleEl.textContent !== nextTitle) {
18348
18387
  titleEl.textContent = nextTitle;
18349
18388
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-3BNGeO97GJzZPWJKcxft//YyUghoJWfEleoPXAWQph8=",
4
+ "hash": "sha256-k0iqwLZMNziqsO0cna4ZkRaImvlJnFEHmg2NH2KplKs=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -127,12 +127,12 @@
127
127
  "MindExecution.Kernel.z56elxihok.dll": "MindExecution.Kernel.dll",
128
128
  "MindExecution.Plugins.Admin.p5cs4ap87v.dll": "MindExecution.Plugins.Admin.dll",
129
129
  "MindExecution.Plugins.Business.s35og5uz44.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.faidxooqle.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Concept.jb7kys86wq.dll": "MindExecution.Plugins.Concept.dll",
131
131
  "MindExecution.Plugins.Directory.y74f55e8x3.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.xfcd3pwd7p.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.78s7dilkza.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.hse89ibcyq.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.p1v0ug5h4f.dll": "MindExecution.Web.dll",
132
+ "MindExecution.Plugins.PlanMaster.1obf2n1hl7.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.qw5tai5je1.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.2z6d6fd998.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.9nijd135cw.dll": "MindExecution.Web.dll",
136
136
  "dotnet.js": "dotnet.js",
137
137
  "dotnet.native.qc8g39g30v.js": "dotnet.native.js",
138
138
  "dotnet.native.boem75ye5i.wasm": "dotnet.native.wasm",
@@ -280,16 +280,16 @@
280
280
  "netstandard.yvr3prsx0x.dll": "sha256-EksNn8Luo4bOWqJ6X7dIe9qG9oOqwOVzjH2xYyMNi+E=",
281
281
  "MindExecution.Core.6rfnfdndxq.dll": "sha256-giL4rreoKsQoQ5gkLusNx7oL3w1l2UH52TYY1KBoIfQ=",
282
282
  "MindExecution.Kernel.z56elxihok.dll": "sha256-STATJelRGcW9SDGgsw6YmQi6tkQje52dy4lyT3QU4qs=",
283
- "MindExecution.Plugins.Concept.faidxooqle.dll": "sha256-177f2QdWAeNbJvUOInKfZ/A6AGWzRqbge3x6ePcBDpI=",
284
- "MindExecution.Plugins.PlanMaster.xfcd3pwd7p.dll": "sha256-PaeGgCgIzD09cq0h3SywgwHpIOkmyZ9bV3ArDCOWbpo=",
285
- "MindExecution.Shared.hse89ibcyq.dll": "sha256-HyIJGWol5LmyLiefR4XpyKXtgpidf6Vr4pN/0hPskHA=",
286
- "MindExecution.Web.p1v0ug5h4f.dll": "sha256-07TGezQJ2CbX3lpW2Qou4T/rJi4GFWmBv545YHiXfVk="
283
+ "MindExecution.Plugins.Concept.jb7kys86wq.dll": "sha256-D7QlSmcoOaxtP9JEvAPlsJKObz56kmlgXKLZ+Jroa7Y=",
284
+ "MindExecution.Plugins.PlanMaster.1obf2n1hl7.dll": "sha256-0TYlX0adXCQWn+HTgjv0rrn5T5/TThIl7JLkhaRliRM=",
285
+ "MindExecution.Shared.2z6d6fd998.dll": "sha256-jtZ/ZCA2BLYFna83H2CZO0vKybYTnJKYttby/VcP66g=",
286
+ "MindExecution.Web.9nijd135cw.dll": "sha256-29k55hju6eiouNWKYR3UZ/EwgTKKByFUbBe7ZLKSMdk="
287
287
  },
288
288
  "lazyAssembly": {
289
289
  "MindExecution.Plugins.Admin.p5cs4ap87v.dll": "sha256-jahiJxaiE8hwMyRcg6rZGo4WBhBGFyAHYhOqlKjawWg=",
290
290
  "MindExecution.Plugins.Business.s35og5uz44.dll": "sha256-KOyk9eC6E/Gyfz2uWucHQmAayMQbShhLTqEymZFleh4=",
291
291
  "MindExecution.Plugins.Directory.y74f55e8x3.dll": "sha256-4gMuhIPLiX31U+jwhDT83rSPqZINONadmW+cvujfq1g=",
292
- "MindExecution.Plugins.YouTube.78s7dilkza.dll": "sha256-p4/WQZuUrLU9A/tUFh4J9I5vw15MjWZ3Tvs0v1oPbhY="
292
+ "MindExecution.Plugins.YouTube.qw5tai5je1.dll": "sha256-KqXA6wxRyvgZXWtZmDf4aptpBt37K0TtiH0LttCAKmI="
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 = '20260613-remote-template-card-v497';
561
+ const scriptVersion = '20260613-multi-desktop-monitor-v499';
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": "rlBXfYfF",
2
+ "version": "tG2C/jje",
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-wFyeN3Nc8gLXo/cHEuXYwFvgBSy2cPUmdFsMNcTzSNg=",
89
+ "hash": "sha256-/3RTpwOFzdkfkEfmvqSHMfcR/+BZVFrwffhPrpdJdb4=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -426,28 +426,28 @@
426
426
  "url": "_framework/MindExecution.Plugins.Business.s35og5uz44.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-177f2QdWAeNbJvUOInKfZ/A6AGWzRqbge3x6ePcBDpI=",
430
- "url": "_framework/MindExecution.Plugins.Concept.faidxooqle.dll"
429
+ "hash": "sha256-D7QlSmcoOaxtP9JEvAPlsJKObz56kmlgXKLZ+Jroa7Y=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.jb7kys86wq.dll"
431
431
  },
432
432
  {
433
433
  "hash": "sha256-4gMuhIPLiX31U+jwhDT83rSPqZINONadmW+cvujfq1g=",
434
434
  "url": "_framework/MindExecution.Plugins.Directory.y74f55e8x3.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-PaeGgCgIzD09cq0h3SywgwHpIOkmyZ9bV3ArDCOWbpo=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.xfcd3pwd7p.dll"
437
+ "hash": "sha256-0TYlX0adXCQWn+HTgjv0rrn5T5/TThIl7JLkhaRliRM=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.1obf2n1hl7.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-p4/WQZuUrLU9A/tUFh4J9I5vw15MjWZ3Tvs0v1oPbhY=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.78s7dilkza.dll"
441
+ "hash": "sha256-KqXA6wxRyvgZXWtZmDf4aptpBt37K0TtiH0LttCAKmI=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.qw5tai5je1.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-HyIJGWol5LmyLiefR4XpyKXtgpidf6Vr4pN/0hPskHA=",
446
- "url": "_framework/MindExecution.Shared.hse89ibcyq.dll"
445
+ "hash": "sha256-jtZ/ZCA2BLYFna83H2CZO0vKybYTnJKYttby/VcP66g=",
446
+ "url": "_framework/MindExecution.Shared.2z6d6fd998.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-07TGezQJ2CbX3lpW2Qou4T/rJi4GFWmBv545YHiXfVk=",
450
- "url": "_framework/MindExecution.Web.p1v0ug5h4f.dll"
449
+ "hash": "sha256-29k55hju6eiouNWKYR3UZ/EwgTKKByFUbBe7ZLKSMdk=",
450
+ "url": "_framework/MindExecution.Web.9nijd135cw.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-c2H0026f7tTv+gbbQCZt1/VMd200vEuF95yAiIZ1ydU=",
773
+ "hash": "sha256-ppYCYMNULSQ3/L8P0hM5zTUHdhy8QpSuQqWy9yYzkGo=",
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-GqwKG61iKXWuVja2WDiaUhRcpii3CSqQbYVobOtWaIQ=",
837
+ "hash": "sha256-O/ZlL+rS51HA/+gIrVJrCdCRZH7WHsv7/YutBtsU7hY=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: rlBXfYfF */
1
+ /* Manifest version: tG2C/jje */
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