@mindexec/cli 0.2.316 → 0.2.317

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.316",
3
+ "version": "0.2.317",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -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 = '20260621-mdm-drag-v799';
8
+ const MINDMAP_CORE_BUILD_ID = '20260621-lod-exclusive-v800';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -51,7 +51,7 @@
51
51
  // ▲▲▲ [Usage] ▲▲▲
52
52
 
53
53
  // Procedural line rendering settings
54
- const LOD_RENDERER_BUILD_ID = '20260621-mdm-drag-v799';
54
+ const LOD_RENDERER_BUILD_ID = '20260621-lod-exclusive-v800';
55
55
  const DirtyKind = Object.freeze({
56
56
  ResidentFullRebuild: 'resident-full-rebuild',
57
57
  ResidentPatch: 'resident-patch',
@@ -704,6 +704,10 @@
704
704
  return false;
705
705
  }
706
706
 
707
+ if (isLivePortalCssLodModel(entry?.model)) {
708
+ return false;
709
+ }
710
+
707
711
  const isVisible = entry?.isVisibleInFrustum === true;
708
712
  if (!isVisible) {
709
713
  return false;
@@ -723,6 +727,10 @@
723
727
  return false;
724
728
  }
725
729
 
730
+ if (isLivePortalCssLodModel(entry?.model)) {
731
+ return false;
732
+ }
733
+
726
734
  const isTextLike = isTextLikeModel(entry?.model);
727
735
  if (!isTextLike) {
728
736
  return false;
@@ -2717,6 +2725,44 @@
2717
2725
 
2718
2726
  this._startFullResHandoff(previousBand || this._fullResHandoffPreviousBand || 'MID', 'pending-css', this._fullResPanHandoffMaxMs);
2719
2727
  }
2728
+
2729
+ _collectResidentModeCss3dCleanupIds(nodeObjectsById) {
2730
+ const ids = new Set();
2731
+ if (!nodeObjectsById?.forEach) {
2732
+ return ids;
2733
+ }
2734
+
2735
+ nodeObjectsById.forEach((entry, key) => {
2736
+ if (!entry?.cssObject || isLivePortalCssLodModel(entry?.model)) {
2737
+ return;
2738
+ }
2739
+
2740
+ const element = entry.cssObject.element || null;
2741
+ const isAttached = !!entry.cssObject.parent;
2742
+ const isDisplayed = !!element &&
2743
+ element.style.display !== 'none' &&
2744
+ element.style.visibility !== 'hidden' &&
2745
+ element.style.opacity !== '0';
2746
+ const isVisible = entry.cssObject.visible === true || isAttached || isDisplayed;
2747
+ if (!isVisible) {
2748
+ return;
2749
+ }
2750
+
2751
+ const nodeId = String(
2752
+ entry.model?.id ||
2753
+ entry.model?.Id ||
2754
+ entry.glObject?.userData?.nodeId ||
2755
+ entry.cssObject?.userData?.nodeId ||
2756
+ key ||
2757
+ ''
2758
+ ).trim();
2759
+ if (nodeId) {
2760
+ ids.add(nodeId);
2761
+ }
2762
+ });
2763
+
2764
+ return ids;
2765
+ }
2720
2766
  // ▲▲▲ [New] ▲▲▲
2721
2767
 
2722
2768
  // ═══════════════════════════════════════════════════════════════════════
@@ -5886,6 +5932,10 @@
5886
5932
  for (const nodeId of this._css3dQueuedMap.keys()) {
5887
5933
  cssIdsToHide.add(nodeId);
5888
5934
  }
5935
+ const currentNodeMap = this._module?.nodeObjectsById;
5936
+ for (const nodeId of this._collectResidentModeCss3dCleanupIds(currentNodeMap)) {
5937
+ cssIdsToHide.add(nodeId);
5938
+ }
5889
5939
  this._clearCss3dQueue();
5890
5940
  this._clearCss3dPrewarmQueue();
5891
5941
  this._css3dProcessing = false;
@@ -5894,7 +5944,6 @@
5894
5944
 
5895
5945
  // Hide only CSS3D nodes that were actually on-screen; the LOD cleanup queue
5896
5946
  // catches any stale off-screen DOM without blocking the wheel transition.
5897
- const currentNodeMap = this._module?.nodeObjectsById;
5898
5947
  const visibleIds = this._getNearVisibleIds(module);
5899
5948
  const prioritizedWarm = currentNodeMap && visibleIds
5900
5949
  ? this._getNearVisiblePriority(visibleIds, currentNodeMap, camera)
@@ -5908,6 +5957,7 @@
5908
5957
  const entry = currentNodeMap.get(nodeId);
5909
5958
  if (!entry) continue;
5910
5959
  const model = entry.model;
5960
+ const isLivePortalCss = isLivePortalCssLodModel(model);
5911
5961
  const shouldKeepConsoleProxy = false;
5912
5962
  if (entry.cssObject?.element) {
5913
5963
  this._hideAgentConsoleLodProxy(entry);
@@ -5917,21 +5967,24 @@
5917
5967
  isCssMediaFallbackModel(model) &&
5918
5968
  this._syncCssMediaLodFallback(entry, this._module);
5919
5969
 
5920
- if (!shouldKeepConsoleProxy &&
5970
+ if (!isLivePortalCss &&
5971
+ !shouldKeepConsoleProxy &&
5921
5972
  !shouldKeepCssMediaFallback &&
5922
5973
  entry.cssObject &&
5923
5974
  (entry.cssObject.visible || (entry.cssObject.element && entry.cssObject.element.style.display !== 'none'))) {
5924
5975
  this._hideNodeCss3d(entry);
5925
5976
  }
5926
5977
 
5927
- entry.currentType = 'GL';
5978
+ if (!isLivePortalCss) {
5979
+ entry.currentType = 'GL';
5980
+ }
5928
5981
 
5929
5982
  // Text-like nodes: hide GL body (InstancedMesh renders them)
5930
5983
  const isTextLike = isTextLikeModel(model);
5931
5984
  const contentType = getNodeContentType(model);
5932
5985
  const isImage = isImageLodProxyModel(model);
5933
5986
  const isNodeSelected = isNodeSelectedForLod(nodeId, multiSelectedIds, selectedNodeId);
5934
- if (isTextLike && entry.glObject) {
5987
+ if (!isLivePortalCss && isTextLike && entry.glObject) {
5935
5988
  this._hideTextLodFullVisual(entry);
5936
5989
  } else if (isImage) {
5937
5990
  if (shouldKeepCssMediaFallback) {
@@ -6240,6 +6293,7 @@
6240
6293
  if (!entry) continue;
6241
6294
 
6242
6295
  const model = entry.model;
6296
+ const isLivePortalCss = isLivePortalCssLodModel(model);
6243
6297
  const isTextLike = isTextLikeModel(model);
6244
6298
  const contentType = getNodeContentType(model);
6245
6299
  const isImage = isImageLodProxyModel(model);
@@ -6251,7 +6305,8 @@
6251
6305
  this._syncCssMediaLodFallback(entry, module);
6252
6306
 
6253
6307
  // 1. Ensure CSS3D is hidden
6254
- if (!shouldKeepConsoleProxy &&
6308
+ if (!isLivePortalCss &&
6309
+ !shouldKeepConsoleProxy &&
6255
6310
  !shouldKeepCssMediaFallback &&
6256
6311
  entry.cssObject &&
6257
6312
  (entry.cssObject.visible || (entry.cssObject.element && entry.cssObject.element.style.display !== 'none'))) {
@@ -6260,7 +6315,7 @@
6260
6315
  }
6261
6316
 
6262
6317
  // 2. Ensure GL Body is hidden for text-like nodes (rendered via InstancedMesh)
6263
- if (isTextLike && entry.glObject) {
6318
+ if (!isLivePortalCss && isTextLike && entry.glObject) {
6264
6319
  this._hideTextLodFullVisual(entry);
6265
6320
  } else if (isImage) {
6266
6321
  const isNodeSelected = isNodeSelectedForLod(nodeId, multiSelectedIds, selectedNodeId);
@@ -50,6 +50,34 @@
50
50
  || semanticType === REMOTE_FLEET_DEVICE_SEMANTIC_TYPE;
51
51
  }
52
52
 
53
+ function shouldAttachCss3dOnCreate(module, nodeModel) {
54
+ const lodRenderer = module?.lodRenderer || null;
55
+ if (!lodRenderer) {
56
+ return true;
57
+ }
58
+
59
+ if (isTemplateLauncherNodeModel(nodeModel)) {
60
+ return true;
61
+ }
62
+
63
+ if (lodRenderer.isInLODMode === true) {
64
+ return false;
65
+ }
66
+
67
+ if (lodRenderer.isInLODMode === false) {
68
+ return true;
69
+ }
70
+
71
+ const cameraZ = Number(module?.camera?.position?.z ?? module?.targetZ ?? 0);
72
+ const thresholds = window.LODRenderer?.LOD_THRESHOLDS || null;
73
+ const midThreshold = Number(thresholds?.MID ?? window.LODRenderer?.LOD_THRESHOLD_NEAR ?? 4500);
74
+ if (Number.isFinite(cameraZ) && Number.isFinite(midThreshold) && cameraZ >= midThreshold) {
75
+ return false;
76
+ }
77
+
78
+ return true;
79
+ }
80
+
53
81
  function getNodeMetadata(nodeModel) {
54
82
  return nodeModel?.metadata || nodeModel?.Metadata || null;
55
83
  }
@@ -2677,7 +2705,7 @@
2677
2705
  tailMesh: glObject?.getObjectByName?.('tail') || null
2678
2706
  // ▲▲▲ [Optimization] ▲▲▲
2679
2707
  };
2680
- const isNearMode = module.lodRenderer ? !module.lodRenderer.isInLODMode : true;
2708
+ const shouldAttachCssOnCreate = shouldAttachCss3dOnCreate(module, nodeModel);
2681
2709
 
2682
2710
  // Rich cards use CSS3D in NEAR/NORMAL so wrapper glow/selection stays consistent.
2683
2711
  if (nodeModel.contentType === 'note' || nodeModel.contentType === 'memo' || nodeModel.contentType === 'text' || nodeModel.contentType === 'markdown' || nodeModel.contentType === 'code' || nodeModel.contentType === 'image' || nodeModel.contentType === 'video' || nodeModel.contentType === 'embed' || isTemplateLauncherNode) {
@@ -2699,7 +2727,7 @@
2699
2727
  const glPos = glObject.position;
2700
2728
  // [FIX] Parallax issue fix: Set Z to match glObject (was + 0.2)
2701
2729
  nodeEntry.cssObject.position.set(glPos.x, glPos.y, glPos.z);
2702
- const shouldAttachCss = isNearMode;
2730
+ const shouldAttachCss = shouldAttachCssOnCreate;
2703
2731
  if (shouldAttachCss) {
2704
2732
  (module.cssScene || module.scene).add(nodeEntry.cssObject);
2705
2733
  window.MindMapCss3DManager?.markCssParentRepairNeeded?.(module, nodeModel.id);
@@ -7,8 +7,8 @@
7
7
  <title>MindExec | Business Execution OS for solo builders</title>
8
8
  <meta name="description" content="MindExec is an AI business execution OS for solo builders who want to turn notes, research, assets, and repeatable execution Skills into revenue-producing work." />
9
9
  <base href="/" />
10
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260621-mdm-drag-v799" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260621-mdm-drag-v799" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260621-lod-exclusive-v800" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260621-lod-exclusive-v800" />
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 = '20260621-mdm-drag-v799';
582
+ const scriptVersion = '20260621-lod-exclusive-v800';
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": "SAss2wLl",
2
+ "version": "oFe06nuY",
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-CdH4wPJb4NXehCfojFNuSltl7onaEXZ0efVUwHVr3gE=",
81
+ "hash": "sha256-kRsyfuOJh4F1DMqO7UEaR8JC0rYX0XBU956hNAaClgc=",
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
83
83
  },
84
84
  {
@@ -114,7 +114,7 @@
114
114
  "url": "_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js"
115
115
  },
116
116
  {
117
- "hash": "sha256-NXuJnhvbgnRE3BVR05gYACE8iXaU6rmkON1WGlHtpng=",
117
+ "hash": "sha256-MyAJA8eoHTu39zvVUPc1C0VoGJmZ1MRUCYP38yQT4PU=",
118
118
  "url": "_content/MindExecution.Shared/js/mind-map-lod-renderer.js"
119
119
  },
120
120
  {
@@ -134,7 +134,7 @@
134
134
  "url": "_content/MindExecution.Shared/js/mind-map-node-search-worker.js"
135
135
  },
136
136
  {
137
- "hash": "sha256-ILZvVKP1KjScKg2EAmPNokKNrZCv8do4XE3r1piy988=",
137
+ "hash": "sha256-a7+COeA9L0WsbWhip+nHpv3alTeroB4ihM5VHFFEICE=",
138
138
  "url": "_content/MindExecution.Shared/js/mind-map-nodes.js"
139
139
  },
140
140
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-YR0oSsyb101t+ulom2kgMzFyEzF+3m2rOTXOrSCtUzU=",
837
+ "hash": "sha256-FxDaoGOzdh/4+K/+uj/V7ZbD6MiU5kUM95lgINsadpA=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: SAss2wLl */
1
+ /* Manifest version: oFe06nuY */
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