@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.146",
3
+ "version": "0.2.147",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -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
- assert.ok(cards[0]?.querySelector('[data-remote-fleet-device-preview="tile"]'));
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
- const screenCount = getRemoteFleetEmptyScreenCount(nodeModel, sizeState);
13403
- for (let index = 0; index < screenCount; index += 1) {
13404
- const screen = document.createElement('div');
13405
- screen.dataset.remoteFleetEmptyScreen = 'true';
13406
- screen.style.cssText = `
13407
- width: 100%;
13408
- height: auto;
13409
- aspect-ratio: 16 / 9;
13410
- min-height: ${metrics.emptyMinHeight}px;
13411
- box-sizing: border-box;
13412
- border-radius: 8px;
13413
- border: 1px solid rgba(203, 213, 225, 0.66);
13414
- background: #ffffff;
13415
- box-shadow: none;
13416
- `;
13417
- shell.appendChild(screen);
13418
- }
13429
+ appendRemoteFleetEmptyScreens(shell, nodeModel, sizeState, 0);
13419
13430
 
13420
13431
  return shell;
13421
13432
  }
@@ -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: ${isDetail ? '8px' : '6px'};
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 = name;
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: 8px;
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.';
@@ -7,8 +7,8 @@
7
7
  <title>MindExec | Run your ideas as AI task graphs</title>
8
8
  <meta name="description" content="MindExec is an AI execution canvas for solo builders, researchers, developers, and creators. Start with free browser tools, then move serious work into saved MindCanvas projects." />
9
9
  <base href="/" />
10
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260617-mdm-overlay-live-v581" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260617-mdm-overlay-live-v581" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260617-mdm-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-overlay-live-v581';
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": "oR91p21X",
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-+Y65YIk5GcFioFxM72xcAvkC2+vdx+B90L2qlalXrhw=",
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-6kgfFKKW8vB1esatu6Iq0af4n6evMTxQfK5SCVpyq5k=",
837
+ "hash": "sha256-OtihK34SGInpkBV5g69QHYb9Mt/yUTsekpGz4Jl29L0=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: oR91p21X */
1
+ /* Manifest version: 7b1rjf6s */
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