@mindexec/cli 0.2.111 → 0.2.112

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.111",
3
+ "version": "0.2.112",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
package/remote-hub.js CHANGED
@@ -15,11 +15,11 @@ const MAX_AGENT_TASK_CHARS = 4000;
15
15
  const MAX_AGENT_TASK_RESULT_CHARS = 3000;
16
16
  const RECENT_TASK_LIMIT = 12;
17
17
  const RECENT_TASK_BATCH_LIMIT = 16;
18
- const RECENT_FRAME_CACHE_TTL_MS = 5000;
18
+ const RECENT_FRAME_CACHE_TTL_MS = 12000;
19
19
  const RECENT_THUMBNAIL_FRAME_CACHE_LIMIT = 4;
20
- const RECENT_LIVE_FRAME_CACHE_LIMIT = 24;
20
+ const RECENT_LIVE_FRAME_CACHE_LIMIT = 80;
21
21
  const RECENT_THUMBNAIL_FRAME_CACHE_MAX_BYTES = 3 * 1024 * 1024;
22
- const RECENT_LIVE_FRAME_CACHE_MAX_BYTES = 8 * 1024 * 1024;
22
+ const RECENT_LIVE_FRAME_CACHE_MAX_BYTES = 24 * 1024 * 1024;
23
23
  const REMOTE_PROTOCOL_VERSION = 1;
24
24
  const MAX_SYNTHETIC_DEVICES = 1000;
25
25
  const DEFAULT_HOST_TARGET_LEASE_MS = 30000;
@@ -5,7 +5,7 @@
5
5
  const DEBUG = false;
6
6
  const FPS_DEBUG = false;
7
7
  const FRAME_PERF_DEBUG = false;
8
- const MINDMAP_CORE_BUILD_ID = '20260616-project-gallery-rendered-thumb-v569';
8
+ const MINDMAP_CORE_BUILD_ID = '20260616-remote-live-img-preload-v570';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -13594,9 +13594,18 @@
13594
13594
 
13595
13595
  function isRemoteFleetFrameSource(value) {
13596
13596
  const source = String(value || '').trim();
13597
- return /^data:image\/(png|jpe?g|webp|svg\+xml);base64,/i.test(source)
13598
- || /^https?:\/\/(?:127(?:\.\d{1,3}){3}|localhost|\[::1\])(?::\d+)?\/api\/remote\//i.test(source)
13599
- || /^\/api\/remote\//i.test(source);
13597
+ if (/^data:image\/(png|jpe?g|webp|svg\+xml);base64,/i.test(source)
13598
+ || /^\/api\/remote\//i.test(source)) {
13599
+ return true;
13600
+ }
13601
+
13602
+ try {
13603
+ const url = new URL(source, window.location?.origin || 'http://localhost');
13604
+ return /^https?:$/i.test(url.protocol)
13605
+ && /^\/api\/remote\//i.test(url.pathname);
13606
+ } catch {
13607
+ return false;
13608
+ }
13600
13609
  }
13601
13610
 
13602
13611
  function getRemoteFleetFrameSource(device, frameKind) {
@@ -13946,9 +13955,9 @@
13946
13955
  }
13947
13956
 
13948
13957
  if (comparePending) {
13949
- const pendingUrl = String(preview.dataset.remoteFleetPendingFrameUrl || '');
13950
- const pendingKind = String(preview.dataset.remoteFleetPendingFrameKind || '').toLowerCase();
13951
- const pendingSeq = Number(preview.dataset.remoteFleetPendingFrameSeq || '0');
13958
+ const pendingUrl = String(preview.dataset.remoteFleetPendingImageUrl || preview.dataset.remoteFleetPendingFrameUrl || '');
13959
+ const pendingKind = String(preview.dataset.remoteFleetPendingImageKind || preview.dataset.remoteFleetPendingFrameKind || '').toLowerCase();
13960
+ const pendingSeq = Number(preview.dataset.remoteFleetPendingImageSeq || preview.dataset.remoteFleetPendingFrameSeq || '0');
13952
13961
  if (pendingUrl) {
13953
13962
  const samePending = pendingKind === frame.kind
13954
13963
  && pendingSeq === nextSeq
@@ -14257,35 +14266,116 @@
14257
14266
  return true;
14258
14267
  }
14259
14268
 
14260
- function applyRemoteFleetFramePatchToPreview(preview, frame) {
14261
- if (String(frame?.kind || '').toLowerCase() === 'live') {
14262
- if (!preview || !isRemoteFleetFrameNewerForPreview(preview, frame, false)) {
14263
- return false;
14264
- }
14269
+ function clearRemoteFleetPendingImageDataset(preview, frame) {
14270
+ if (!preview) {
14271
+ return;
14272
+ }
14265
14273
 
14266
- const image = ensureRemoteFleetFrameImage(preview, frame);
14267
- if (!image) {
14268
- return false;
14269
- }
14274
+ if (!frame
14275
+ || getRemoteFleetFrameIdentity(preview._remoteFleetPendingImageFrame) === getRemoteFleetFrameIdentity(frame)) {
14276
+ delete preview.dataset.remoteFleetPendingImageKind;
14277
+ delete preview.dataset.remoteFleetPendingImageSeq;
14278
+ delete preview.dataset.remoteFleetPendingImageUrl;
14279
+ preview._remoteFleetPendingImageFrame = null;
14280
+ }
14281
+ }
14270
14282
 
14271
- preview._remoteFleetPendingFrame = null;
14272
- delete preview.dataset.remoteFleetPendingFrameKind;
14273
- delete preview.dataset.remoteFleetPendingFrameSeq;
14274
- delete preview.dataset.remoteFleetPendingFrameUrl;
14283
+ function processRemoteFleetImageSwapQueue(preview, image) {
14284
+ if (!preview || !image || preview._remoteFleetImageLoaderActive === true) {
14285
+ return;
14286
+ }
14275
14287
 
14276
- const committed = commitRemoteFleetFrameToPreview(preview, image, cloneRemoteFleetFramePatch(frame));
14277
- if (committed) {
14288
+ const frame = preview._remoteFleetPendingImageFrame;
14289
+ if (!frame || !isRemoteFleetFrameSource(frame.frameUrl)) {
14290
+ clearRemoteFleetPendingImageDataset(preview, frame);
14291
+ return;
14292
+ }
14293
+
14294
+ preview._remoteFleetImageLoaderActive = true;
14295
+ const frameIdentity = getRemoteFleetFrameIdentity(frame);
14296
+ const timeoutMs = Math.max(1500, getRemoteFleetFrameDecodeTimeoutMs(frame));
14297
+ let settled = false;
14298
+ let timeout = null;
14299
+ const loader = new Image();
14300
+
14301
+ const finish = loaded => {
14302
+ if (settled) return;
14303
+ settled = true;
14304
+ if (timeout) {
14305
+ clearTimeout(timeout);
14306
+ timeout = null;
14307
+ }
14308
+
14309
+ const currentPending = preview._remoteFleetPendingImageFrame;
14310
+ const stillLatest = getRemoteFleetFrameIdentity(currentPending) === frameIdentity;
14311
+ let committed = false;
14312
+ if (loaded && stillLatest && document.body.contains(preview)) {
14313
+ committed = commitRemoteFleetFrameToPreview(preview, image, frame);
14278
14314
  window.RuntimeTrace?.emit?.('remote.frame.uiPatched', {
14279
- count: 1,
14315
+ count: committed ? 1 : 0,
14280
14316
  kind: frame.kind,
14281
14317
  seq: frame.frameSeq,
14282
- surface: 'img-direct-live',
14318
+ surface: 'img-preload',
14283
14319
  contentHash: frame.contentHash || '',
14284
14320
  sameContentStreak: Number(frame.sameContentStreak || 0) || 0,
14285
14321
  captureMs: Number(frame.captureMs || 0) || 0
14286
14322
  });
14323
+ } else if (!loaded) {
14324
+ window.RuntimeTrace?.emit?.('remote.frame.imageLoadFailed', {
14325
+ kind: frame.kind,
14326
+ seq: frame.frameSeq,
14327
+ url: frame.frameUrl
14328
+ });
14329
+ }
14330
+
14331
+ if (stillLatest) {
14332
+ clearRemoteFleetPendingImageDataset(preview, frame);
14333
+ }
14334
+
14335
+ preview._remoteFleetImageLoaderActive = false;
14336
+ if (preview._remoteFleetPendingImageFrame) {
14337
+ processRemoteFleetImageSwapQueue(preview, image);
14287
14338
  }
14288
- return committed;
14339
+ };
14340
+
14341
+ timeout = setTimeout(() => finish(false), timeoutMs);
14342
+ loader.decoding = 'async';
14343
+ loader.onload = () => {
14344
+ const decoded = typeof loader.decode === 'function'
14345
+ ? loader.decode().catch(() => undefined)
14346
+ : Promise.resolve();
14347
+ decoded.then(() => finish(true));
14348
+ };
14349
+ loader.onerror = () => finish(false);
14350
+ loader.src = frame.frameUrl;
14351
+ }
14352
+
14353
+ function queueRemoteFleetImageSwap(preview, frame) {
14354
+ if (!preview || !frame || !isRemoteFleetFrameNewerForPreview(preview, frame, true)) {
14355
+ return false;
14356
+ }
14357
+
14358
+ const image = ensureRemoteFleetFrameImage(preview, frame);
14359
+ if (!image) {
14360
+ return false;
14361
+ }
14362
+
14363
+ const nextFrame = cloneRemoteFleetFramePatch(frame);
14364
+ preview._remoteFleetPendingImageFrame = nextFrame;
14365
+ preview.dataset.remoteFleetPendingImageKind = nextFrame.kind;
14366
+ preview.dataset.remoteFleetPendingImageSeq = String(nextFrame.frameSeq || 0);
14367
+ preview.dataset.remoteFleetPendingImageUrl = nextFrame.frameUrl;
14368
+ processRemoteFleetImageSwapQueue(preview, image);
14369
+ return true;
14370
+ }
14371
+
14372
+ function applyRemoteFleetFramePatchToPreview(preview, frame) {
14373
+ if (String(frame?.kind || '').toLowerCase() === 'live') {
14374
+ preview._remoteFleetPendingFrame = null;
14375
+ delete preview.dataset.remoteFleetPendingFrameKind;
14376
+ delete preview.dataset.remoteFleetPendingFrameSeq;
14377
+ delete preview.dataset.remoteFleetPendingFrameUrl;
14378
+ return queueRemoteFleetImageSwap(preview, frame);
14289
14379
  }
14290
14380
 
14291
14381
  return queueRemoteFleetFramePaint(preview, frame);
@@ -14343,8 +14433,10 @@
14343
14433
  lastTick = timestamp;
14344
14434
  bodyView._remoteFleetFrameRefreshInFlight = true;
14345
14435
  Promise.resolve(refreshCallback())
14346
- .catch(() => {
14347
- clearRemoteFleetTimers(bodyView);
14436
+ .catch(error => {
14437
+ window.RuntimeTrace?.emit?.('remote.frame.refreshFailed', {
14438
+ error: error?.message || String(error || '')
14439
+ });
14348
14440
  })
14349
14441
  .finally(() => {
14350
14442
  bodyView._remoteFleetFrameRefreshInFlight = false;
@@ -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-project-gallery-rendered-thumb-v569" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-project-gallery-rendered-thumb-v569" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-remote-live-img-preload-v570" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-remote-live-img-preload-v570" />
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-project-gallery-rendered-thumb-v569';
582
+ const scriptVersion = '20260616-remote-live-img-preload-v570';
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": "rvvD2Jxd",
2
+ "version": "xXFM+YC6",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -78,7 +78,7 @@
78
78
  "url": "_content/MindExecution.Shared/js/marked.min.js"
79
79
  },
80
80
  {
81
- "hash": "sha256-I8levbQOMKm6+itQSEpmYXvCO/n1P5WLJT/PA/4b+CE=",
81
+ "hash": "sha256-nVQzxZ7EE6TbmugAy2X9Wy3RXenA7EAtfQYmceKyAeY=",
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
83
83
  },
84
84
  {
@@ -86,7 +86,7 @@
86
86
  "url": "_content/MindExecution.Shared/js/mind-map-core.js.backup"
87
87
  },
88
88
  {
89
- "hash": "sha256-/o9b8Gda8DwgDGaq9RBwBXb8C8uSvhppHN1cNPpUwO0=",
89
+ "hash": "sha256-u989dTMrJLCKW1Xnft/fCFSx288cqjSVohBi8jhuvZs=",
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-UFZB2qaCXJGdgOPtv+tajsidaEOVYIjhWAHHu76lw28=",
837
+ "hash": "sha256-ihPB4Vhq6CXrTD2TzgIc+CiL+St4Om3bQAAHhqtWuqU=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: rvvD2Jxd */
1
+ /* Manifest version: xXFM+YC6 */
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