@mindexec/cli 0.2.120 → 0.2.121

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.120",
3
+ "version": "0.2.121",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -13463,6 +13463,8 @@
13463
13463
  const REMOTE_FLEET_THUMBNAIL_FRAME_DECODE_TIMEOUT_MS = 1200;
13464
13464
  const REMOTE_FLEET_BINARY_FRAME_WS_RECONNECT_MS = 1500;
13465
13465
  const REMOTE_FLEET_BINARY_FRAME_SUBSCRIBE_MS = 1000;
13466
+ const REMOTE_FLEET_AUTO_LIVE_START_MAX_PARALLEL = 8;
13467
+ const REMOTE_FLEET_AUTO_LIVE_START_COOLDOWN_MS = 3000;
13466
13468
  const REMOTE_FLEET_TASK_FOLLOW_INITIAL_MS = 250;
13467
13469
  const REMOTE_FLEET_TASK_FOLLOW_REFRESH_MS = 2000;
13468
13470
  const REMOTE_FLEET_TASK_FOLLOW_MAX_TICKS = 60;
@@ -13760,15 +13762,13 @@
13760
13762
  const payload = buffer.slice(4 + metaLength);
13761
13763
  const mimeType = String(metadata.mimeType || metadata.format || 'image/jpeg').trim() || 'image/jpeg';
13762
13764
  const payloadBlob = new Blob([payload], { type: mimeType });
13763
- const objectUrl = URL.createObjectURL(payloadBlob);
13764
13765
  return {
13765
13766
  ...metadata,
13766
13767
  kind: String(metadata.kind || 'live').toLowerCase() === 'thumbnail' ? 'thumbnail' : 'live',
13767
13768
  mimeType,
13768
- frameUrl: objectUrl,
13769
- framePath: objectUrl,
13769
+ frameUrl: '',
13770
+ framePath: '',
13770
13771
  dataUrl: '',
13771
- _remoteFleetObjectUrl: objectUrl,
13772
13772
  _remoteFleetPayloadBlob: payloadBlob,
13773
13773
  _remoteFleetBinaryFrame: true
13774
13774
  };
@@ -14371,7 +14371,7 @@
14371
14371
  }
14372
14372
 
14373
14373
  async function loadRemoteFleetFrameBitmap(frame) {
14374
- if (!frame || !isRemoteFleetFrameSource(frame.frameUrl)) {
14374
+ if (!frame) {
14375
14375
  return null;
14376
14376
  }
14377
14377
 
@@ -14386,6 +14386,10 @@
14386
14386
  timeoutMs);
14387
14387
  }
14388
14388
 
14389
+ if (!isRemoteFleetFrameSource(frame.frameUrl)) {
14390
+ return null;
14391
+ }
14392
+
14389
14393
  if (typeof fetch !== 'function') {
14390
14394
  return null;
14391
14395
  }
@@ -14437,7 +14441,7 @@
14437
14441
  String(frame?.kind || '').trim().toLowerCase(),
14438
14442
  String(frame?.streamId || '').trim(),
14439
14443
  String(Number(frame?.frameSeq || 0) || 0),
14440
- String(frame?.frameUrl || '').trim()
14444
+ String(frame?.contentHash || frame?.frameUrl || '').trim()
14441
14445
  ].join('|');
14442
14446
  }
14443
14447
 
@@ -14467,7 +14471,9 @@
14467
14471
  }
14468
14472
 
14469
14473
  function isRemoteFleetFrameNewerForPreview(preview, frame, comparePending = false) {
14470
- if (!preview || !frame || !isRemoteFleetFrameSource(frame.frameUrl)) {
14474
+ const hasPayloadBlob = !!frame?._remoteFleetPayloadBlob;
14475
+ const hasFrameSource = isRemoteFleetFrameSource(frame?.frameUrl);
14476
+ if (!preview || !frame || (!hasPayloadBlob && !hasFrameSource)) {
14471
14477
  return false;
14472
14478
  }
14473
14479
 
@@ -14636,7 +14642,7 @@
14636
14642
  }
14637
14643
 
14638
14644
  const frame = preview._remoteFleetPendingFrame;
14639
- if (!frame || !isRemoteFleetFrameSource(frame.frameUrl)) {
14645
+ if (!frame || (!frame._remoteFleetPayloadBlob && !isRemoteFleetFrameSource(frame.frameUrl))) {
14640
14646
  clearRemoteFleetPendingFrameDataset(preview, frame);
14641
14647
  return;
14642
14648
  }
@@ -14673,6 +14679,25 @@
14673
14679
  return;
14674
14680
  }
14675
14681
 
14682
+ let fallbackUrl = String(frame.frameUrl || '').trim();
14683
+ if (!isRemoteFleetFrameSource(fallbackUrl)
14684
+ && frame._remoteFleetPayloadBlob
14685
+ && typeof URL !== 'undefined'
14686
+ && typeof URL.createObjectURL === 'function') {
14687
+ try {
14688
+ fallbackUrl = URL.createObjectURL(frame._remoteFleetPayloadBlob);
14689
+ frame.frameUrl = fallbackUrl;
14690
+ frame._remoteFleetObjectUrl = fallbackUrl;
14691
+ } catch {
14692
+ fallbackUrl = '';
14693
+ }
14694
+ }
14695
+
14696
+ if (!isRemoteFleetFrameSource(fallbackUrl)) {
14697
+ finish(false, 'img-unavailable');
14698
+ return;
14699
+ }
14700
+
14676
14701
  const timeoutMs = getRemoteFleetFrameDecodeTimeoutMs(frame);
14677
14702
  let settled = false;
14678
14703
  const complete = (loaded, surface = 'img') => {
@@ -14691,7 +14716,7 @@
14691
14716
  decoded.then(() => complete(true, 'img'));
14692
14717
  };
14693
14718
  loader.onerror = () => complete(false, 'img');
14694
- loader.src = frame.frameUrl;
14719
+ loader.src = fallbackUrl;
14695
14720
  };
14696
14721
 
14697
14722
  const canvas = ensureRemoteFleetFrameCanvas(preview);
@@ -14753,7 +14778,7 @@
14753
14778
  seq: frame.frameSeq,
14754
14779
  error: error?.message || String(error || '')
14755
14780
  });
14756
- finish(false, 'canvas-timeout');
14781
+ loadFallbackImage();
14757
14782
  return;
14758
14783
  }
14759
14784
 
@@ -17100,35 +17125,39 @@
17100
17125
  return ids.slice(0, 120);
17101
17126
  };
17102
17127
  const ensureVisibleRemoteFleetLiveStreams = async () => {
17103
- if (!(bodyView._remoteFleetAutoLiveStartedIds instanceof Set)) {
17104
- bodyView._remoteFleetAutoLiveStartedIds = new Set();
17128
+ if (!(bodyView._remoteFleetAutoLiveStartInFlight instanceof Set)) {
17129
+ bodyView._remoteFleetAutoLiveStartInFlight = new Set();
17130
+ }
17131
+ if (!(bodyView._remoteFleetAutoLiveStartAttemptAt instanceof Map)) {
17132
+ bodyView._remoteFleetAutoLiveStartAttemptAt = new Map();
17105
17133
  }
17134
+ const now = Date.now();
17106
17135
  const targets = getVisibleLiveDevices()
17107
17136
  .filter(device => {
17108
17137
  const deviceId = getRemoteFleetDeviceId(device);
17138
+ const lastAttemptAt = Number(bodyView._remoteFleetAutoLiveStartAttemptAt.get(deviceId) || 0);
17109
17139
  return deviceId
17110
17140
  && !isRemoteFleetLiveActive(device)
17111
- && !bodyView._remoteFleetAutoLiveStartedIds.has(deviceId);
17141
+ && !bodyView._remoteFleetAutoLiveStartInFlight.has(deviceId)
17142
+ && (now - lastAttemptAt >= REMOTE_FLEET_AUTO_LIVE_START_COOLDOWN_MS);
17112
17143
  });
17113
17144
  if (targets.length === 0) {
17114
17145
  return null;
17115
17146
  }
17116
17147
 
17117
- if (!(bodyView._remoteFleetAutoLiveStartInFlight instanceof Set)) {
17118
- bodyView._remoteFleetAutoLiveStartInFlight = new Set();
17119
- }
17120
-
17121
17148
  let started = 0;
17122
17149
  let lastResult = null;
17123
- for (const target of targets) {
17150
+ const queue = targets.slice(0, 120);
17151
+ const startOne = async target => {
17124
17152
  const deviceId = getRemoteFleetDeviceId(target);
17125
17153
  if (!deviceId || bodyView._remoteFleetAutoLiveStartInFlight.has(deviceId)) {
17126
- continue;
17154
+ return;
17127
17155
  }
17128
17156
 
17129
17157
  bodyView._remoteFleetAutoLiveStartInFlight.add(deviceId);
17158
+ bodyView._remoteFleetAutoLiveStartAttemptAt.set(deviceId, Date.now());
17130
17159
  try {
17131
- const result = await invokeDotNetAsync('StartRemoteFleetLiveStreamFromJs', nodeId, deviceId);
17160
+ const result = await invokeDotNetAsync('StartRemoteFleetLiveStreamFromJs', nodeId, deviceId, REMOTE_FLEET_MONITOR_LIVE_FPS);
17132
17161
  lastResult = result;
17133
17162
  const success = isRemoteFleetResultSuccess(result);
17134
17163
  window.RuntimeTrace?.emit?.('remote.live.autoStart', {
@@ -17141,12 +17170,21 @@
17141
17170
  });
17142
17171
  if (success) {
17143
17172
  started += 1;
17144
- bodyView._remoteFleetAutoLiveStartedIds.add(deviceId);
17145
17173
  }
17146
17174
  } finally {
17147
17175
  bodyView._remoteFleetAutoLiveStartInFlight.delete(deviceId);
17148
17176
  }
17149
- }
17177
+ };
17178
+
17179
+ const workerCount = Math.min(REMOTE_FLEET_AUTO_LIVE_START_MAX_PARALLEL, queue.length);
17180
+ await Promise.all(Array.from({ length: workerCount }, async () => {
17181
+ while (queue.length > 0) {
17182
+ const target = queue.shift();
17183
+ if (target) {
17184
+ await startOne(target);
17185
+ }
17186
+ }
17187
+ }));
17150
17188
 
17151
17189
  if (started > 0) {
17152
17190
  try {
@@ -7,8 +7,8 @@
7
7
  <title>MindExec | Run your ideas as AI task graphs</title>
8
8
  <meta name="description" content="MindExec is an AI execution canvas for solo builders, researchers, developers, and creators. Start with free browser tools, then move serious work into saved MindCanvas projects." />
9
9
  <base href="/" />
10
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-mdm-ws-fast-v575" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-ws-fast-v575" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-mdm-live-paint-v576" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-live-paint-v576" />
12
12
  <!-- ?쇄뼹??Font Awesome (local) ?쇄뼹??-->
13
13
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
14
14
  <!-- ?꿎뼯??-->
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260616-mdm-ws-fast-v575';
582
+ const scriptVersion = '20260616-mdm-live-paint-v576';
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": "vnLn5hRl",
2
+ "version": "dvBBmOSo",
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-eGHfAJwh8N3LmDZTr3/anW3CVrYCEYowGfK4N8KPzik=",
89
+ "hash": "sha256-f0C7hF8MEs79aW0LHHOPm+FeBP7cvy/GxhypXzccmd4=",
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-IYebw41Eytj+5xl0lRltZ9R7wOwuHg0mlcgar2MiudE=",
837
+ "hash": "sha256-HElWHU9ioUT0cuuCKMD/40OJ15fyVOJNYjuApu3T4mI=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: vnLn5hRl */
1
+ /* Manifest version: dvBBmOSo */
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