@mindexec/cli 0.2.302 → 0.2.303

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.302",
3
+ "version": "0.2.303",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -92,7 +92,6 @@ body.mind-map-scroll-locked {
92
92
  -webkit-font-smoothing: antialiased;
93
93
  -moz-osx-font-smoothing: grayscale;
94
94
  /* 서브픽셀 정렬로 흐림 방지 */
95
- transform: translateZ(0);
96
95
  }
97
96
 
98
97
  .css3d-resolution-wrapper > .map-node,
@@ -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-render-stability-v763';
8
+ const MINDMAP_CORE_BUILD_ID = '20260621-render-surface-v764';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -3106,6 +3106,38 @@
3106
3106
  ]);
3107
3107
  }
3108
3108
 
3109
+ function collectNodeFrameDebugVisibleGlRenderables(entry) {
3110
+ const root = entry?.glObject || null;
3111
+ if (!root?.traverse) {
3112
+ return [];
3113
+ }
3114
+
3115
+ const renderables = [];
3116
+ root.traverse(child => {
3117
+ if (!child || child === root || child.visible === false) return;
3118
+
3119
+ const isRenderable =
3120
+ child.isMesh === true ||
3121
+ child.isLine === true ||
3122
+ child.isLineSegments === true ||
3123
+ child.isSprite === true ||
3124
+ child.isPoints === true;
3125
+ if (!isRenderable) return;
3126
+
3127
+ if (child === entry?.glowMesh || String(child.name || '') === 'glow') {
3128
+ return;
3129
+ }
3130
+
3131
+ renderables.push({
3132
+ name: String(child.name || child.type || 'renderable'),
3133
+ type: String(child.type || ''),
3134
+ renderOrder: Number(child.renderOrder || 0)
3135
+ });
3136
+ });
3137
+
3138
+ return renderables;
3139
+ }
3140
+
3109
3141
  function getNodeFrameDebugOverlayRects(module, nodeId) {
3110
3142
  const normalizedId = normalizeNodeFrameDebugId(nodeId);
3111
3143
  const cards = module?._textOverlayV2State?.cards || null;
@@ -3205,6 +3237,7 @@
3205
3237
  const mediaContentRect = mediaLayout.contentRect;
3206
3238
  const mediaGutterRects = Array.isArray(mediaLayout.gutterRects) ? mediaLayout.gutterRects : [];
3207
3239
  const overlayRects = getNodeFrameDebugOverlayRects(module, nodeId);
3240
+ const visibleGlRenderables = collectNodeFrameDebugVisibleGlRenderables(entry);
3208
3241
  const unionRect = unionNodeFrameDebugRects([
3209
3242
  modelRect,
3210
3243
  bodyRect,
@@ -3257,6 +3290,12 @@
3257
3290
  && wrapperElement?.style?.display !== 'none',
3258
3291
  glVisible: entry.glObject ? entry.glObject.visible !== false : false,
3259
3292
  bodyVisible: entry.bodyMesh ? entry.bodyMesh.visible !== false : false,
3293
+ cssVisibleWithGlRenderableOverlap: entry.currentType === 'CSS'
3294
+ && entry.cssObject?.visible !== false
3295
+ && wrapperElement?.style?.display !== 'none'
3296
+ && visibleGlRenderables.length > 0,
3297
+ visibleGlRenderableCount: visibleGlRenderables.length,
3298
+ visibleGlRenderableNames: visibleGlRenderables.slice(0, 8).map(item => item.name),
3260
3299
  cssZIndex: String(wrapperElement?.style?.zIndex || ''),
3261
3300
  glRenderOrder: Number(entry.bodyMesh?.renderOrder ?? entry.glObject?.renderOrder ?? 0)
3262
3301
  });
@@ -15,7 +15,7 @@
15
15
  const CSS_IMAGE_PROMOTION_BUDGET_MS = 4;
16
16
  const CSS_IMAGE_BLOB_CACHE_LIMIT = 160;
17
17
  const CSS_IMAGE_DISPLAY_MAX_CONCURRENCY = 8;
18
- const CSS3D_TEXT_NODE_RESOLUTION_SCALE = 2.0;
18
+ const CSS3D_TEXT_NODE_RESOLUTION_SCALE = 3.0;
19
19
  const CSS3D_MEDIA_NODE_RESOLUTION_SCALE = 1.0;
20
20
  const LOOPBACK_ASSET_URL_REGEX = /^http:\/\/(?:127(?:\.\d{1,3}){3}|localhost|\[::1\])(?::\d+)?\/assets\//i;
21
21
  let _cssImagePreviewHoldUntil = 0;
@@ -51,7 +51,7 @@
51
51
  // ▲▲▲ [Usage] ▲▲▲
52
52
 
53
53
  // Procedural line rendering settings
54
- const LOD_RENDERER_BUILD_ID = '20260621-render-stability-v763';
54
+ const LOD_RENDERER_BUILD_ID = '20260621-render-surface-v764';
55
55
  const DirtyKind = Object.freeze({
56
56
  ResidentFullRebuild: 'resident-full-rebuild',
57
57
  ResidentPatch: 'resident-patch',
@@ -2758,6 +2758,97 @@
2758
2758
  // glow는 mind-map-core.js에서 카메라 거리 기반으로 관리
2759
2759
  }
2760
2760
 
2761
+ _isCssModePreservedGlRenderable(entry, child) {
2762
+ if (!child) return false;
2763
+ if (child === entry?.glowMesh || String(child.name || '') === 'glow') {
2764
+ return true;
2765
+ }
2766
+
2767
+ return child.userData?.mindCanvasPreserveInCssMode === true;
2768
+ }
2769
+
2770
+ _setCssModeGlRenderablesHidden(entry, hidden, options = {}) {
2771
+ if (!entry?.glObject) return 0;
2772
+
2773
+ this._ensureNodePartCache(entry);
2774
+
2775
+ const preserveBody = options?.preserveBody === true;
2776
+ const markerKey = 'mindCanvasCssModeHidden';
2777
+ let changedCount = 0;
2778
+
2779
+ entry.glObject.traverse?.(child => {
2780
+ if (!child || child === entry.glObject) return;
2781
+
2782
+ const isRenderable =
2783
+ child.isMesh === true ||
2784
+ child.isLine === true ||
2785
+ child.isLineSegments === true ||
2786
+ child.isSprite === true ||
2787
+ child.isPoints === true;
2788
+ if (!isRenderable) return;
2789
+
2790
+ child.userData ||= {};
2791
+
2792
+ if (child === entry.bodyMesh && preserveBody) {
2793
+ if (hidden === true) {
2794
+ if (child.userData[markerKey] === true) {
2795
+ delete child.userData[markerKey];
2796
+ }
2797
+ if (child.visible !== true) {
2798
+ child.visible = true;
2799
+ changedCount++;
2800
+ }
2801
+ }
2802
+ return;
2803
+ }
2804
+
2805
+ if (this._isCssModePreservedGlRenderable(entry, child)) {
2806
+ return;
2807
+ }
2808
+
2809
+ if (hidden === true) {
2810
+ if (child.visible !== false) {
2811
+ child.userData[markerKey] = true;
2812
+ child.visible = false;
2813
+ changedCount++;
2814
+ }
2815
+ return;
2816
+ }
2817
+
2818
+ if (child.userData[markerKey] === true) {
2819
+ delete child.userData[markerKey];
2820
+ if (child.visible !== true) {
2821
+ child.visible = true;
2822
+ changedCount++;
2823
+ }
2824
+ }
2825
+ });
2826
+
2827
+ return changedCount;
2828
+ }
2829
+
2830
+ _restoreCssModeGlRenderables(entry) {
2831
+ this._setCssModeGlRenderablesHidden(entry, false);
2832
+ }
2833
+
2834
+ _hideGlBodyOnly(entry, options = {}) {
2835
+ if (!entry?.glObject) return;
2836
+
2837
+ this._ensureNodePartCache(entry);
2838
+ this._setCssModeGlRenderablesHidden(entry, true, options);
2839
+
2840
+ if (ENABLE_WEBGL_GLOW !== true) {
2841
+ entry.glObject.visible = false;
2842
+ return;
2843
+ }
2844
+
2845
+ entry.glObject.visible = true;
2846
+ const body = entry.bodyMesh || null;
2847
+ const tail = entry.tailMesh || null;
2848
+ if (body && options?.preserveBody !== true) body.visible = false;
2849
+ if (tail) tail.visible = false;
2850
+ }
2851
+
2761
2852
  _restoreFullResMotionOptimizedNode(entry, lodBand = this._currentLodBand) {
2762
2853
  if (!entry?.glObject) return;
2763
2854
 
@@ -4764,6 +4855,17 @@
4764
4855
  child.scale?.setScalar?.(1.0);
4765
4856
  }
4766
4857
  });
4858
+ {
4859
+ const isImageNode = getNodeContentType(model) === 'image';
4860
+ const preserveImageBody =
4861
+ isImageNode &&
4862
+ entry.bodyMesh?.visible === true &&
4863
+ entry.model?._showImageBodyInCssMode === true;
4864
+ this._hideGlBodyOnly(entry, { preserveBody: preserveImageBody });
4865
+ if (isImageNode) {
4866
+ this._setImageMidDecorationVisibility(entry, false);
4867
+ }
4868
+ }
4767
4869
  }
4768
4870
  // ▲▲▲ [Fix] ▲▲▲
4769
4871
 
@@ -4812,6 +4914,7 @@
4812
4914
  // Near 모드(LOD Off)일 때만 GL Body를 복구합니다.
4813
4915
  if (entry.glObject && (!this.isInLODMode || entry.model?.contentType === 'image' || shouldForceMediaGlFallback)) {
4814
4916
  this._ensureNodePartCache(entry);
4917
+ this._restoreCssModeGlRenderables(entry);
4815
4918
  entry.glObject.visible = true;
4816
4919
  const body = entry.bodyMesh || null;
4817
4920
  const tail = entry.tailMesh || null;
@@ -4909,6 +5012,7 @@
4909
5012
  child.visible = false;
4910
5013
  }
4911
5014
  });
5015
+ this._hideGlBodyOnly(entry);
4912
5016
  }
4913
5017
  }
4914
5018
 
@@ -9526,6 +9630,7 @@
9526
9630
 
9527
9631
  if (entry.glObject) {
9528
9632
  this._ensureNodePartCache(entry);
9633
+ this._restoreCssModeGlRenderables(entry);
9529
9634
  entry.glObject.visible = true;
9530
9635
  const body = entry.bodyMesh || null;
9531
9636
  const tail = entry.tailMesh || null;
@@ -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-render-stability-v763" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260621-render-stability-v763" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260621-render-surface-v764" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260621-render-surface-v764" />
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-render-stability-v763';
582
+ const scriptVersion = '20260621-render-surface-v764';
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": "s6vAMMod",
2
+ "version": "ruCzPCdj",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -42,7 +42,7 @@
42
42
  "url": "_content/MindExecution.Shared/css/app.css"
43
43
  },
44
44
  {
45
- "hash": "sha256-vVQG8dZd8XPd5lEd2meBWtET9S2XmSjWYfRG4FlMdIU=",
45
+ "hash": "sha256-fBZF6kWiDPt1sGCsO142TDnkhyhEpqsEyhsor/tlD7s=",
46
46
  "url": "_content/MindExecution.Shared/css/mind-map-overrides.css"
47
47
  },
48
48
  {
@@ -78,7 +78,7 @@
78
78
  "url": "_content/MindExecution.Shared/js/marked.min.js"
79
79
  },
80
80
  {
81
- "hash": "sha256-MmV3LFXO7RU4wz52DZSBkgbMKUyqyGwR/c1J9zzdLgY=",
81
+ "hash": "sha256-HKwYME1RgiPDf9/sqJM9cACT6oNp0T289ABb6yhj2Do=",
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-ET3Xg9eNPJjBlAfUFDjw1r6BtKYdEqkoxyjAo+z3rEE=",
89
+ "hash": "sha256-NIcvifXg16PDsJNbK9ML9ulTLc1AythfZn++dITG33s=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -114,7 +114,7 @@
114
114
  "url": "_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js"
115
115
  },
116
116
  {
117
- "hash": "sha256-/0kJmm1KxHIb6qGeLON8gCM3BkPWF1xOXObszL76GCo=",
117
+ "hash": "sha256-rfWvg1M/ej67E8jHQnhft3J1kl+26xCAih2xbhjdMFk=",
118
118
  "url": "_content/MindExecution.Shared/js/mind-map-lod-renderer.js"
119
119
  },
120
120
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-mu0eIN8/qCTH6MtYeCSdmg14fMn6qGbY5pWQIxx+9BY=",
837
+ "hash": "sha256-uCxwMt+KFk4zlQHx+qaZ17q6j5sRS3XOFt7RqN1OkG8=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: s6vAMMod */
1
+ /* Manifest version: ruCzPCdj */
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