@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 +1 -1
- package/scripts/remote-fleet-render-smoke.mjs +18 -26
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +93 -322
- package/wwwroot/_content/MindExecution.Shared/js/mindmap-toolbar.js +46 -1
- package/wwwroot/_framework/{MindExecution.Shared.fprczldv6z.dll → MindExecution.Shared.6us6j8zcea.dll} +0 -0
- package/wwwroot/_framework/blazor.boot.json +3 -3
- package/wwwroot/index.html +3 -3
- package/wwwroot/service-worker-assets.js +7 -7
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
|
@@ -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
|
|
726
|
+
assert.equal(initialDetailPanel, null);
|
|
727
727
|
const initialSelectedCard = bodyView.querySelector(`article[data-device-id="${focusedDevice.DeviceId}"]`);
|
|
728
|
-
assert.
|
|
729
|
-
assert.equal(initialSelectedCard?.
|
|
730
|
-
assert.
|
|
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,
|
|
734
|
-
assert.
|
|
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"]')
|
|
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.
|
|
782
|
-
assert.equal(selectedAfterClick?.
|
|
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.
|
|
826
|
-
assert.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
12980
|
-
const REMOTE_FLEET_LIVE_FRAME_REFRESH_MS = Math.round(1000 /
|
|
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:
|
|
15905
|
-
|
|
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', `
|
|
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:
|
|
16035
|
-
box-shadow:
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
|
16193
|
-
|
|
16194
|
-
|
|
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
|
-
|
|
16199
|
-
|
|
16200
|
-
return null;
|
|
15946
|
+
if (!(bodyView._remoteFleetAutoLiveStartInFlight instanceof Set)) {
|
|
15947
|
+
bodyView._remoteFleetAutoLiveStartInFlight = new Set();
|
|
16201
15948
|
}
|
|
16202
15949
|
|
|
16203
|
-
|
|
16204
|
-
|
|
16205
|
-
|
|
16206
|
-
|
|
16207
|
-
|
|
16208
|
-
|
|
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
|
-
|
|
16217
|
-
|
|
16218
|
-
|
|
16219
|
-
|
|
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
|
|
16243
|
-
const deviceIds =
|
|
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
|
|
16767
|
-
|
|
16768
|
-
|
|
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, () =>
|
|
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
|
-
},
|
|
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);
|
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mainAssemblyName": "MindExecution.Web",
|
|
3
3
|
"resources": {
|
|
4
|
-
"hash": "sha256-
|
|
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.
|
|
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.
|
|
285
|
+
"MindExecution.Shared.6us6j8zcea.dll": "sha256-guVuBtyzsP6SsCtNUfA0tstOgfKPNycx1cgtuoL206Q=",
|
|
286
286
|
"MindExecution.Web.xhlvm1d8ex.dll": "sha256-azcD8wLJIxuNSplzTVvh2ndLwdcu20xz1t8Jh23Dr7Q="
|
|
287
287
|
},
|
|
288
288
|
"lazyAssembly": {
|
package/wwwroot/index.html
CHANGED
|
@@ -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-
|
|
11
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-
|
|
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-
|
|
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": "
|
|
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-
|
|
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-
|
|
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-
|
|
446
|
-
"url": "_framework/MindExecution.Shared.
|
|
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-
|
|
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-
|
|
837
|
+
"hash": "sha256-lI1tEHVVoywntPHXryYZLXNjfn1/QsMbGnAZcu7zHWg=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|