@mindexec/cli 0.2.146 → 0.2.148

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.146",
3
+ "version": "0.2.148",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -434,6 +434,7 @@ async function loadCss3DManager() {
434
434
  const runtimeTrace = [];
435
435
  const webSocketConnections = [];
436
436
  const webSocketSends = [];
437
+ const textOverlayInvalidations = [];
437
438
  class SmokeURL extends URL {}
438
439
  SmokeURL.createObjectURL = blob => {
439
440
  objectUrlCalls.push(blob);
@@ -536,6 +537,15 @@ async function loadCss3DManager() {
536
537
  runtimeTrace.push({ type, ...data });
537
538
  }
538
539
  },
540
+ MindMapTextOverlayV2: {
541
+ invalidateReadonlySource(module, nodeId, reason) {
542
+ textOverlayInvalidations.push({ module, nodeId, reason });
543
+ return true;
544
+ },
545
+ invalidateNode(module, nodeId, reason) {
546
+ textOverlayInvalidations.push({ module, nodeId, reason, fallback: true });
547
+ }
548
+ },
539
549
  Promise
540
550
  };
541
551
  context.window = context;
@@ -552,7 +562,8 @@ async function loadCss3DManager() {
552
562
  fetchCalls,
553
563
  runtimeTrace,
554
564
  webSocketConnections,
555
- webSocketSends
565
+ webSocketSends,
566
+ textOverlayInvalidations
556
567
  }
557
568
  };
558
569
  }
@@ -891,6 +902,9 @@ try {
891
902
  document.body.appendChild(moduleRef._textOverlayV2State.layer);
892
903
 
893
904
  manager.renderRemoteFleetMonitorForTest(bodyView, monitorNode);
905
+ const { nodeShell: mirrorShell, bodyView: mirrorBodyView } = createRemoteFleetTemplateShell(document, focusedDevice.DeviceId);
906
+ document.body.appendChild(mirrorShell);
907
+ mirrorBodyView.dataset.remoteFleetDensity = 'cards';
894
908
 
895
909
  let cards = bodyView.querySelectorAll('article[data-device-id]');
896
910
  assert.equal(cards.length, connectedCount);
@@ -923,15 +937,34 @@ try {
923
937
  assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="task-device"]').length, 0);
924
938
  assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="thumbnail-device"]').length, 0);
925
939
  assert.equal(bodyView.querySelectorAll('[data-remote-fleet-frame-badge="true"]').length, 0);
926
- assert.ok(cards[0]?.querySelector('[data-remote-fleet-device-preview="tile"]'));
940
+ const firstPreview = cards[0]?.querySelector('[data-remote-fleet-device-preview="tile"]');
941
+ assert.ok(firstPreview);
942
+ assert.match(cards[0]?.style.cssText || '', /border-radius:\s*0/);
943
+ assert.match(firstPreview.style.cssText, /border-radius:\s*0/);
944
+ assert.match(cards[0]?.title || '', /Status:\s*(Connected|Offline)/);
945
+ assert.match(cards[0]?.title || '', /Seen:/);
946
+ assert.match(cards[0]?.title || '', /Uptime:/);
927
947
  assert.equal(/\b(Seen|Uptime|Mem|Load)\b/.test(cards[0]?.textContent || ''), false);
928
948
  assert.match(deviceGrid.style.cssText, /minmax\(132px,\s*1fr\)/);
929
949
  sizeControls.querySelector('[data-remote-fleet-action="monitor-size-up"]').dispatchEvent({ type: 'click' });
930
950
  assert.equal(bodyView.dataset.remoteFleetDensity, 'large');
931
951
  assert.match(bodyView.querySelector('[data-remote-fleet-device-grid="true"]')?.style.cssText || '', /minmax\(168px,\s*1fr\)/);
952
+ assert.equal(mirrorBodyView.dataset.remoteFleetDensity, 'large');
953
+ assert.match(mirrorBodyView.querySelector('[data-remote-fleet-device-grid="true"]')?.style.cssText || '', /minmax\(168px,\s*1fr\)/);
954
+ assert.ok(diagnostics.textOverlayInvalidations.some(entry =>
955
+ entry.nodeId === 'remote-fleet-render-smoke'
956
+ && entry.reason === 'remote-monitor-size'));
957
+ assert.ok(diagnostics.runtimeTrace.some(entry =>
958
+ entry.type === 'remote.monitor.sizeChanged'
959
+ && entry.nodeId === 'remote-fleet-render-smoke'
960
+ && entry.density === 'large'
961
+ && entry.overlayInvalidated === true));
932
962
  bodyView.querySelector('[data-remote-fleet-action="monitor-size-down"]').dispatchEvent({ type: 'click' });
933
963
  assert.equal(bodyView.dataset.remoteFleetDensity, 'cards');
934
964
  assert.match(bodyView.querySelector('[data-remote-fleet-device-grid="true"]')?.style.cssText || '', /minmax\(132px,\s*1fr\)/);
965
+ assert.equal(mirrorBodyView.dataset.remoteFleetDensity, 'cards');
966
+ assert.match(mirrorBodyView.querySelector('[data-remote-fleet-device-grid="true"]')?.style.cssText || '', /minmax\(132px,\s*1fr\)/);
967
+ mirrorShell.remove();
935
968
  cards = bodyView.querySelectorAll('article[data-device-id]');
936
969
  const patchTarget = devices.find(device =>
937
970
  device.Connected === true
@@ -1274,6 +1307,7 @@ try {
1274
1307
  const emptyScreens = emptyBody.querySelectorAll('[data-remote-fleet-empty-screen="true"]');
1275
1308
  assert.ok(emptyScreens.length >= 24, `expected empty monitor to fill space, got ${emptyScreens.length}`);
1276
1309
  assert.notEqual(emptyScreens.length, 6);
1310
+ assert.match(emptyScreens[0].style.cssText, /border-radius:\s*0/);
1277
1311
  assert.ok(Array.from(emptyBody.children).map(child =>
1278
1312
  Object.keys(child.dataset || {}).join(',') || child.tagName).join('|').endsWith('remoteFleetStatusRail'));
1279
1313
  assert.equal(emptyBody.textContent.includes('No devices connected yet.'), false);
@@ -1281,6 +1315,24 @@ try {
1281
1315
  assert.equal(emptyBody.textContent.includes('No screen'), false);
1282
1316
  assert.equal(emptyBody.textContent.includes('Endpoint 127.0.0.1'), false);
1283
1317
 
1318
+ const oneDevice = devices.find(device => device.Connected === true);
1319
+ assert.ok(oneDevice);
1320
+ const { nodeShell: oneShell, bodyView: oneBody } = createRemoteFleetTemplateShell(document);
1321
+ document.body.appendChild(oneShell);
1322
+ manager.renderRemoteFleetMonitorForTest(oneBody, buildMonitorNode([oneDevice], hub.getStatus({ includeSecrets: true })));
1323
+ const oneCards = oneBody.querySelectorAll('article[data-device-id]');
1324
+ assert.equal(oneCards.length, 1);
1325
+ const onePreview = oneCards[0]?.querySelector('[data-remote-fleet-device-preview="tile"]');
1326
+ assert.ok(onePreview);
1327
+ assert.match(oneCards[0]?.style.cssText || '', /border-radius:\s*0/);
1328
+ assert.match(onePreview.style.cssText, /border-radius:\s*0/);
1329
+ assert.match(oneCards[0]?.title || '', /Status:\s*Connected/);
1330
+ assert.match(oneCards[0]?.title || '', /Seen:/);
1331
+ assert.match(oneCards[0]?.title || '', /Uptime:/);
1332
+ const oneFillers = oneBody.querySelectorAll('[data-remote-fleet-empty-screen="true"]');
1333
+ assert.ok(oneFillers.length > 0, 'single connected monitor wall should keep blank screen placeholders');
1334
+ assert.match(oneFillers[0].style.cssText, /border-radius:\s*0/);
1335
+
1284
1336
  const { nodeShell: errorShell, bodyView: errorBody } = createRemoteFleetTemplateShell(document);
1285
1337
  document.body.appendChild(errorShell);
1286
1338
  manager.renderRemoteFleetMonitorForTest(errorBody, buildMonitorNode([], hub.getStatus({ includeSecrets: true }), null, [], 'RemoteHub is unavailable. Start LocalBridge and retry.'));
@@ -1305,6 +1357,7 @@ try {
1305
1357
 
1306
1358
  nodeShell.remove();
1307
1359
  emptyShell.remove();
1360
+ oneShell.remove();
1308
1361
  errorShell.remove();
1309
1362
  deviceBody.remove();
1310
1363
  await wait(2200);
@@ -13374,6 +13374,33 @@
13374
13374
  return Math.max(12, Math.min(80, columns * rows));
13375
13375
  }
13376
13376
 
13377
+ function createRemoteFleetEmptyScreenElement(metrics) {
13378
+ const screen = document.createElement('div');
13379
+ screen.dataset.remoteFleetEmptyScreen = 'true';
13380
+ screen.style.cssText = `
13381
+ width: 100%;
13382
+ height: auto;
13383
+ aspect-ratio: 16 / 9;
13384
+ min-height: ${metrics.emptyMinHeight}px;
13385
+ box-sizing: border-box;
13386
+ border-radius: 0;
13387
+ border: 1px solid rgba(203, 213, 225, 0.66);
13388
+ background: #ffffff;
13389
+ box-shadow: none;
13390
+ `;
13391
+ return screen;
13392
+ }
13393
+
13394
+ function appendRemoteFleetEmptyScreens(container, nodeModel, sizeState = 'cards', occupiedScreens = 0) {
13395
+ const metrics = getRemoteFleetTileMetrics(sizeState);
13396
+ const targetScreenCount = getRemoteFleetEmptyScreenCount(nodeModel, sizeState);
13397
+ const screenCount = Math.max(0, targetScreenCount - Math.max(0, Number(occupiedScreens) || 0));
13398
+ for (let index = 0; index < screenCount; index += 1) {
13399
+ container.appendChild(createRemoteFleetEmptyScreenElement(metrics));
13400
+ }
13401
+ return screenCount;
13402
+ }
13403
+
13377
13404
  function createRemoteFleetEmptyScreens(nodeModel, sizeState = 'cards') {
13378
13405
  const metrics = getRemoteFleetTileMetrics(sizeState);
13379
13406
  const shell = document.createElement('section');
@@ -13399,23 +13426,7 @@
13399
13426
  padding: 2px 4px 6px 4px;
13400
13427
  `;
13401
13428
 
13402
- const screenCount = getRemoteFleetEmptyScreenCount(nodeModel, sizeState);
13403
- for (let index = 0; index < screenCount; index += 1) {
13404
- const screen = document.createElement('div');
13405
- screen.dataset.remoteFleetEmptyScreen = 'true';
13406
- screen.style.cssText = `
13407
- width: 100%;
13408
- height: auto;
13409
- aspect-ratio: 16 / 9;
13410
- min-height: ${metrics.emptyMinHeight}px;
13411
- box-sizing: border-box;
13412
- border-radius: 8px;
13413
- border: 1px solid rgba(203, 213, 225, 0.66);
13414
- background: #ffffff;
13415
- box-shadow: none;
13416
- `;
13417
- shell.appendChild(screen);
13418
- }
13429
+ appendRemoteFleetEmptyScreens(shell, nodeModel, sizeState, 0);
13419
13430
 
13420
13431
  return shell;
13421
13432
  }
@@ -13887,6 +13898,60 @@
13887
13898
  ).trim();
13888
13899
  }
13889
13900
 
13901
+ function syncRemoteFleetMonitorSizeSurfaces(nodeId, sizeState, sourceBodyView, nodeModel) {
13902
+ const id = String(nodeId || '').trim();
13903
+ const density = normalizeRemoteFleetMonitorSize(sizeState);
13904
+ if (!id || !sourceBodyView) {
13905
+ return 0;
13906
+ }
13907
+
13908
+ const escapedId = cssEscapeValue(id);
13909
+ const bodies = new Set([
13910
+ ...Array.from(document.querySelectorAll(`.template-card__remote-fleet-body[data-node-id="${escapedId}"]`)),
13911
+ ...Array.from(document.querySelectorAll(`.template-card__remote-fleet-body[data-remote-fleet-monitor-node-id="${escapedId}"]`))
13912
+ ]);
13913
+
13914
+ let synced = 0;
13915
+ bodies.forEach(body => {
13916
+ if (!body || body === sourceBodyView) {
13917
+ return;
13918
+ }
13919
+
13920
+ body.dataset.remoteFleetDensity = density;
13921
+ renderRemoteFleetMonitor(body, nodeModel);
13922
+ synced += 1;
13923
+ });
13924
+
13925
+ return synced;
13926
+ }
13927
+
13928
+ function invalidateRemoteFleetMonitorProjection(nodeId, sizeState, reason = 'size') {
13929
+ const id = String(nodeId || '').trim();
13930
+ if (!_module || !id) {
13931
+ return false;
13932
+ }
13933
+
13934
+ const overlay = window.MindMapTextOverlayV2;
13935
+ let invalidated = false;
13936
+ if (typeof overlay?.invalidateReadonlySource === 'function') {
13937
+ invalidated = overlay.invalidateReadonlySource(_module, id, `remote-monitor-${reason}`) === true;
13938
+ } else if (typeof overlay?.invalidateNode === 'function') {
13939
+ overlay.invalidateNode(_module, id, 'layout');
13940
+ invalidated = true;
13941
+ }
13942
+
13943
+ _module._forceUpdateFrames = Math.max(Number(_module._forceUpdateFrames || 0), 2);
13944
+ _module._css3dVisualChangedThisFrame = true;
13945
+ _module._css3dVisualChangedSinceLastRender = true;
13946
+ wakeRemoteFleetModuleAnimation(_module, `remote-monitor-${reason}`);
13947
+ window.RuntimeTrace?.emit?.('remote.monitor.sizeChanged', {
13948
+ nodeId: id,
13949
+ density: normalizeRemoteFleetMonitorSize(sizeState),
13950
+ overlayInvalidated: invalidated
13951
+ });
13952
+ return invalidated;
13953
+ }
13954
+
13890
13955
  function getRemoteFleetBodyFromPreview(preview) {
13891
13956
  if (!preview) {
13892
13957
  return null;
@@ -14320,6 +14385,54 @@
14320
14385
  || 'device');
14321
14386
  }
14322
14387
 
14388
+ function getRemoteFleetDeviceTooltip(device) {
14389
+ const name = getRemoteFleetDeviceName(device);
14390
+ const deviceId = getRemoteFleetDeviceId(device);
14391
+ const hostname = String(getRemoteFleetDeviceField(device, 'hostname', 'Hostname', '') || '').trim();
14392
+ const connected = isRemoteFleetDeviceConnected(device);
14393
+ const platform = [
14394
+ getRemoteFleetDeviceField(device, 'platform', 'Platform', ''),
14395
+ getRemoteFleetDeviceField(device, 'release', 'Release', ''),
14396
+ getRemoteFleetDeviceField(device, 'arch', 'Arch', '')
14397
+ ].map(value => String(value || '').trim()).filter(Boolean).join(' ');
14398
+ const agentVersion = String(getRemoteFleetDeviceField(device, 'agentVersion', 'AgentVersion', '') || '').trim();
14399
+ const remoteAddress = String(getRemoteFleetDeviceField(device, 'remoteAddress', 'RemoteAddress', '') || '').trim();
14400
+ const remotePort = Number(getRemoteFleetDeviceField(device, 'remotePort', 'RemotePort', 0)) || 0;
14401
+ const remoteEndpoint = remoteAddress ? `${remoteAddress}${remotePort > 0 ? `:${remotePort}` : ''}` : '';
14402
+ const liveSeq = getRemoteFleetFrameSeq(device, 'live');
14403
+ const thumbnailSeq = getRemoteFleetFrameSeq(device, 'thumbnail');
14404
+ const liveReceivedAt = String(getRemoteFleetDeviceField(device, 'liveFrameReceivedAt', 'LiveFrameReceivedAt', '') || '').trim();
14405
+ const thumbnailReceivedAt = String(getRemoteFleetDeviceField(device, 'thumbnailReceivedAt', 'ThumbnailReceivedAt', '') || '').trim();
14406
+ const latestTaskStatus = String(getRemoteFleetDeviceField(device, 'latestTaskStatus', 'LatestTaskStatus', '') || '').trim();
14407
+ const latestTaskTitle = String(getRemoteFleetDeviceField(device, 'latestTaskTitle', 'LatestTaskTitle', '') || '').trim();
14408
+ const latestTaskError = String(getRemoteFleetDeviceField(device, 'latestTaskError', 'LatestTaskError', '') || '').trim();
14409
+ const capabilityText = [
14410
+ isRemoteFleetLiveCapable(device) ? 'live' : '',
14411
+ isRemoteFleetThumbnailCapable(device) ? 'thumbnail' : '',
14412
+ isRemoteFleetDeviceTaskCapable(device) ? 'task' : '',
14413
+ isRemoteFleetDeviceAiCapable(device) ? 'ai' : ''
14414
+ ].filter(Boolean).join(', ');
14415
+
14416
+ return [
14417
+ name,
14418
+ deviceId ? `ID: ${deviceId}` : '',
14419
+ hostname && hostname !== name ? `Host: ${hostname}` : '',
14420
+ `Status: ${connected ? 'Connected' : 'Offline'}`,
14421
+ platform ? `OS: ${platform}` : '',
14422
+ agentVersion ? `Agent: ${agentVersion}` : '',
14423
+ remoteEndpoint ? `Remote: ${remoteEndpoint}` : '',
14424
+ `Seen: ${formatRemoteFleetAge(getRemoteFleetDeviceField(device, 'lastSeenAt', 'LastSeenAt', ''))}`,
14425
+ `Uptime: ${formatRemoteFleetDuration(getRemoteFleetDeviceField(device, 'uptimeSec', 'UptimeSec', Number.NaN))}`,
14426
+ `Memory: ${formatRemoteFleetPercent(getRemoteFleetDeviceField(device, 'usedMemRatio', 'UsedMemRatio', Number.NaN))}`,
14427
+ `Load: ${formatRemoteFleetNumber(getRemoteFleetDeviceField(device, 'load1', 'Load1', Number.NaN), 2)}`,
14428
+ liveSeq > 0 ? `Live frame: #${liveSeq}${liveReceivedAt ? ` (${formatRemoteFleetAge(liveReceivedAt)})` : ''}` : '',
14429
+ thumbnailSeq > 0 ? `Thumbnail: #${thumbnailSeq}${thumbnailReceivedAt ? ` (${formatRemoteFleetAge(thumbnailReceivedAt)})` : ''}` : '',
14430
+ capabilityText ? `Capabilities: ${capabilityText}` : '',
14431
+ latestTaskStatus ? `Task: ${latestTaskStatus}${latestTaskTitle ? ` - ${latestTaskTitle}` : ''}` : '',
14432
+ latestTaskError ? `Task error: ${formatRemoteFleetTaskError(latestTaskError)}` : ''
14433
+ ].filter(Boolean).join('\n');
14434
+ }
14435
+
14323
14436
  function isRemoteFleetDeviceConnected(device) {
14324
14437
  return getRemoteFleetDeviceField(device, 'connected', 'Connected', false) === true;
14325
14438
  }
@@ -17269,12 +17382,13 @@
17269
17382
  preview.dataset.remoteFleetFrameSeq = String(hasLiveFrame
17270
17383
  ? getRemoteFleetDeviceField(device, 'liveFrameSeq', 'LiveFrameSeq', 0)
17271
17384
  : getRemoteFleetDeviceField(device, 'thumbnailFrameSeq', 'ThumbnailFrameSeq', 0));
17385
+ preview.title = getRemoteFleetDeviceTooltip(device);
17272
17386
  preview.style.cssText = `
17273
17387
  position: relative;
17274
17388
  width: 100%;
17275
17389
  aspect-ratio: 16 / 9;
17276
17390
  overflow: hidden;
17277
- border-radius: ${isDetail ? '8px' : '6px'};
17391
+ border-radius: 0;
17278
17392
  background: ${(hasLiveFrame || hasThumbnail) ? 'linear-gradient(135deg, #0f172a 0%, #1e293b 100%)' : '#ffffff'};
17279
17393
  border: 1px solid rgba(148, 163, 184, ${isDetail ? '0.34' : '0.24'});
17280
17394
  box-shadow: none;
@@ -17435,7 +17549,7 @@
17435
17549
  card.setAttribute('aria-pressed', isSelected ? 'true' : 'false');
17436
17550
  card.setAttribute('aria-label', `Open remote control for ${name}`);
17437
17551
  card.tabIndex = 0;
17438
- card.title = name;
17552
+ card.title = getRemoteFleetDeviceTooltip(device);
17439
17553
  card.style.cssText = `
17440
17554
  position: relative;
17441
17555
  display: flex;
@@ -17448,7 +17562,7 @@
17448
17562
  box-sizing: border-box;
17449
17563
  overflow: hidden;
17450
17564
  padding: 0;
17451
- border-radius: 8px;
17565
+ border-radius: 0;
17452
17566
  background: transparent;
17453
17567
  border: 0;
17454
17568
  box-shadow: none;
@@ -17466,6 +17580,8 @@
17466
17580
  grid.appendChild(card);
17467
17581
  });
17468
17582
 
17583
+ appendRemoteFleetEmptyScreens(grid, nodeModel, densityState, devices.length);
17584
+
17469
17585
  const noMatch = document.createElement('div');
17470
17586
  noMatch.dataset.remoteFleetNoMatch = 'true';
17471
17587
  noMatch.textContent = 'No matching devices.';
@@ -18043,8 +18159,11 @@
18043
18159
  return;
18044
18160
  }
18045
18161
 
18046
- bodyView.dataset.remoteFleetDensity = REMOTE_FLEET_MONITOR_SIZE_LEVELS[nextIndex];
18162
+ const nextDensity = REMOTE_FLEET_MONITOR_SIZE_LEVELS[nextIndex];
18163
+ bodyView.dataset.remoteFleetDensity = nextDensity;
18164
+ syncRemoteFleetMonitorSizeSurfaces(nodeId, nextDensity, bodyView, nodeModel);
18047
18165
  renderRemoteFleetMonitor(bodyView, nodeModel);
18166
+ invalidateRemoteFleetMonitorProjection(nodeId, nextDensity, 'size');
18048
18167
  };
18049
18168
 
18050
18169
  bodyView.querySelectorAll('[data-remote-fleet-action]').forEach(button => {
@@ -3706,6 +3706,44 @@
3706
3706
  module._lastOverlayKey = '';
3707
3707
  }
3708
3708
 
3709
+ function invalidateReadonlySource(module, nodeId = '', reason = 'source') {
3710
+ const state = ensureState(module);
3711
+ if (!state) {
3712
+ return false;
3713
+ }
3714
+
3715
+ const id = normalizeId(nodeId);
3716
+ if (id) {
3717
+ state.dirtyNodes.add(id);
3718
+ const card = state.cards.get(selectionCardKey(id)) || null;
3719
+ if (card?.dataset) {
3720
+ card.dataset.contentKey = '';
3721
+ card.dataset.sourceEpoch = '';
3722
+ }
3723
+ } else {
3724
+ state.cards.forEach(card => {
3725
+ if (!card?.dataset) {
3726
+ return;
3727
+ }
3728
+
3729
+ card.dataset.contentKey = '';
3730
+ card.dataset.sourceEpoch = '';
3731
+ });
3732
+ }
3733
+
3734
+ const epoch = bumpReadonlySourceEpoch(module);
3735
+ state.dirtyLayout = true;
3736
+ module._overlayDirty = true;
3737
+ module._lastOverlayKey = '';
3738
+ module.requestAnimationWake?.(`readonly-source:${reason || 'source'}`);
3739
+ window.RuntimeTrace?.emit?.('textOverlay.readonlySourceInvalidated', {
3740
+ nodeId: id,
3741
+ reason: String(reason || 'source'),
3742
+ epoch
3743
+ });
3744
+ return true;
3745
+ }
3746
+
3709
3747
  function hidePassiveSelectionCards(module, state = ensureState(module), options = {}) {
3710
3748
  if (!module || !state) {
3711
3749
  return 0;
@@ -4459,6 +4497,7 @@
4459
4497
  suspendSource: suspendSource,
4460
4498
  resumeSource: resumeSource,
4461
4499
  hasLiveInteractiveOverlay: hasLiveInteractiveOverlay,
4462
- syncReadonlySourceScroll: syncReadonlySourceScroll
4500
+ syncReadonlySourceScroll: syncReadonlySourceScroll,
4501
+ invalidateReadonlySource: invalidateReadonlySource
4463
4502
  };
4464
4503
  })();
@@ -7,8 +7,8 @@
7
7
  <title>MindExec | Run your ideas as AI task graphs</title>
8
8
  <meta name="description" content="MindExec is an AI execution canvas for solo builders, researchers, developers, and creators. Start with free browser tools, then move serious work into saved MindCanvas projects." />
9
9
  <base href="/" />
10
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260617-mdm-overlay-live-v581" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-mdm-overlay-live-v581" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260617-mdm-size-sync-v583" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-mdm-size-sync-v583" />
12
12
  <!-- ?쇄뼹??Font Awesome (local) ?쇄뼹??-->
13
13
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
14
14
  <!-- ?꿎뼯??-->
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260617-mdm-overlay-live-v581';
582
+ const scriptVersion = '20260617-mdm-size-sync-v583';
583
583
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
584
584
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
585
585
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "oR91p21X",
2
+ "version": "2KqIRZaB",
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-+Y65YIk5GcFioFxM72xcAvkC2+vdx+B90L2qlalXrhw=",
89
+ "hash": "sha256-jDvRb/lyHSbYOYjqGqyc0m3AIRkOtfL144gqEyAGHOM=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -154,7 +154,7 @@
154
154
  "url": "_content/MindExecution.Shared/js/mind-map-text-lod-system.js"
155
155
  },
156
156
  {
157
- "hash": "sha256-3l28axG42hfZEY1kU745EtUjPK+at8T9yNb/OERee0U=",
157
+ "hash": "sha256-qwNb+PcesE9rgfkjiJrUOWHz/J2vwDUb6wzJ3j5Zj90=",
158
158
  "url": "_content/MindExecution.Shared/js/mind-map-text-overlay-v2.js"
159
159
  },
160
160
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-6kgfFKKW8vB1esatu6Iq0af4n6evMTxQfK5SCVpyq5k=",
837
+ "hash": "sha256-TJzGANRJXvjZ2Tpohu7NwDaJqYaNRaaVMNDegpwN3GI=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: oR91p21X */
1
+ /* Manifest version: 2KqIRZaB */
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