@mindexec/cli 0.2.124 → 0.2.126

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.124",
3
+ "version": "0.2.126",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -13461,6 +13461,7 @@
13461
13461
  const REMOTE_FLEET_FRAME_BLOB_CACHE_LIMIT = 96;
13462
13462
  const REMOTE_FLEET_LIVE_FRAME_DECODE_TIMEOUT_MS = 180;
13463
13463
  const REMOTE_FLEET_THUMBNAIL_FRAME_DECODE_TIMEOUT_MS = 1200;
13464
+ const REMOTE_FLEET_BINARY_FRAME_MAX_DECODE_IN_FLIGHT = 2;
13464
13465
  const REMOTE_FLEET_BINARY_FRAME_WS_RECONNECT_MS = 1500;
13465
13466
  const REMOTE_FLEET_BINARY_FRAME_SUBSCRIBE_MS = 1000;
13466
13467
  const REMOTE_FLEET_BINARY_FRAME_STALE_FALLBACK_MS = 1400;
@@ -14506,13 +14507,14 @@
14506
14507
  }
14507
14508
 
14508
14509
  if (comparePending) {
14509
- const pendingUrl = String(preview.dataset.remoteFleetPendingImageUrl || preview.dataset.remoteFleetPendingFrameUrl || '');
14510
- const pendingKind = String(preview.dataset.remoteFleetPendingImageKind || preview.dataset.remoteFleetPendingFrameKind || '').toLowerCase();
14511
- const pendingSeq = Number(preview.dataset.remoteFleetPendingImageSeq || preview.dataset.remoteFleetPendingFrameSeq || '0');
14512
- if (pendingUrl) {
14510
+ const pendingUrl = String(preview.dataset.remoteFleetPendingBinaryUrl || preview.dataset.remoteFleetPendingImageUrl || preview.dataset.remoteFleetPendingFrameUrl || '');
14511
+ const pendingKind = String(preview.dataset.remoteFleetPendingBinaryKind || preview.dataset.remoteFleetPendingImageKind || preview.dataset.remoteFleetPendingFrameKind || '').toLowerCase();
14512
+ const pendingSeq = Number(preview.dataset.remoteFleetPendingBinarySeq || preview.dataset.remoteFleetPendingImageSeq || preview.dataset.remoteFleetPendingFrameSeq || '0');
14513
+ const hasPendingFrame = !!pendingUrl || !!pendingKind || (Number.isFinite(pendingSeq) && pendingSeq > 0);
14514
+ if (hasPendingFrame) {
14513
14515
  const samePending = pendingKind === frame.kind
14514
14516
  && pendingSeq === nextSeq
14515
- && pendingUrl === frame.frameUrl;
14517
+ && (pendingUrl === frame.frameUrl || (!pendingUrl && !frame.frameUrl));
14516
14518
  if (samePending) {
14517
14519
  return false;
14518
14520
  }
@@ -14652,6 +14654,165 @@
14652
14654
  }
14653
14655
  }
14654
14656
 
14657
+ function clearRemoteFleetPendingBinaryDataset(preview, frame) {
14658
+ if (!preview || preview._remoteFleetPendingBinaryFrame) {
14659
+ return;
14660
+ }
14661
+
14662
+ const pendingKind = String(preview.dataset.remoteFleetPendingBinaryKind || '').toLowerCase();
14663
+ const pendingSeq = Number(preview.dataset.remoteFleetPendingBinarySeq || '0');
14664
+ const pendingUrl = String(preview.dataset.remoteFleetPendingBinaryUrl || '');
14665
+ const frameKind = String(frame?.kind || '').toLowerCase();
14666
+ const frameSeq = Number(frame?.frameSeq || 0);
14667
+ const frameUrl = String(frame?.frameUrl || '');
14668
+ const sameFrame = !frame
14669
+ || (pendingKind === frameKind
14670
+ && pendingSeq === frameSeq
14671
+ && (pendingUrl === frameUrl || (!pendingUrl && !frameUrl)));
14672
+
14673
+ if (!sameFrame) {
14674
+ return;
14675
+ }
14676
+
14677
+ delete preview.dataset.remoteFleetPendingBinaryKind;
14678
+ delete preview.dataset.remoteFleetPendingBinarySeq;
14679
+ delete preview.dataset.remoteFleetPendingBinaryUrl;
14680
+ }
14681
+
14682
+ function hasRemoteFleetSupersedingBinaryFrame(preview, frame) {
14683
+ const pending = preview?._remoteFleetPendingBinaryFrame;
14684
+ if (!pending || !frame) {
14685
+ return false;
14686
+ }
14687
+
14688
+ const pendingKind = String(pending.kind || '').toLowerCase();
14689
+ const frameKind = String(frame.kind || '').toLowerCase();
14690
+ if (pendingKind === 'live' && frameKind !== 'live') {
14691
+ return true;
14692
+ }
14693
+
14694
+ const pendingSeq = Number(pending.frameSeq || 0);
14695
+ const frameSeq = Number(frame.frameSeq || 0);
14696
+ if (Number.isFinite(pendingSeq)
14697
+ && Number.isFinite(frameSeq)
14698
+ && pendingSeq > 0
14699
+ && frameSeq > 0) {
14700
+ return pendingSeq > frameSeq;
14701
+ }
14702
+
14703
+ return getRemoteFleetFrameIdentity(pending) !== getRemoteFleetFrameIdentity(frame);
14704
+ }
14705
+
14706
+ function drainRemoteFleetBinaryCanvasPaint(preview) {
14707
+ if (!preview
14708
+ || !document.body.contains(preview)
14709
+ || Number(preview._remoteFleetBinaryPaintInFlight || 0) >= REMOTE_FLEET_BINARY_FRAME_MAX_DECODE_IN_FLIGHT) {
14710
+ return;
14711
+ }
14712
+
14713
+ const frame = preview._remoteFleetPendingBinaryFrame;
14714
+ if (!frame || !frame._remoteFleetPayloadBlob || typeof createImageBitmap !== 'function') {
14715
+ preview._remoteFleetPendingBinaryFrame = null;
14716
+ clearRemoteFleetPendingBinaryDataset(preview, frame);
14717
+ return;
14718
+ }
14719
+
14720
+ if (!isRemoteFleetFrameNewerForPreview(preview, frame, false)) {
14721
+ preview._remoteFleetPendingBinaryFrame = null;
14722
+ clearRemoteFleetPendingBinaryDataset(preview, frame);
14723
+ return;
14724
+ }
14725
+
14726
+ preview._remoteFleetPendingBinaryFrame = null;
14727
+ preview._remoteFleetBinaryPaintInFlight = Number(preview._remoteFleetBinaryPaintInFlight || 0) + 1;
14728
+ const token = Number(preview._remoteFleetBinaryPaintToken || 0) + 1;
14729
+ preview._remoteFleetBinaryPaintToken = token;
14730
+
14731
+ loadRemoteFleetFrameBitmap(frame)
14732
+ .then(bitmap => new Promise(resolve => {
14733
+ if (!bitmap) {
14734
+ resolve(false);
14735
+ return;
14736
+ }
14737
+
14738
+ requestRemoteFleetFrameLoopFrame(() => {
14739
+ let committed = false;
14740
+ try {
14741
+ const isLatestToken = Number(preview._remoteFleetBinaryPaintToken || 0) === token;
14742
+ const superseded = hasRemoteFleetSupersedingBinaryFrame(preview, frame);
14743
+ if (document.body.contains(preview) && isLatestToken && !superseded) {
14744
+ const canvas = ensureRemoteFleetFrameCanvas(preview);
14745
+ const image = preview.querySelector?.('img[data-remote-fleet-frame-image="true"]') || null;
14746
+ committed = commitRemoteFleetFrameToCanvas(preview, canvas, image, bitmap, frame);
14747
+ }
14748
+ } finally {
14749
+ if (typeof bitmap.close === 'function') {
14750
+ bitmap.close();
14751
+ }
14752
+ }
14753
+
14754
+ if (committed) {
14755
+ window.RuntimeTrace?.emit?.('remote.frame.binaryPatched', {
14756
+ count: 1,
14757
+ kind: frame.kind,
14758
+ seq: frame.frameSeq,
14759
+ surface: 'binary-canvas',
14760
+ contentHash: frame.contentHash || '',
14761
+ sameContentStreak: Number(frame.sameContentStreak || 0) || 0,
14762
+ captureMs: Number(frame.captureMs || 0) || 0
14763
+ });
14764
+ } else {
14765
+ window.RuntimeTrace?.emit?.('remote.frame.binarySkipped', {
14766
+ kind: frame.kind,
14767
+ seq: frame.frameSeq,
14768
+ reason: hasRemoteFleetSupersedingBinaryFrame(preview, frame) ? 'superseded' : 'stale'
14769
+ });
14770
+ }
14771
+
14772
+ resolve(committed);
14773
+ });
14774
+ }))
14775
+ .catch(error => {
14776
+ window.RuntimeTrace?.emit?.('remote.frame.binaryDecodeFailed', {
14777
+ kind: frame.kind,
14778
+ seq: frame.frameSeq,
14779
+ error: error?.message || String(error || '')
14780
+ });
14781
+ })
14782
+ .finally(() => {
14783
+ preview._remoteFleetBinaryPaintInFlight = Math.max(0, Number(preview._remoteFleetBinaryPaintInFlight || 0) - 1);
14784
+ if (!preview._remoteFleetPendingBinaryFrame) {
14785
+ clearRemoteFleetPendingBinaryDataset(preview, frame);
14786
+ }
14787
+ if (preview._remoteFleetPendingBinaryFrame) {
14788
+ drainRemoteFleetBinaryCanvasPaint(preview);
14789
+ }
14790
+ });
14791
+ }
14792
+
14793
+ function queueRemoteFleetBinaryCanvasPaint(preview, frame) {
14794
+ if (!preview
14795
+ || !frame
14796
+ || frame._remoteFleetBinaryFrame !== true
14797
+ || !frame._remoteFleetPayloadBlob
14798
+ || typeof createImageBitmap !== 'function'
14799
+ || !isRemoteFleetFrameNewerForPreview(preview, frame, true)) {
14800
+ return false;
14801
+ }
14802
+
14803
+ const nextFrame = cloneRemoteFleetFramePatch(frame);
14804
+ preview._remoteFleetPendingBinaryFrame = nextFrame;
14805
+ preview.dataset.remoteFleetPendingBinaryKind = nextFrame.kind;
14806
+ preview.dataset.remoteFleetPendingBinarySeq = String(nextFrame.frameSeq || 0);
14807
+ preview.dataset.remoteFleetPendingBinaryUrl = nextFrame.frameUrl || '';
14808
+ window.RuntimeTrace?.emit?.('remote.frame.binaryQueued', {
14809
+ kind: nextFrame.kind,
14810
+ seq: nextFrame.frameSeq
14811
+ });
14812
+ drainRemoteFleetBinaryCanvasPaint(preview);
14813
+ return true;
14814
+ }
14815
+
14655
14816
  function processRemoteFleetFramePaintQueue(preview, image) {
14656
14817
  if (!preview || !image || preview._remoteFleetFrameLoaderActive === true) {
14657
14818
  return;
@@ -14925,6 +15086,16 @@
14925
15086
  }
14926
15087
 
14927
15088
  function applyRemoteFleetFramePatchToPreview(preview, frame) {
15089
+ if (frame?._remoteFleetBinaryFrame === true && frame?._remoteFleetPayloadBlob) {
15090
+ preview._remoteFleetPendingImageFrame = null;
15091
+ delete preview.dataset.remoteFleetPendingImageKind;
15092
+ delete preview.dataset.remoteFleetPendingImageSeq;
15093
+ delete preview.dataset.remoteFleetPendingImageUrl;
15094
+ if (queueRemoteFleetBinaryCanvasPaint(preview, frame)) {
15095
+ return true;
15096
+ }
15097
+ }
15098
+
14928
15099
  if (String(frame?.kind || '').toLowerCase() === 'live') {
14929
15100
  preview._remoteFleetPendingImageFrame = null;
14930
15101
  delete preview.dataset.remoteFleetPendingImageKind;
@@ -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-watchdog-v577" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-ws-watchdog-v577" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-mdm-binary-canvas-v578" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-binary-canvas-v578" />
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-watchdog-v577';
582
+ const scriptVersion = '20260616-mdm-binary-canvas-v578';
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": "PVMqIJP0",
2
+ "version": "spx46FdE",
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-04ZcgwZFW2ICQSVXCeuy61QLIexXoiGLVAIR1UDv3UQ=",
89
+ "hash": "sha256-g1BhxjO7bWZgkU1pMxOmGH/Z3n7XsZQYBIx31/Ptsu0=",
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-a13nNlTLpG4s9DEqkhUdxDJRAp9L+OnnPbRXafbvBCo=",
837
+ "hash": "sha256-xRw/+Q0xTn1kYsE6nXsqd3DUoiZOzocvU7tivvgtQfQ=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: PVMqIJP0 */
1
+ /* Manifest version: spx46FdE */
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