@mindexec/cli 0.2.99 → 0.2.101

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.99",
3
+ "version": "0.2.101",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -723,18 +723,14 @@ try {
723
723
  assert.equal(statusFooter.querySelectorAll('[data-remote-fleet-status-item]').length, 5);
724
724
  assert.ok(statusFooter.querySelector('[data-remote-fleet-status-item="route"]'));
725
725
  const initialDetailPanel = bodyView.querySelector('[data-remote-fleet-detail-panel="true"]');
726
- assert.equal(initialDetailPanel?.dataset.deviceId, focusedDevice.DeviceId);
726
+ assert.equal(initialDetailPanel, null);
727
727
  const initialSelectedCard = bodyView.querySelector(`article[data-device-id="${focusedDevice.DeviceId}"]`);
728
- assert.equal(initialSelectedCard?.dataset.remoteFleetSelected, 'true');
729
- assert.equal(initialSelectedCard?.getAttribute('aria-pressed'), 'true');
730
- assert.ok(initialSelectedCard?.querySelector('[data-remote-fleet-selected-indicator="true"]'));
731
- assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="pin-device"]').length, 1);
728
+ assert.ok(initialSelectedCard);
729
+ assert.equal(initialSelectedCard?.querySelector('[data-remote-fleet-selected-indicator="true"]'), null);
730
+ assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="pin-device"]').length, 0);
732
731
  assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="task-device"]').length, 0);
733
- assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="thumbnail-device"]').length, focusedDevice.Connected && focusedDevice.ThumbnailEnabled ? 1 : 0);
734
- assert.ok(initialDetailPanel?.textContent.includes('Seen'));
735
- assert.ok(initialDetailPanel?.textContent.includes('Uptime'));
736
- assert.ok(initialDetailPanel?.textContent.includes('Mem'));
737
- assert.ok(initialDetailPanel?.textContent.includes('Load'));
732
+ assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="thumbnail-device"]').length, 0);
733
+ assert.equal(bodyView.querySelectorAll('[data-remote-fleet-frame-badge="true"]').length, 0);
738
734
  assert.ok(cards[0]?.querySelector('[data-remote-fleet-device-preview="tile"]'));
739
735
  assert.equal(/\b(Seen|Uptime|Mem|Load)\b/.test(cards[0]?.textContent || ''), false);
740
736
  assert.match(deviceGrid.style.cssText, /minmax\(132px,\s*1fr\)/);
@@ -768,6 +764,7 @@ try {
768
764
  assert.equal(patchPreview.dataset.remoteFleetPendingFrameUrl || '', '');
769
765
  assert.ok(patchPreview.querySelector('canvas[data-remote-fleet-frame-canvas="true"]'));
770
766
  assert.equal(patchPreview.querySelector('img[data-remote-fleet-frame-image="true"]')?.dataset.remoteFleetFrameUrl, patchUrl);
767
+ assert.equal(patchPreview.querySelector('[data-remote-fleet-frame-badge="true"]'), null);
771
768
  const alternateDevice = devices.find(device =>
772
769
  device.Connected === true
773
770
  && device.DeviceId !== focusedDevice.DeviceId);
@@ -776,11 +773,10 @@ try {
776
773
  assert.ok(alternateCard);
777
774
  alternateCard.dispatchEvent({ type: 'click' });
778
775
  assert.equal(bodyView.dataset.remoteFleetSelectedDeviceId, alternateDevice.DeviceId);
779
- assert.equal(bodyView.querySelector('[data-remote-fleet-detail-panel="true"]')?.dataset.deviceId, alternateDevice.DeviceId);
776
+ assert.equal(bodyView.querySelector('[data-remote-fleet-detail-panel="true"]'), null);
780
777
  const selectedAfterClick = bodyView.querySelector(`article[data-device-id="${alternateDevice.DeviceId}"]`);
781
- assert.equal(selectedAfterClick?.dataset.remoteFleetSelected, 'true');
782
- assert.equal(selectedAfterClick?.getAttribute('aria-pressed'), 'true');
783
- assert.ok(selectedAfterClick?.querySelector('[data-remote-fleet-selected-indicator="true"]'));
778
+ assert.ok(selectedAfterClick);
779
+ assert.equal(selectedAfterClick?.querySelector('[data-remote-fleet-selected-indicator="true"]'), null);
784
780
  const livePanel = bodyView.querySelector('[data-remote-fleet-live-panel="true"]');
785
781
  assert.equal(livePanel, null);
786
782
  assert.equal(bodyView.querySelector('[data-remote-fleet-action="task-visible"]'), null);
@@ -822,22 +818,18 @@ try {
822
818
  assert.equal(bodyView.querySelector('[data-remote-fleet-action="copy-command"]'), null);
823
819
  assert.equal(bodyView.querySelector('[data-remote-fleet-action="refresh"]'), null);
824
820
  assert.equal(bodyView.querySelector('[data-remote-fleet-auto-toggle="true"]'), null);
825
- assert.ok(bodyView.textContent.includes('synthetic-render-ai'));
826
- assert.ok(bodyView.textContent.includes('Task timed out waiting for the agent response.'));
821
+ assert.equal(bodyView.textContent.includes('synthetic-render-ai'), false);
822
+ assert.equal(bodyView.textContent.includes('Task timed out waiting for the agent response.'), false);
827
823
  const batchSummary = bodyView.querySelector('[data-remote-fleet-task-batch="true"]');
828
- assert.ok(batchSummary);
829
- assert.ok(batchSummary.textContent.includes('Render smoke batch'));
830
- assert.ok(batchSummary.textContent.includes('208/210 done'));
831
- assert.ok(batchSummary.textContent.includes('1 timed out'));
824
+ assert.equal(batchSummary, null);
832
825
  const batchHistory = bodyView.querySelector('[data-remote-fleet-task-history="true"]');
833
- assert.ok(batchHistory);
834
- assert.ok(batchHistory.textContent.includes('Previous AI batch'));
835
- assert.ok(batchHistory.textContent.includes('42/42 done'));
826
+ assert.equal(batchHistory, null);
836
827
  const resultPanel = bodyView.querySelector('[data-remote-fleet-task-results="true"]');
837
- assert.ok(resultPanel);
838
- assert.ok(resultPanel.textContent.includes('synthetic-render-ai'));
839
- assert.ok(resultPanel.textContent.includes('Overview AI result visible'));
828
+ assert.equal(resultPanel, null);
840
829
  assert.ok(devices.some(device => /^synthetic-response-/.test(device.LatestTaskResultResponseId)));
830
+ await wait();
831
+ const liveStartCalls = dotNetCalls.filter(call => call.methodName === 'StartRemoteFleetLiveStreamFromJs');
832
+ assert.ok(liveStartCalls.length > 1, `expected multiple visible live starts, got ${liveStartCalls.length}`);
841
833
  await wait(320);
842
834
  assert.ok(dotNetCalls.some(call => call.methodName === 'RefreshRemoteFleetMonitorNodeFromJs'));
843
835
  assert.equal(bodyView.dataset.remoteFleetTaskFollowKey, 'render-smoke-batch');
@@ -12976,8 +12976,8 @@
12976
12976
  const REMOTE_FLEET_MONITOR_REFRESH_MS = 10000;
12977
12977
  const REMOTE_FLEET_EMPTY_MONITOR_REFRESH_MS = 2500;
12978
12978
  const REMOTE_FLEET_LIVE_REFRESH_MS = 30000;
12979
- const REMOTE_FLEET_FOCUSED_LIVE_FPS = 10;
12980
- const REMOTE_FLEET_LIVE_FRAME_REFRESH_MS = Math.round(1000 / REMOTE_FLEET_FOCUSED_LIVE_FPS);
12979
+ const REMOTE_FLEET_MONITOR_LIVE_FPS = 10;
12980
+ const REMOTE_FLEET_LIVE_FRAME_REFRESH_MS = Math.round(1000 / REMOTE_FLEET_MONITOR_LIVE_FPS);
12981
12981
  const REMOTE_FLEET_THUMBNAIL_FRAME_REFRESH_MS = 2000;
12982
12982
  const REMOTE_FLEET_FRAME_CANVAS_MAX_DPR = 2;
12983
12983
  const REMOTE_FLEET_FRAME_BLOB_CACHE_MS = 10000;
@@ -13649,6 +13649,12 @@
13649
13649
  placeholder.remove();
13650
13650
  }
13651
13651
 
13652
+ const previewMode = String(preview?.dataset?.remoteFleetDevicePreview || '');
13653
+ if (previewMode === 'tile') {
13654
+ preview.querySelector?.('[data-remote-fleet-frame-badge="true"]')?.remove();
13655
+ return true;
13656
+ }
13657
+
13652
13658
  const badge = ensureRemoteFleetFrameBadge(preview, frame);
13653
13659
  if (badge) {
13654
13660
  const at = frame.receivedAt || frame.capturedAt || '';
@@ -15136,6 +15142,7 @@
15136
15142
  const recentTaskBatches = parseRemoteFleetRecentTaskBatches(nodeModel);
15137
15143
  const latestTaskBatchKey = getRemoteFleetTaskBatchKey(latestTaskBatch);
15138
15144
  const latestTaskBatchActive = isRemoteFleetTaskBatchActive(latestTaskBatch);
15145
+ const showTaskSummarySurfaces = false;
15139
15146
  if (latestTaskBatchKey && bodyView.dataset.remoteFleetTaskFollowKey !== latestTaskBatchKey) {
15140
15147
  bodyView.dataset.remoteFleetTaskFollowKey = latestTaskBatchKey;
15141
15148
  bodyView.dataset.remoteFleetTaskFollowTicks = '0';
@@ -15442,7 +15449,7 @@
15442
15449
  `;
15443
15450
  bodyView.appendChild(taskFeedback);
15444
15451
 
15445
- if (latestTaskBatch) {
15452
+ if (showTaskSummarySurfaces && latestTaskBatch) {
15446
15453
  const batchTotal = Number(latestTaskBatch.total ?? latestTaskBatch.Total ?? 0);
15447
15454
  const batchQueued = Number(latestTaskBatch.queued ?? latestTaskBatch.Queued ?? 0);
15448
15455
  const batchPending = Number(latestTaskBatch.pending ?? latestTaskBatch.Pending ?? 0);
@@ -15503,7 +15510,7 @@
15503
15510
  const visibleRecentBatches = recentTaskBatches
15504
15511
  .filter(batch => batch && String(batch.batchId ?? batch.BatchId ?? '').trim())
15505
15512
  .slice(0, 3);
15506
- if (visibleRecentBatches.length > 0) {
15513
+ if (showTaskSummarySurfaces && visibleRecentBatches.length > 0) {
15507
15514
  const history = document.createElement('div');
15508
15515
  history.dataset.remoteFleetTaskHistory = 'true';
15509
15516
  history.style.cssText = `
@@ -15570,7 +15577,7 @@
15570
15577
  .filter(item => item.status || item.title || item.summary || item.error)
15571
15578
  .sort((left, right) => right.updatedMs - left.updatedMs)
15572
15579
  .slice(0, 4);
15573
- if (recentTaskResults.length > 0) {
15580
+ if (showTaskSummarySurfaces && recentTaskResults.length > 0) {
15574
15581
  const resultPanel = document.createElement('div');
15575
15582
  resultPanel.dataset.remoteFleetTaskResults = 'true';
15576
15583
  resultPanel.style.cssText = `
@@ -15618,7 +15625,6 @@
15618
15625
  const previewSource = hasLiveFrame
15619
15626
  ? getRemoteFleetFrameSource(device, 'live')
15620
15627
  : getRemoteFleetFrameSource(device, 'thumbnail');
15621
- const previewAt = hasLiveFrame ? liveFrameReceivedAt : thumbnailCapturedAt;
15622
15628
  const isDetail = mode === 'detail';
15623
15629
 
15624
15630
  const preview = document.createElement('div');
@@ -15665,231 +15671,9 @@
15665
15671
  preview.appendChild(placeholder);
15666
15672
  }
15667
15673
 
15668
- const dot = document.createElement('span');
15669
- dot.style.cssText = `
15670
- position: absolute;
15671
- left: ${isDetail ? '9px' : '6px'};
15672
- top: ${isDetail ? '9px' : '6px'};
15673
- width: ${isDetail ? '10px' : '8px'};
15674
- height: ${isDetail ? '10px' : '8px'};
15675
- border-radius: 999px;
15676
- background: ${connectedDevice ? '#10b981' : '#94a3b8'};
15677
- box-shadow: 0 0 0 3px ${connectedDevice ? 'rgba(16,185,129,0.20)' : 'rgba(148,163,184,0.18)'};
15678
- `;
15679
- preview.appendChild(dot);
15680
-
15681
- if (hasLiveFrame || (isDetail && previewAt)) {
15682
- const badge = document.createElement('span');
15683
- badge.dataset.remoteFleetFrameBadge = 'true';
15684
- badge.textContent = hasLiveFrame
15685
- ? (isDetail && previewAt ? `LIVE ${formatRemoteFleetAge(previewAt)}` : 'LIVE')
15686
- : formatRemoteFleetAge(previewAt);
15687
- badge.style.cssText = `
15688
- position: absolute;
15689
- right: ${isDetail ? '9px' : '6px'};
15690
- bottom: ${isDetail ? '9px' : '6px'};
15691
- max-width: calc(100% - ${isDetail ? '18px' : '12px'});
15692
- padding: ${isDetail ? '4px 7px' : '3px 6px'};
15693
- border-radius: 999px;
15694
- background: ${hasLiveFrame ? 'rgba(220, 38, 38, 0.84)' : 'rgba(15, 23, 42, 0.72)'};
15695
- color: #e2e8f0;
15696
- font-size: ${isDetail ? '9px' : '8px'};
15697
- font-weight: 950;
15698
- line-height: 1;
15699
- overflow: hidden;
15700
- text-overflow: ellipsis;
15701
- white-space: nowrap;
15702
- letter-spacing: 0;
15703
- `;
15704
- preview.appendChild(badge);
15705
- }
15706
-
15707
15674
  return preview;
15708
15675
  };
15709
15676
 
15710
- const createSelectedDevicePanel = device => {
15711
- const panel = document.createElement('aside');
15712
- panel.dataset.remoteFleetDetailPanel = 'true';
15713
- panel.style.cssText = `
15714
- min-width: 0;
15715
- min-height: 0;
15716
- overflow-y: auto;
15717
- display: flex;
15718
- flex-direction: column;
15719
- gap: 9px;
15720
- padding: 10px;
15721
- border-radius: 8px;
15722
- border: 1px solid rgba(148, 163, 184, 0.28);
15723
- background: rgba(255, 255, 255, 0.86);
15724
- `;
15725
-
15726
- if (!device) {
15727
- const empty = document.createElement('div');
15728
- empty.textContent = 'Select a screen';
15729
- empty.style.cssText = 'display:flex;align-items:center;justify-content:center;min-height:120px;color:#64748b;font-size:12px;font-weight:900;';
15730
- panel.appendChild(empty);
15731
- return panel;
15732
- }
15733
-
15734
- const deviceId = getRemoteFleetDeviceId(device);
15735
- const name = getRemoteFleetDeviceName(device);
15736
- const connectedDevice = isRemoteFleetDeviceConnected(device);
15737
- const platform = [device?.platform || device?.Platform, device?.arch || device?.Arch]
15738
- .filter(Boolean)
15739
- .join(' / ') || 'unknown';
15740
- const release = String(device?.release || device?.Release || '');
15741
- const thumbnailEnabled = device?.thumbnailEnabled === true || device?.ThumbnailEnabled === true;
15742
- const liveStreamEnabled = isRemoteFleetLiveCapable(device);
15743
- const liveStreamActive = isRemoteFleetLiveActive(device);
15744
- const liveStreamId = String(device?.liveStreamId || device?.LiveStreamId || '');
15745
- const taskEnabled = isRemoteFleetDeviceTaskCapable(device);
15746
- const aiAssistEnabled = isRemoteFleetDeviceAiCapable(device);
15747
- const aiModel = String(device?.aiModel || device?.AiModel || '');
15748
- const latestTaskStatus = String(device?.latestTaskStatus || device?.LatestTaskStatus || '');
15749
- const latestTaskTitle = String(device?.latestTaskTitle || device?.LatestTaskTitle || '');
15750
- const latestTaskApproval = String(device?.latestTaskApprovalLevel || device?.LatestTaskApprovalLevel || '');
15751
- const latestTaskUpdatedAt = String(device?.latestTaskUpdatedAt || device?.LatestTaskUpdatedAt || '');
15752
- const latestTaskError = String(device?.latestTaskError || device?.LatestTaskError || '');
15753
- const latestTaskResultModel = String(device?.latestTaskResultModel || device?.LatestTaskResultModel || '');
15754
- const latestTaskResultResponseId = String(device?.latestTaskResultResponseId || device?.LatestTaskResultResponseId || '');
15755
- const latestTaskResult = String(device?.latestTaskResultSummary || device?.LatestTaskResultSummary || '');
15756
- const statusText = connectedDevice
15757
- ? (liveStreamActive ? 'Live' : (aiAssistEnabled ? `AI ${aiModel || 'ready'}` : 'Connected'))
15758
- : 'Offline';
15759
-
15760
- panel.dataset.deviceId = deviceId;
15761
- const detailPreview = createDevicePreview(device, 'detail');
15762
- detailPreview.style.cursor = 'pointer';
15763
- detailPreview.addEventListener('dblclick', event => {
15764
- event.preventDefault();
15765
- event.stopPropagation();
15766
- bodyView.dataset.remoteFleetSelectedDeviceId = deviceId;
15767
- openRemoteFleetControlPopup(bodyView, nodeModel, deviceId);
15768
- });
15769
- panel.appendChild(detailPreview);
15770
-
15771
- const header = document.createElement('div');
15772
- header.style.cssText = 'display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-width:0;';
15773
- const titleBox = document.createElement('div');
15774
- titleBox.style.cssText = 'min-width:0;display:flex;flex-direction:column;gap:3px;';
15775
- const title = document.createElement('strong');
15776
- title.textContent = name;
15777
- title.title = name;
15778
- title.style.cssText = 'color:#0f172a;font-size:14px;font-weight:950;line-height:1.15;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:0;';
15779
- const subtitle = document.createElement('span');
15780
- subtitle.textContent = release ? `${platform} ${release}` : platform;
15781
- subtitle.title = subtitle.textContent;
15782
- subtitle.style.cssText = 'color:#64748b;font-size:11px;font-weight:750;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:0;';
15783
- titleBox.appendChild(title);
15784
- titleBox.appendChild(subtitle);
15785
- const status = document.createElement('span');
15786
- status.textContent = statusText;
15787
- status.style.cssText = `
15788
- flex: 0 0 auto;
15789
- max-width: 82px;
15790
- padding: 4px 7px;
15791
- border-radius: 999px;
15792
- background: ${liveStreamActive ? 'rgba(254, 226, 226, 0.92)' : (connectedDevice ? 'rgba(209, 250, 229, 0.92)' : 'rgba(226, 232, 240, 0.92)')};
15793
- color: ${liveStreamActive ? '#b91c1c' : (connectedDevice ? '#047857' : '#475569')};
15794
- font-size: 9px;
15795
- font-weight: 950;
15796
- line-height: 1;
15797
- overflow: hidden;
15798
- text-overflow: ellipsis;
15799
- white-space: nowrap;
15800
- letter-spacing: 0;
15801
- `;
15802
- header.appendChild(titleBox);
15803
- header.appendChild(status);
15804
- panel.appendChild(header);
15805
-
15806
- const metrics = document.createElement('div');
15807
- metrics.style.cssText = 'display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;';
15808
- const addDetailMetric = (label, value) => {
15809
- const metric = document.createElement('div');
15810
- metric.style.cssText = 'min-width:0;padding:7px 8px;border-radius:7px;background:rgba(241,245,249,0.86);border:1px solid rgba(148,163,184,0.16);';
15811
- const labelEl = document.createElement('div');
15812
- labelEl.textContent = label;
15813
- labelEl.style.cssText = 'color:#64748b;font-size:9px;font-weight:850;letter-spacing:0;text-transform:uppercase;';
15814
- const valueEl = document.createElement('div');
15815
- valueEl.textContent = value;
15816
- valueEl.title = value;
15817
- valueEl.style.cssText = 'color:#0f172a;font-size:12px;font-weight:950;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:0;';
15818
- metric.appendChild(labelEl);
15819
- metric.appendChild(valueEl);
15820
- metrics.appendChild(metric);
15821
- };
15822
- addDetailMetric('Seen', formatRemoteFleetAge(device?.lastSeenAt || device?.LastSeenAt));
15823
- addDetailMetric('Uptime', formatRemoteFleetDuration(device?.uptimeSec ?? device?.UptimeSec));
15824
- addDetailMetric('Mem', formatRemoteFleetPercent(device?.usedMemRatio ?? device?.UsedMemRatio));
15825
- addDetailMetric('Load', formatRemoteFleetNumber(device?.load1 ?? device?.Load1, 2));
15826
- panel.appendChild(metrics);
15827
-
15828
- if (latestTaskStatus || latestTaskTitle || latestTaskResult || latestTaskError) {
15829
- const taskBox = document.createElement('div');
15830
- const taskTone = latestTaskError || latestTaskStatus === 'failed'
15831
- ? 'error'
15832
- : (latestTaskStatus === 'completed' ? 'done' : 'pending');
15833
- taskBox.style.cssText = `
15834
- display: flex;
15835
- flex-direction: column;
15836
- gap: 4px;
15837
- min-width: 0;
15838
- padding: 8px 9px;
15839
- border-radius: 7px;
15840
- background: ${taskTone === 'error' ? 'rgba(248, 113, 113, 0.12)' : taskTone === 'done' ? 'rgba(16, 185, 129, 0.10)' : 'rgba(37, 99, 235, 0.08)'};
15841
- border: 1px solid ${taskTone === 'error' ? 'rgba(248, 113, 113, 0.24)' : taskTone === 'done' ? 'rgba(16, 185, 129, 0.20)' : 'rgba(37, 99, 235, 0.16)'};
15842
- `;
15843
- const taskLine = document.createElement('div');
15844
- const taskModeLabel = latestTaskApproval === 'ai-assist' ? 'AI' : 'Task';
15845
- taskLine.textContent = `${taskModeLabel} ${latestTaskStatus || 'task'}${latestTaskUpdatedAt ? ` - ${formatRemoteFleetAge(latestTaskUpdatedAt)}` : ''}${latestTaskResultModel ? ` - ${latestTaskResultModel}` : ''}`;
15846
- taskLine.title = latestTaskResultResponseId
15847
- ? `${taskLine.textContent} (${latestTaskResultResponseId})`
15848
- : taskLine.textContent;
15849
- taskLine.style.cssText = `color:${taskTone === 'error' ? '#991b1b' : taskTone === 'done' ? '#047857' : '#1d4ed8'};font-size:10px;font-weight:950;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:0;`;
15850
- const taskSummary = document.createElement('div');
15851
- taskSummary.textContent = formatRemoteFleetTaskError(latestTaskError) || latestTaskResult || latestTaskTitle || 'Task queued';
15852
- taskSummary.title = taskSummary.textContent;
15853
- taskSummary.style.cssText = 'color:#334155;font-size:10px;font-weight:750;line-height:1.25;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;letter-spacing:0;';
15854
- taskBox.appendChild(taskLine);
15855
- taskBox.appendChild(taskSummary);
15856
- panel.appendChild(taskBox);
15857
- }
15858
-
15859
- const actions = document.createElement('div');
15860
- actions.style.cssText = 'display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:auto;';
15861
- if (deviceId) {
15862
- const pinButton = createRemoteFleetButton('Pin', 'Pin this device as a canvas node', 'pin-device');
15863
- pinButton.dataset.deviceId = deviceId;
15864
- actions.appendChild(pinButton);
15865
- }
15866
- if (connectedDevice && deviceId) {
15867
- const focusButton = createRemoteFleetButton('Focus', 'Show this device in focused live panel', 'live-focus');
15868
- focusButton.dataset.deviceId = deviceId;
15869
- actions.appendChild(focusButton);
15870
- if (liveStreamEnabled) {
15871
- const liveButton = createRemoteFleetButton(liveStreamActive ? 'Stop' : 'Live', liveStreamActive ? 'Stop live stream' : 'Start focused live stream', liveStreamActive ? 'live-stop' : 'live-start');
15872
- liveButton.dataset.deviceId = deviceId;
15873
- liveButton.dataset.streamId = liveStreamId;
15874
- if (liveStreamActive) {
15875
- liveButton.style.borderColor = 'rgba(220, 38, 38, 0.32)';
15876
- liveButton.style.color = '#b91c1c';
15877
- }
15878
- actions.appendChild(liveButton);
15879
- }
15880
- if (thumbnailEnabled) {
15881
- const thumbnailButton = createRemoteFleetButton('Shot', 'Request thumbnail', 'thumbnail-device');
15882
- thumbnailButton.dataset.deviceId = deviceId;
15883
- actions.appendChild(thumbnailButton);
15884
- }
15885
- const pingButton = createRemoteFleetButton('Ping', 'Ping device', 'ping-device');
15886
- pingButton.dataset.deviceId = deviceId;
15887
- actions.appendChild(pingButton);
15888
- }
15889
- panel.appendChild(actions);
15890
- return panel;
15891
- };
15892
-
15893
15677
  const tileMetrics = getRemoteFleetTileMetrics(densityState);
15894
15678
  const tileMinWidth = tileMetrics.tileMinWidth;
15895
15679
  const tileMinHeight = tileMetrics.tileMinHeight;
@@ -15901,9 +15685,8 @@
15901
15685
  flex: 1 1 auto;
15902
15686
  min-height: 0;
15903
15687
  overflow: hidden;
15904
- display: grid;
15905
- grid-template-columns: minmax(0, 1fr) minmax(230px, 270px);
15906
- gap: 10px;
15688
+ display: flex;
15689
+ flex-direction: column;
15907
15690
  align-items: stretch;
15908
15691
  box-sizing: border-box;
15909
15692
  `;
@@ -16014,7 +15797,7 @@
16014
15797
  card.dataset.remoteFleetAction = 'select-device';
16015
15798
  card.setAttribute('role', 'button');
16016
15799
  card.setAttribute('aria-pressed', isSelected ? 'true' : 'false');
16017
- card.setAttribute('aria-label', `Show details for ${name}`);
15800
+ card.setAttribute('aria-label', `Open remote control for ${name}`);
16018
15801
  card.tabIndex = 0;
16019
15802
  card.title = name;
16020
15803
  card.style.cssText = `
@@ -16031,37 +15814,13 @@
16031
15814
  padding: 2px;
16032
15815
  border-radius: 8px;
16033
15816
  background: #ffffff;
16034
- border: 2px solid ${isSelected ? 'rgba(37, 99, 235, 0.76)' : (connectedDevice ? 'rgba(16, 185, 129, 0.30)' : 'rgba(148, 163, 184, 0.24)')};
16035
- box-shadow: ${isSelected ? '0 0 0 3px rgba(37, 99, 235, 0.15), 0 10px 22px rgba(15, 23, 42, 0.08)' : '0 8px 18px rgba(15, 23, 42, 0.05)'};
15817
+ border: 1px solid ${connectedDevice ? 'rgba(16, 185, 129, 0.28)' : 'rgba(148, 163, 184, 0.22)'};
15818
+ box-shadow: 0 8px 18px rgba(15, 23, 42, 0.05);
16036
15819
  cursor: pointer;
16037
15820
  pointer-events: auto;
16038
15821
  user-select: none;
16039
15822
  `;
16040
15823
  card.appendChild(createDevicePreview(device, 'tile'));
16041
- if (isSelected) {
16042
- const selectedIndicator = document.createElement('span');
16043
- selectedIndicator.dataset.remoteFleetSelectedIndicator = 'true';
16044
- selectedIndicator.innerHTML = '<i class="fa-solid fa-check" aria-hidden="true"></i>';
16045
- selectedIndicator.title = 'Selected screen';
16046
- selectedIndicator.style.cssText = `
16047
- position: absolute;
16048
- right: 6px;
16049
- top: 6px;
16050
- width: 18px;
16051
- height: 18px;
16052
- display: inline-flex;
16053
- align-items: center;
16054
- justify-content: center;
16055
- border-radius: 999px;
16056
- background: #2563eb;
16057
- color: #ffffff;
16058
- font-size: 9px;
16059
- line-height: 1;
16060
- box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.16), 0 8px 16px rgba(15, 23, 42, 0.16);
16061
- pointer-events: none;
16062
- `;
16063
- card.appendChild(selectedIndicator);
16064
- }
16065
15824
  grid.appendChild(card);
16066
15825
  });
16067
15826
 
@@ -16090,7 +15849,6 @@
16090
15849
  monitorWorkspace.appendChild(createRemoteFleetEmptyScreens(nodeModel, densityState));
16091
15850
  } else {
16092
15851
  monitorWorkspace.appendChild(grid);
16093
- monitorWorkspace.appendChild(createSelectedDevicePanel(selectedDevice));
16094
15852
  }
16095
15853
  bodyView.appendChild(monitorWorkspace);
16096
15854
  bodyView.appendChild(statusRail);
@@ -16148,77 +15906,90 @@
16148
15906
  .filter(card => card.style.display !== 'none')
16149
15907
  .map(card => String(card.dataset.deviceId || '').trim())
16150
15908
  .filter(Boolean);
16151
- if (focusedDevice) {
16152
- const focusedId = getRemoteFleetDeviceId(focusedDevice);
16153
- if (focusedId) {
16154
- ids.unshift(focusedId);
16155
- }
16156
- }
16157
15909
  return Array.from(new Set(ids)).slice(0, 120);
16158
15910
  };
16159
- const getFocusedLiveFrameDeviceIds = () => {
15911
+ const getVisibleLiveDevices = () => {
15912
+ const visibleIds = new Set(getVisibleFrameDeviceIds());
15913
+ return devices
15914
+ .filter(device => {
15915
+ const id = getRemoteFleetDeviceId(device);
15916
+ return id
15917
+ && visibleIds.has(id)
15918
+ && isRemoteFleetDeviceConnected(device)
15919
+ && isRemoteFleetLiveCapable(device);
15920
+ })
15921
+ .slice(0, 120);
15922
+ };
15923
+ const getVisibleLiveFrameDeviceIds = () => {
16160
15924
  const ids = [];
16161
- if (selectedDevice
16162
- && isRemoteFleetDeviceConnected(selectedDevice)
16163
- && (isRemoteFleetLiveCapable(selectedDevice) || isRemoteFleetLiveActive(selectedDevice))) {
16164
- pushUniqueFrameDeviceId(ids, selectedDevice);
16165
- }
16166
- if (focusedDevice
16167
- && isRemoteFleetDeviceConnected(focusedDevice)
16168
- && (isRemoteFleetLiveCapable(focusedDevice) || isRemoteFleetLiveActive(focusedDevice))) {
16169
- pushUniqueFrameDeviceId(ids, focusedDevice);
16170
- }
16171
- const autoLiveDevice = getAutoLiveDevice();
16172
- if (autoLiveDevice
16173
- && isRemoteFleetDeviceConnected(autoLiveDevice)
16174
- && isRemoteFleetLiveCapable(autoLiveDevice)) {
16175
- pushUniqueFrameDeviceId(ids, autoLiveDevice);
16176
- }
15925
+ getVisibleLiveDevices().forEach(device => pushUniqueFrameDeviceId(ids, device));
16177
15926
  devices
16178
15927
  .filter(device => isRemoteFleetDeviceConnected(device) && isRemoteFleetLiveActive(device))
16179
- .slice(0, 6)
16180
15928
  .forEach(device => pushUniqueFrameDeviceId(ids, device));
16181
- return ids.slice(0, 8);
16182
- };
16183
- const getAutoLiveDevice = () => {
16184
- if (selectedDevice && isRemoteFleetDeviceConnected(selectedDevice) && isRemoteFleetLiveCapable(selectedDevice)) {
16185
- return selectedDevice;
16186
- }
16187
- if (focusedDevice && isRemoteFleetDeviceConnected(focusedDevice) && isRemoteFleetLiveCapable(focusedDevice)) {
16188
- return focusedDevice;
16189
- }
16190
- return devices.find(device => isRemoteFleetDeviceConnected(device) && isRemoteFleetLiveCapable(device)) || null;
15929
+ return ids.slice(0, 120);
16191
15930
  };
16192
- const ensureFocusedRemoteFleetLiveStream = async () => {
16193
- const target = getAutoLiveDevice();
16194
- if (!target || isRemoteFleetLiveActive(target)) {
15931
+ const ensureVisibleRemoteFleetLiveStreams = async () => {
15932
+ if (!(bodyView._remoteFleetAutoLiveStartedIds instanceof Set)) {
15933
+ bodyView._remoteFleetAutoLiveStartedIds = new Set();
15934
+ }
15935
+ const targets = getVisibleLiveDevices()
15936
+ .filter(device => {
15937
+ const deviceId = getRemoteFleetDeviceId(device);
15938
+ return deviceId
15939
+ && !isRemoteFleetLiveActive(device)
15940
+ && !bodyView._remoteFleetAutoLiveStartedIds.has(deviceId);
15941
+ });
15942
+ if (targets.length === 0) {
16195
15943
  return null;
16196
15944
  }
16197
15945
 
16198
- const deviceId = getRemoteFleetDeviceId(target);
16199
- if (!deviceId || bodyView._remoteFleetAutoLiveStartInFlight === deviceId) {
16200
- return null;
15946
+ if (!(bodyView._remoteFleetAutoLiveStartInFlight instanceof Set)) {
15947
+ bodyView._remoteFleetAutoLiveStartInFlight = new Set();
16201
15948
  }
16202
15949
 
16203
- bodyView._remoteFleetAutoLiveStartInFlight = deviceId;
16204
- try {
16205
- const result = await invokeDotNetAsync('StartRemoteFleetLiveStreamFromJs', nodeId, deviceId);
16206
- window.RuntimeTrace?.emit?.('remote.live.autoStart', {
16207
- nodeId,
16208
- deviceId,
16209
- success: isRemoteFleetResultSuccess(result),
16210
- fps: result?.fps || result?.Fps || 0,
16211
- error: result?.error || result?.Error || ''
16212
- });
16213
- if (isRemoteFleetResultSuccess(result)) {
16214
- await syncRemoteFleetNodeStateFromResult(result);
15950
+ let started = 0;
15951
+ let lastResult = null;
15952
+ for (const target of targets) {
15953
+ const deviceId = getRemoteFleetDeviceId(target);
15954
+ if (!deviceId || bodyView._remoteFleetAutoLiveStartInFlight.has(deviceId)) {
15955
+ continue;
16215
15956
  }
16216
- return result;
16217
- } finally {
16218
- if (bodyView._remoteFleetAutoLiveStartInFlight === deviceId) {
16219
- bodyView._remoteFleetAutoLiveStartInFlight = '';
15957
+
15958
+ bodyView._remoteFleetAutoLiveStartInFlight.add(deviceId);
15959
+ try {
15960
+ const result = await invokeDotNetAsync('StartRemoteFleetLiveStreamFromJs', nodeId, deviceId);
15961
+ lastResult = result;
15962
+ const success = isRemoteFleetResultSuccess(result);
15963
+ window.RuntimeTrace?.emit?.('remote.live.autoStart', {
15964
+ nodeId,
15965
+ deviceId,
15966
+ success,
15967
+ fps: result?.fps || result?.Fps || 0,
15968
+ mode: 'visible-grid',
15969
+ error: result?.error || result?.Error || ''
15970
+ });
15971
+ if (success) {
15972
+ started += 1;
15973
+ bodyView._remoteFleetAutoLiveStartedIds.add(deviceId);
15974
+ }
15975
+ } finally {
15976
+ bodyView._remoteFleetAutoLiveStartInFlight.delete(deviceId);
15977
+ }
15978
+ }
15979
+
15980
+ if (started > 0) {
15981
+ try {
15982
+ await refreshRemoteFleetNode();
15983
+ } catch (error) {
15984
+ window.RuntimeTrace?.emit?.('remote.live.autoRefreshFailed', {
15985
+ nodeId,
15986
+ started,
15987
+ error: error?.message || String(error || '')
15988
+ });
16220
15989
  }
16221
15990
  }
15991
+
15992
+ return lastResult || { success: started > 0, started };
16222
15993
  };
16223
15994
  const refreshRemoteFleetNode = async () => {
16224
15995
  if (bodyView._remoteFleetRefreshInFlight === true) {
@@ -16239,8 +16010,8 @@
16239
16010
  applyRemoteFleetFramePatches(bodyView, normalizeRemoteFleetDeviceFramePatches(result));
16240
16011
  return result;
16241
16012
  };
16242
- const refreshRemoteFleetFocusedLiveFrames = async () => {
16243
- const deviceIds = getFocusedLiveFrameDeviceIds();
16013
+ const refreshRemoteFleetVisibleLiveFrames = async () => {
16014
+ const deviceIds = getVisibleLiveFrameDeviceIds();
16244
16015
  if (deviceIds.length === 0) {
16245
16016
  return null;
16246
16017
  }
@@ -16466,7 +16237,6 @@
16466
16237
  const deviceId = String(card.dataset.deviceId || '').trim();
16467
16238
  if (!deviceId) return;
16468
16239
  bodyView.dataset.remoteFleetSelectedDeviceId = deviceId;
16469
- renderRemoteFleetMonitor(bodyView, nodeModel);
16470
16240
  };
16471
16241
  card.addEventListener('click', selectCard);
16472
16242
  card.addEventListener('keydown', event => {
@@ -16763,15 +16533,16 @@
16763
16533
  startRemoteFleetHostLeaseTimer(nodeId, () => setRemoteFleetHostTarget(true, { quiet: true, renew: true }));
16764
16534
  }
16765
16535
 
16766
- const hasFocusedLiveTarget = getFocusedLiveFrameDeviceIds().length > 0 || !!getAutoLiveDevice();
16767
- if (hasFocusedLiveTarget || hasActiveLiveStream) {
16768
- ensureFocusedRemoteFleetLiveStream().catch(error => {
16536
+ const hasVisibleLiveTarget = getVisibleLiveFrameDeviceIds().length > 0
16537
+ || devices.some(device => isRemoteFleetDeviceConnected(device) && isRemoteFleetLiveCapable(device));
16538
+ if (hasVisibleLiveTarget || hasActiveLiveStream) {
16539
+ ensureVisibleRemoteFleetLiveStreams().catch(error => {
16769
16540
  window.RuntimeTrace?.emit?.('remote.live.autoStartFailed', {
16770
16541
  nodeId,
16771
16542
  error: error?.message || String(error || '')
16772
16543
  });
16773
16544
  });
16774
- startRemoteFleetFrameLoop(bodyView, REMOTE_FLEET_LIVE_FRAME_REFRESH_MS, () => refreshRemoteFleetFocusedLiveFrames());
16545
+ startRemoteFleetFrameLoop(bodyView, REMOTE_FLEET_LIVE_FRAME_REFRESH_MS, () => refreshRemoteFleetVisibleLiveFrames());
16775
16546
  bodyView._remoteFleetLiveRefreshTimer = setInterval(async () => {
16776
16547
  if (!document.body.contains(bodyView)) {
16777
16548
  clearRemoteFleetTimers(bodyView);
@@ -198,7 +198,7 @@
198
198
  if (!isNativeSelectFocusedInside(state.rootElement)) {
199
199
  state.nativeSelectInteractionActive = false;
200
200
  }
201
- }, 0);
201
+ }, 500);
202
202
  }
203
203
 
204
204
  function shouldIgnoreDocumentClickForNativeSelect(state) {
@@ -246,6 +246,35 @@
246
246
  clientY >= rect.top &&
247
247
  clientY <= rect.bottom;
248
248
  }
249
+
250
+ function isSurfaceOwnedPointerEvent(state, rootElement, event) {
251
+ if (!state || !event) {
252
+ return false;
253
+ }
254
+
255
+ return isEventInsideRoot(rootElement, event) ||
256
+ isPointerWithinElementBounds(rootElement, event) ||
257
+ isEventInsideIgnoredSelector(state.options?.ignoreSelector, event);
258
+ }
259
+
260
+ function rememberSurfacePointerDown(state, event) {
261
+ if (!state || !event) {
262
+ return;
263
+ }
264
+
265
+ const currentRootElement = resolveSurfaceRootElement(state.rootElement, state.options);
266
+ const isInsideSurface = isSurfaceOwnedPointerEvent(state, currentRootElement, event);
267
+ state.lastPointerDownInsideSurface = isInsideSurface;
268
+ state.lastPointerDownAt = getInteractionTime();
269
+
270
+ if (isInsideSurface) {
271
+ state.suppressNextDocumentClick = true;
272
+ }
273
+
274
+ if (isNativeSelectEvent(event)) {
275
+ markNativeSelectInteraction(state);
276
+ }
277
+ }
249
278
 
250
279
  function getUploadDropPosition(viewport) {
251
280
  const fallbackRect = viewport.getBoundingClientRect();
@@ -468,6 +497,10 @@
468
497
  document.removeEventListener('click', state.documentClickHandler, false);
469
498
  }
470
499
 
500
+ if (state.documentPointerDownHandler) {
501
+ document.removeEventListener('pointerdown', state.documentPointerDownHandler, true);
502
+ }
503
+
471
504
  if (state.helper) {
472
505
  surfaceOutsideClickCloseStatesByHelper.delete(state.helper);
473
506
  }
@@ -494,10 +527,13 @@
494
527
  suppressNextDocumentClick: false,
495
528
  nativeSelectInteractionActive: false,
496
529
  nativeSelectInteractionAt: 0,
530
+ lastPointerDownInsideSurface: false,
531
+ lastPointerDownAt: 0,
497
532
  rootPointerDownHandler: null,
498
533
  rootClickHandler: null,
499
534
  rootChangeHandler: null,
500
535
  rootFocusOutHandler: null,
536
+ documentPointerDownHandler: null,
501
537
  documentClickHandler: null
502
538
  };
503
539
 
@@ -526,6 +562,10 @@
526
562
  scheduleNativeSelectInteractionClear(state);
527
563
  };
528
564
 
565
+ state.documentPointerDownHandler = (event) => {
566
+ rememberSurfacePointerDown(state, event);
567
+ };
568
+
529
569
  state.documentClickHandler = (event) => {
530
570
  if (typeof event.button === 'number' && event.button !== 0) {
531
571
  return;
@@ -555,6 +595,10 @@
555
595
  return;
556
596
  }
557
597
 
598
+ if (state.lastPointerDownInsideSurface === true && getInteractionTime() - state.lastPointerDownAt < 1000) {
599
+ return;
600
+ }
601
+
558
602
  if (isEventInsideRoot(currentRootElement, event)) {
559
603
  return;
560
604
  }
@@ -575,6 +619,7 @@
575
619
  state.rootElement.addEventListener('click', state.rootClickHandler, true);
576
620
  state.rootElement.addEventListener('change', state.rootChangeHandler, true);
577
621
  state.rootElement.addEventListener('focusout', state.rootFocusOutHandler, true);
622
+ document.addEventListener('pointerdown', state.documentPointerDownHandler, true);
578
623
  document.addEventListener('click', state.documentClickHandler, false);
579
624
 
580
625
  surfaceOutsideClickCloseStatesByHelper.set(helper, state);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-we9qenVtePc2CABTfoN+/D96wdPuqIl4CgKuk3znAUA=",
4
+ "hash": "sha256-O56zjZxMQ+5iNAfOtWs8fbscWSt6EeGUYf66mN+CfeU=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -131,7 +131,7 @@
131
131
  "MindExecution.Plugins.Directory.u6p6pxpwxp.dll": "MindExecution.Plugins.Directory.dll",
132
132
  "MindExecution.Plugins.PlanMaster.0w4vr40lnz.dll": "MindExecution.Plugins.PlanMaster.dll",
133
133
  "MindExecution.Plugins.YouTube.sdl5n9uv68.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.fprczldv6z.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Shared.6us6j8zcea.dll": "MindExecution.Shared.dll",
135
135
  "MindExecution.Web.xhlvm1d8ex.dll": "MindExecution.Web.dll",
136
136
  "dotnet.js": "dotnet.js",
137
137
  "dotnet.native.qc8g39g30v.js": "dotnet.native.js",
@@ -282,7 +282,7 @@
282
282
  "MindExecution.Kernel.7k773jan4j.dll": "sha256-B5H6hzB6g8sWLqXUoXifv8CbLqVt7g1lLkkinTBKF8E=",
283
283
  "MindExecution.Plugins.Concept.w4znwcrl6x.dll": "sha256-oNGAmbTjkFdVfZeYbc4jYWtyQa3c8Tle5LIXoFye4yo=",
284
284
  "MindExecution.Plugins.PlanMaster.0w4vr40lnz.dll": "sha256-gPWCEzDE7cJLOFTJOhja3JXJzkHFWd4dzfRdsdTxwps=",
285
- "MindExecution.Shared.fprczldv6z.dll": "sha256-veGmVlpQw2b1zDaUWReHRSLbiZ2IloG79uo1GLlduEo=",
285
+ "MindExecution.Shared.6us6j8zcea.dll": "sha256-guVuBtyzsP6SsCtNUfA0tstOgfKPNycx1cgtuoL206Q=",
286
286
  "MindExecution.Web.xhlvm1d8ex.dll": "sha256-azcD8wLJIxuNSplzTVvh2ndLwdcu20xz1t8Jh23Dr7Q="
287
287
  },
288
288
  "lazyAssembly": {
@@ -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=20260616-mdm-latest-frame-v559" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-latest-frame-v559" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-settings-stable-v561" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-settings-stable-v561" />
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 = '20260616-mdm-latest-frame-v559';
582
+ const scriptVersion = '20260616-settings-stable-v561';
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": "EUMTR2WK",
2
+ "version": "4FFMY3D0",
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-moU5KG/6LqgoCKviugaQ703R/oh1u8n08Xkoih7tDUg=",
89
+ "hash": "sha256-MWVSM/VwUCyDL+ohY/7e6qDkkosGiE9E3t3DbiGJJEs=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -170,7 +170,7 @@
170
170
  "url": "_content/MindExecution.Shared/js/mind-map-visibility-worker.js"
171
171
  },
172
172
  {
173
- "hash": "sha256-icukeXd/DhA/7V4F4NOJP9jiQfzjjjosaH7PK2ymqAg=",
173
+ "hash": "sha256-XrXV7l2M7v2rA3bI7rk6Wwd5J8Qaqllr0UCgmhrstpo=",
174
174
  "url": "_content/MindExecution.Shared/js/mindmap-toolbar.js"
175
175
  },
176
176
  {
@@ -442,8 +442,8 @@
442
442
  "url": "_framework/MindExecution.Plugins.YouTube.sdl5n9uv68.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-veGmVlpQw2b1zDaUWReHRSLbiZ2IloG79uo1GLlduEo=",
446
- "url": "_framework/MindExecution.Shared.fprczldv6z.dll"
445
+ "hash": "sha256-guVuBtyzsP6SsCtNUfA0tstOgfKPNycx1cgtuoL206Q=",
446
+ "url": "_framework/MindExecution.Shared.6us6j8zcea.dll"
447
447
  },
448
448
  {
449
449
  "hash": "sha256-azcD8wLJIxuNSplzTVvh2ndLwdcu20xz1t8Jh23Dr7Q=",
@@ -770,7 +770,7 @@
770
770
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
771
771
  },
772
772
  {
773
- "hash": "sha256-vjnwzCMMAs+8it6vEUPeOD7pI/ekFwMr484KaDdpugE=",
773
+ "hash": "sha256-otJjpIYsVvUHEgoeo6sg1eNW43aM4CP9H1meWzXWQWA=",
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-FjUaVgGOa4fyf3cF3WIvk0qYkTDuxmB0aE3BTcR7aYU=",
837
+ "hash": "sha256-lI1tEHVVoywntPHXryYZLXNjfn1/QsMbGnAZcu7zHWg=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: EUMTR2WK */
1
+ /* Manifest version: 4FFMY3D0 */
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