@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 +1 -1
- package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
- package/scripts/remote-fleet-render-smoke.mjs +55 -2
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +140 -21
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-text-overlay-v2.js +40 -1
- package/wwwroot/index.html +3 -3
- package/wwwroot/service-worker-assets.js +4 -4
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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:
|
|
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 =
|
|
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:
|
|
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
|
-
|
|
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
|
})();
|
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=20260617-mdm-
|
|
11
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-mdm-
|
|
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-
|
|
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": "
|
|
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
|
|
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-
|
|
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-
|
|
837
|
+
"hash": "sha256-TJzGANRJXvjZ2Tpohu7NwDaJqYaNRaaVMNDegpwN3GI=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|