@mindexec/cli 0.2.146 → 0.2.147
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 +27 -1
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +82 -20
- package/wwwroot/index.html +3 -3
- package/wwwroot/service-worker-assets.js +3 -3
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -923,7 +923,13 @@ try {
|
|
|
923
923
|
assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="task-device"]').length, 0);
|
|
924
924
|
assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="thumbnail-device"]').length, 0);
|
|
925
925
|
assert.equal(bodyView.querySelectorAll('[data-remote-fleet-frame-badge="true"]').length, 0);
|
|
926
|
-
|
|
926
|
+
const firstPreview = cards[0]?.querySelector('[data-remote-fleet-device-preview="tile"]');
|
|
927
|
+
assert.ok(firstPreview);
|
|
928
|
+
assert.match(cards[0]?.style.cssText || '', /border-radius:\s*0/);
|
|
929
|
+
assert.match(firstPreview.style.cssText, /border-radius:\s*0/);
|
|
930
|
+
assert.match(cards[0]?.title || '', /Status:\s*(Connected|Offline)/);
|
|
931
|
+
assert.match(cards[0]?.title || '', /Seen:/);
|
|
932
|
+
assert.match(cards[0]?.title || '', /Uptime:/);
|
|
927
933
|
assert.equal(/\b(Seen|Uptime|Mem|Load)\b/.test(cards[0]?.textContent || ''), false);
|
|
928
934
|
assert.match(deviceGrid.style.cssText, /minmax\(132px,\s*1fr\)/);
|
|
929
935
|
sizeControls.querySelector('[data-remote-fleet-action="monitor-size-up"]').dispatchEvent({ type: 'click' });
|
|
@@ -1274,6 +1280,7 @@ try {
|
|
|
1274
1280
|
const emptyScreens = emptyBody.querySelectorAll('[data-remote-fleet-empty-screen="true"]');
|
|
1275
1281
|
assert.ok(emptyScreens.length >= 24, `expected empty monitor to fill space, got ${emptyScreens.length}`);
|
|
1276
1282
|
assert.notEqual(emptyScreens.length, 6);
|
|
1283
|
+
assert.match(emptyScreens[0].style.cssText, /border-radius:\s*0/);
|
|
1277
1284
|
assert.ok(Array.from(emptyBody.children).map(child =>
|
|
1278
1285
|
Object.keys(child.dataset || {}).join(',') || child.tagName).join('|').endsWith('remoteFleetStatusRail'));
|
|
1279
1286
|
assert.equal(emptyBody.textContent.includes('No devices connected yet.'), false);
|
|
@@ -1281,6 +1288,24 @@ try {
|
|
|
1281
1288
|
assert.equal(emptyBody.textContent.includes('No screen'), false);
|
|
1282
1289
|
assert.equal(emptyBody.textContent.includes('Endpoint 127.0.0.1'), false);
|
|
1283
1290
|
|
|
1291
|
+
const oneDevice = devices.find(device => device.Connected === true);
|
|
1292
|
+
assert.ok(oneDevice);
|
|
1293
|
+
const { nodeShell: oneShell, bodyView: oneBody } = createRemoteFleetTemplateShell(document);
|
|
1294
|
+
document.body.appendChild(oneShell);
|
|
1295
|
+
manager.renderRemoteFleetMonitorForTest(oneBody, buildMonitorNode([oneDevice], hub.getStatus({ includeSecrets: true })));
|
|
1296
|
+
const oneCards = oneBody.querySelectorAll('article[data-device-id]');
|
|
1297
|
+
assert.equal(oneCards.length, 1);
|
|
1298
|
+
const onePreview = oneCards[0]?.querySelector('[data-remote-fleet-device-preview="tile"]');
|
|
1299
|
+
assert.ok(onePreview);
|
|
1300
|
+
assert.match(oneCards[0]?.style.cssText || '', /border-radius:\s*0/);
|
|
1301
|
+
assert.match(onePreview.style.cssText, /border-radius:\s*0/);
|
|
1302
|
+
assert.match(oneCards[0]?.title || '', /Status:\s*Connected/);
|
|
1303
|
+
assert.match(oneCards[0]?.title || '', /Seen:/);
|
|
1304
|
+
assert.match(oneCards[0]?.title || '', /Uptime:/);
|
|
1305
|
+
const oneFillers = oneBody.querySelectorAll('[data-remote-fleet-empty-screen="true"]');
|
|
1306
|
+
assert.ok(oneFillers.length > 0, 'single connected monitor wall should keep blank screen placeholders');
|
|
1307
|
+
assert.match(oneFillers[0].style.cssText, /border-radius:\s*0/);
|
|
1308
|
+
|
|
1284
1309
|
const { nodeShell: errorShell, bodyView: errorBody } = createRemoteFleetTemplateShell(document);
|
|
1285
1310
|
document.body.appendChild(errorShell);
|
|
1286
1311
|
manager.renderRemoteFleetMonitorForTest(errorBody, buildMonitorNode([], hub.getStatus({ includeSecrets: true }), null, [], 'RemoteHub is unavailable. Start LocalBridge and retry.'));
|
|
@@ -1305,6 +1330,7 @@ try {
|
|
|
1305
1330
|
|
|
1306
1331
|
nodeShell.remove();
|
|
1307
1332
|
emptyShell.remove();
|
|
1333
|
+
oneShell.remove();
|
|
1308
1334
|
errorShell.remove();
|
|
1309
1335
|
deviceBody.remove();
|
|
1310
1336
|
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
|
}
|
|
@@ -14320,6 +14331,54 @@
|
|
|
14320
14331
|
|| 'device');
|
|
14321
14332
|
}
|
|
14322
14333
|
|
|
14334
|
+
function getRemoteFleetDeviceTooltip(device) {
|
|
14335
|
+
const name = getRemoteFleetDeviceName(device);
|
|
14336
|
+
const deviceId = getRemoteFleetDeviceId(device);
|
|
14337
|
+
const hostname = String(getRemoteFleetDeviceField(device, 'hostname', 'Hostname', '') || '').trim();
|
|
14338
|
+
const connected = isRemoteFleetDeviceConnected(device);
|
|
14339
|
+
const platform = [
|
|
14340
|
+
getRemoteFleetDeviceField(device, 'platform', 'Platform', ''),
|
|
14341
|
+
getRemoteFleetDeviceField(device, 'release', 'Release', ''),
|
|
14342
|
+
getRemoteFleetDeviceField(device, 'arch', 'Arch', '')
|
|
14343
|
+
].map(value => String(value || '').trim()).filter(Boolean).join(' ');
|
|
14344
|
+
const agentVersion = String(getRemoteFleetDeviceField(device, 'agentVersion', 'AgentVersion', '') || '').trim();
|
|
14345
|
+
const remoteAddress = String(getRemoteFleetDeviceField(device, 'remoteAddress', 'RemoteAddress', '') || '').trim();
|
|
14346
|
+
const remotePort = Number(getRemoteFleetDeviceField(device, 'remotePort', 'RemotePort', 0)) || 0;
|
|
14347
|
+
const remoteEndpoint = remoteAddress ? `${remoteAddress}${remotePort > 0 ? `:${remotePort}` : ''}` : '';
|
|
14348
|
+
const liveSeq = getRemoteFleetFrameSeq(device, 'live');
|
|
14349
|
+
const thumbnailSeq = getRemoteFleetFrameSeq(device, 'thumbnail');
|
|
14350
|
+
const liveReceivedAt = String(getRemoteFleetDeviceField(device, 'liveFrameReceivedAt', 'LiveFrameReceivedAt', '') || '').trim();
|
|
14351
|
+
const thumbnailReceivedAt = String(getRemoteFleetDeviceField(device, 'thumbnailReceivedAt', 'ThumbnailReceivedAt', '') || '').trim();
|
|
14352
|
+
const latestTaskStatus = String(getRemoteFleetDeviceField(device, 'latestTaskStatus', 'LatestTaskStatus', '') || '').trim();
|
|
14353
|
+
const latestTaskTitle = String(getRemoteFleetDeviceField(device, 'latestTaskTitle', 'LatestTaskTitle', '') || '').trim();
|
|
14354
|
+
const latestTaskError = String(getRemoteFleetDeviceField(device, 'latestTaskError', 'LatestTaskError', '') || '').trim();
|
|
14355
|
+
const capabilityText = [
|
|
14356
|
+
isRemoteFleetLiveCapable(device) ? 'live' : '',
|
|
14357
|
+
isRemoteFleetThumbnailCapable(device) ? 'thumbnail' : '',
|
|
14358
|
+
isRemoteFleetDeviceTaskCapable(device) ? 'task' : '',
|
|
14359
|
+
isRemoteFleetDeviceAiCapable(device) ? 'ai' : ''
|
|
14360
|
+
].filter(Boolean).join(', ');
|
|
14361
|
+
|
|
14362
|
+
return [
|
|
14363
|
+
name,
|
|
14364
|
+
deviceId ? `ID: ${deviceId}` : '',
|
|
14365
|
+
hostname && hostname !== name ? `Host: ${hostname}` : '',
|
|
14366
|
+
`Status: ${connected ? 'Connected' : 'Offline'}`,
|
|
14367
|
+
platform ? `OS: ${platform}` : '',
|
|
14368
|
+
agentVersion ? `Agent: ${agentVersion}` : '',
|
|
14369
|
+
remoteEndpoint ? `Remote: ${remoteEndpoint}` : '',
|
|
14370
|
+
`Seen: ${formatRemoteFleetAge(getRemoteFleetDeviceField(device, 'lastSeenAt', 'LastSeenAt', ''))}`,
|
|
14371
|
+
`Uptime: ${formatRemoteFleetDuration(getRemoteFleetDeviceField(device, 'uptimeSec', 'UptimeSec', Number.NaN))}`,
|
|
14372
|
+
`Memory: ${formatRemoteFleetPercent(getRemoteFleetDeviceField(device, 'usedMemRatio', 'UsedMemRatio', Number.NaN))}`,
|
|
14373
|
+
`Load: ${formatRemoteFleetNumber(getRemoteFleetDeviceField(device, 'load1', 'Load1', Number.NaN), 2)}`,
|
|
14374
|
+
liveSeq > 0 ? `Live frame: #${liveSeq}${liveReceivedAt ? ` (${formatRemoteFleetAge(liveReceivedAt)})` : ''}` : '',
|
|
14375
|
+
thumbnailSeq > 0 ? `Thumbnail: #${thumbnailSeq}${thumbnailReceivedAt ? ` (${formatRemoteFleetAge(thumbnailReceivedAt)})` : ''}` : '',
|
|
14376
|
+
capabilityText ? `Capabilities: ${capabilityText}` : '',
|
|
14377
|
+
latestTaskStatus ? `Task: ${latestTaskStatus}${latestTaskTitle ? ` - ${latestTaskTitle}` : ''}` : '',
|
|
14378
|
+
latestTaskError ? `Task error: ${formatRemoteFleetTaskError(latestTaskError)}` : ''
|
|
14379
|
+
].filter(Boolean).join('\n');
|
|
14380
|
+
}
|
|
14381
|
+
|
|
14323
14382
|
function isRemoteFleetDeviceConnected(device) {
|
|
14324
14383
|
return getRemoteFleetDeviceField(device, 'connected', 'Connected', false) === true;
|
|
14325
14384
|
}
|
|
@@ -17269,12 +17328,13 @@
|
|
|
17269
17328
|
preview.dataset.remoteFleetFrameSeq = String(hasLiveFrame
|
|
17270
17329
|
? getRemoteFleetDeviceField(device, 'liveFrameSeq', 'LiveFrameSeq', 0)
|
|
17271
17330
|
: getRemoteFleetDeviceField(device, 'thumbnailFrameSeq', 'ThumbnailFrameSeq', 0));
|
|
17331
|
+
preview.title = getRemoteFleetDeviceTooltip(device);
|
|
17272
17332
|
preview.style.cssText = `
|
|
17273
17333
|
position: relative;
|
|
17274
17334
|
width: 100%;
|
|
17275
17335
|
aspect-ratio: 16 / 9;
|
|
17276
17336
|
overflow: hidden;
|
|
17277
|
-
border-radius:
|
|
17337
|
+
border-radius: 0;
|
|
17278
17338
|
background: ${(hasLiveFrame || hasThumbnail) ? 'linear-gradient(135deg, #0f172a 0%, #1e293b 100%)' : '#ffffff'};
|
|
17279
17339
|
border: 1px solid rgba(148, 163, 184, ${isDetail ? '0.34' : '0.24'});
|
|
17280
17340
|
box-shadow: none;
|
|
@@ -17435,7 +17495,7 @@
|
|
|
17435
17495
|
card.setAttribute('aria-pressed', isSelected ? 'true' : 'false');
|
|
17436
17496
|
card.setAttribute('aria-label', `Open remote control for ${name}`);
|
|
17437
17497
|
card.tabIndex = 0;
|
|
17438
|
-
card.title =
|
|
17498
|
+
card.title = getRemoteFleetDeviceTooltip(device);
|
|
17439
17499
|
card.style.cssText = `
|
|
17440
17500
|
position: relative;
|
|
17441
17501
|
display: flex;
|
|
@@ -17448,7 +17508,7 @@
|
|
|
17448
17508
|
box-sizing: border-box;
|
|
17449
17509
|
overflow: hidden;
|
|
17450
17510
|
padding: 0;
|
|
17451
|
-
border-radius:
|
|
17511
|
+
border-radius: 0;
|
|
17452
17512
|
background: transparent;
|
|
17453
17513
|
border: 0;
|
|
17454
17514
|
box-shadow: none;
|
|
@@ -17466,6 +17526,8 @@
|
|
|
17466
17526
|
grid.appendChild(card);
|
|
17467
17527
|
});
|
|
17468
17528
|
|
|
17529
|
+
appendRemoteFleetEmptyScreens(grid, nodeModel, densityState, devices.length);
|
|
17530
|
+
|
|
17469
17531
|
const noMatch = document.createElement('div');
|
|
17470
17532
|
noMatch.dataset.remoteFleetNoMatch = 'true';
|
|
17471
17533
|
noMatch.textContent = 'No matching devices.';
|
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-monitor-wall-v582" />
|
|
11
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-mdm-monitor-wall-v582" />
|
|
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-monitor-wall-v582';
|
|
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": "7b1rjf6s",
|
|
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-N0yX4cRkRJsZGixBtFAt5IkDeSMDDcKAmNtERmwuC+0=",
|
|
90
90
|
"url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
|
|
91
91
|
},
|
|
92
92
|
{
|
|
@@ -834,7 +834,7 @@
|
|
|
834
834
|
"url": "image-manifest.json"
|
|
835
835
|
},
|
|
836
836
|
{
|
|
837
|
-
"hash": "sha256-
|
|
837
|
+
"hash": "sha256-OtihK34SGInpkBV5g69QHYb9Mt/yUTsekpGz4Jl29L0=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|