@mindexec/cli 0.2.478 → 0.2.480

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.
Files changed (146) hide show
  1. package/README.md +323 -323
  2. package/codex-model-catalog.js +202 -202
  3. package/codex-runtime.js +1608 -1608
  4. package/desktop-workspace-state.cjs +120 -120
  5. package/electron/main.cjs +517 -517
  6. package/electron/preload.cjs +17 -17
  7. package/electron/recurring-update-owner-smoke.mjs +55 -55
  8. package/electron/recurring-update-owner.cjs +97 -97
  9. package/electron/source-smoke.mjs +108 -108
  10. package/electron/update-feed-resolver.cjs +79 -79
  11. package/electron/update-feed.json +10 -10
  12. package/electron/update-manager-smoke.mjs +146 -146
  13. package/electron/update-manager.cjs +297 -297
  14. package/electron/windows-package-smoke.mjs +156 -156
  15. package/launch-bridge.cjs +236 -236
  16. package/lzo1x.js +110 -110
  17. package/mode4-atlas-worker.js +440 -440
  18. package/mode4-atlas.js +130 -130
  19. package/package.json +1 -1
  20. package/port-guard.cjs +285 -285
  21. package/remote-fast/osx-arm64/MacScreenCaptureKitH264.swift +339 -339
  22. package/remote-fast/osx-arm64/MacSystemAudioCapture.swift +214 -214
  23. package/remote-fast/osx-arm64/UnixRawCaptureHelper.mjs +80 -80
  24. package/remote-fast/osx-arm64/livedesk-raw-capture-resampler.mjs +73 -73
  25. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  26. package/remote-fast/osx-x64/MacScreenCaptureKitH264.swift +339 -339
  27. package/remote-fast/osx-x64/MacSystemAudioCapture.swift +214 -214
  28. package/remote-fast/osx-x64/UnixRawCaptureHelper.mjs +80 -80
  29. package/remote-fast/osx-x64/livedesk-raw-capture-resampler.mjs +73 -73
  30. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  31. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  32. package/remote-hub.js +3698 -3698
  33. package/scripts/auth-session-smoke.mjs +262 -262
  34. package/scripts/board-render-ownership-smoke.mjs +85 -85
  35. package/scripts/codex-model-catalog-smoke.mjs +150 -150
  36. package/scripts/codex-runtime-home-smoke.mjs +58 -58
  37. package/scripts/codex-sdk-image-live-smoke.mjs +43 -43
  38. package/scripts/codex-sdk-image-runtime-smoke.mjs +122 -122
  39. package/scripts/codex-sdk-runtime-smoke.mjs +89 -89
  40. package/scripts/desktop-update-publisher-smoke.mjs +89 -89
  41. package/scripts/desktop-update-worker-smoke.mjs +72 -72
  42. package/scripts/desktop-workspace-state-smoke.mjs +81 -81
  43. package/scripts/drive-installed-update-smoke.mjs +67 -67
  44. package/scripts/npm-fresh-install-smoke.mjs +216 -216
  45. package/scripts/publish-mindexec-desktop-updates.mjs +224 -224
  46. package/scripts/remote-agent-managed-smoke.mjs +318 -318
  47. package/scripts/remote-agent-package-smoke.mjs +64 -64
  48. package/scripts/remote-agent-ws-smoke.mjs +269 -269
  49. package/scripts/remote-fast-live-rate-smoke.mjs +343 -343
  50. package/scripts/remote-fast-mdm-browser-smoke.mjs +453 -453
  51. package/scripts/remote-fleet-render-smoke.mjs +1350 -1350
  52. package/scripts/remote-frame-ws-smoke.mjs +234 -234
  53. package/scripts/remote-http-smoke.mjs +592 -592
  54. package/scripts/remote-hub-identity-smoke.mjs +146 -146
  55. package/scripts/remote-hub-scale-smoke.mjs +124 -124
  56. package/scripts/remote-hub-smoke.mjs +699 -699
  57. package/scripts/remote-input-ws-smoke.mjs +263 -263
  58. package/scripts/remote-registry-follower-smoke.mjs +815 -815
  59. package/scripts/setup-tree-sitter-grammars.mjs +59 -59
  60. package/server.js +7510 -7510
  61. package/start-bridge.bat +32 -32
  62. package/start-bridge.sh +81 -81
  63. package/tree-sitter-grammars/README.md +18 -0
  64. package/tree-sitter-grammars/tree-sitter-c_sharp.wasm +0 -0
  65. package/tree-sitter-grammars/tree-sitter-go.wasm +0 -0
  66. package/tree-sitter-grammars/tree-sitter-java.wasm +0 -0
  67. package/tree-sitter-grammars/tree-sitter-javascript.wasm +0 -0
  68. package/tree-sitter-grammars/tree-sitter-python.wasm +0 -0
  69. package/tree-sitter-grammars/tree-sitter-rust.wasm +0 -0
  70. package/tree-sitter-grammars/tree-sitter-tsx.wasm +0 -0
  71. package/tree-sitter-grammars/tree-sitter-typescript.wasm +0 -0
  72. package/wwwroot/_content/MindExecution.Plugins.Admin/css/admin-dashboard.css +546 -546
  73. package/wwwroot/_content/MindExecution.Plugins.Directory/background.png +0 -0
  74. package/wwwroot/_content/MindExecution.Plugins.YouTube/css/youtube-search.css +251 -251
  75. package/wwwroot/_content/MindExecution.Shared/css/mind-map-overrides.css +3789 -3789
  76. package/wwwroot/_content/MindExecution.Shared/fonts/NotoSansKR-Bold.ttf +0 -0
  77. package/wwwroot/_content/MindExecution.Shared/fonts/NotoSansKR-Regular.ttf +0 -0
  78. package/wwwroot/_content/MindExecution.Shared/js/agent-visualization.js +27 -27
  79. package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +1449 -1449
  80. package/wwwroot/_content/MindExecution.Shared/js/code-master.js +8316 -8316
  81. package/wwwroot/_content/MindExecution.Shared/js/file-system-helper.js +338 -338
  82. package/wwwroot/_content/MindExecution.Shared/js/marked.min.js +69 -69
  83. package/wwwroot/_content/MindExecution.Shared/js/mind-map-animated-image-preview.js +270 -270
  84. package/wwwroot/_content/MindExecution.Shared/js/mind-map-automation-edge-motion.js +170 -170
  85. package/wwwroot/_content/MindExecution.Shared/js/mind-map-board-render-ownership.js +81 -81
  86. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +10528 -10506
  87. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js.backup +1059 -0
  88. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-hotpath.js +902 -902
  89. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +24637 -24637
  90. package/wwwroot/_content/MindExecution.Shared/js/mind-map-dev-guards.js +325 -325
  91. package/wwwroot/_content/MindExecution.Shared/js/mind-map-dnd.js +1491 -1491
  92. package/wwwroot/_content/MindExecution.Shared/js/mind-map-dnd.js.bak +434 -0
  93. package/wwwroot/_content/MindExecution.Shared/js/mind-map-glow-shader.js +70 -70
  94. package/wwwroot/_content/MindExecution.Shared/js/mind-map-image-policy.js +218 -218
  95. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +7081 -7087
  96. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js +160 -160
  97. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +9960 -9958
  98. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-video-placeholder.js +107 -107
  99. package/wwwroot/_content/MindExecution.Shared/js/mind-map-logic-workers.js +1004 -1004
  100. package/wwwroot/_content/MindExecution.Shared/js/mind-map-menu-manager.js +1351 -1351
  101. package/wwwroot/_content/MindExecution.Shared/js/mind-map-multi-select.js +865 -865
  102. package/wwwroot/_content/MindExecution.Shared/js/mind-map-node-search-worker.js +554 -554
  103. package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +4771 -4744
  104. package/wwwroot/_content/MindExecution.Shared/js/mind-map-normal-boundary-optimizer.js +624 -624
  105. package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js +241 -241
  106. package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js.backup +372 -0
  107. package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +2290 -2290
  108. package/wwwroot/_content/MindExecution.Shared/js/mind-map-remote-codecs.js +202 -202
  109. package/wwwroot/_content/MindExecution.Shared/js/mind-map-render-plan.js +1971 -1971
  110. package/wwwroot/_content/MindExecution.Shared/js/mind-map-text-lod-system.js +93 -93
  111. package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js +2391 -2391
  112. package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js.backup +1258 -0
  113. package/wwwroot/_content/MindExecution.Shared/js/mind-map-video-playback-controls.js +95 -95
  114. package/wwwroot/_content/MindExecution.Shared/js/mind-map-visibility-worker.js +895 -895
  115. package/wwwroot/_content/MindExecution.Shared/js/mindmap-toolbar.js +636 -636
  116. package/wwwroot/_content/MindExecution.Shared/js/native-drop-handler.js +45 -45
  117. package/wwwroot/_content/MindExecution.Shared/js/plan-master.js +117 -117
  118. package/wwwroot/_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js +114 -114
  119. package/wwwroot/_content/MindExecution.Shared/js/texture-worker-manager.js +10 -10
  120. package/wwwroot/_content/MindExecution.Shared/js/three.min.js +6 -6
  121. package/wwwroot/_content/MindExecution.Shared/js/token-manager.js +7 -7
  122. package/wwwroot/_content/MindExecution.Shared/js/troika-bundle.js +6 -6
  123. package/wwwroot/_content/MindExecution.Shared/js/troika-bundle.js.map +2 -2
  124. package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/css/all.min.css +8 -8
  125. package/wwwroot/_content/MindExecution.Shared/models/vocab.txt +30522 -30522
  126. package/wwwroot/_framework/{Google.Protobuf.33g2gb5is0.dll → Google.Protobuf.9h59ukbel7.dll} +0 -0
  127. package/wwwroot/_framework/{MindExecution.Core.z100xo4mg0.dll → MindExecution.Core.gnj3fo0pr7.dll} +0 -0
  128. package/wwwroot/_framework/{MindExecution.Kernel.i9cldrx8yc.dll → MindExecution.Kernel.1qygzf8o02.dll} +0 -0
  129. package/wwwroot/_framework/{MindExecution.Plugins.Admin.48lzqddb0a.dll → MindExecution.Plugins.Admin.n3uxh144wo.dll} +0 -0
  130. package/wwwroot/_framework/{MindExecution.Plugins.Business.7m8u1q142p.dll → MindExecution.Plugins.Business.vl5dximn25.dll} +0 -0
  131. package/wwwroot/_framework/{MindExecution.Plugins.Concept.cl5wmr53od.dll → MindExecution.Plugins.Concept.rutru9qeoi.dll} +0 -0
  132. package/wwwroot/_framework/{MindExecution.Plugins.Directory.slipi39041.dll → MindExecution.Plugins.Directory.fqbmq85het.dll} +0 -0
  133. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.qfge05l671.dll → MindExecution.Plugins.PlanMaster.ko11cc9pll.dll} +0 -0
  134. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.tn7v29ut77.dll → MindExecution.Plugins.YouTube.mt39q0to2j.dll} +0 -0
  135. package/wwwroot/_framework/MindExecution.Shared.umgls362or.dll +0 -0
  136. package/wwwroot/_framework/{MindExecution.Web.rwawrxxk38.dll → MindExecution.Web.1dwoarj2hg.dll} +0 -0
  137. package/wwwroot/_framework/{System.Collections.23yxgetbju.dll → System.Collections.zyvbaq6mpd.dll} +0 -0
  138. package/wwwroot/_framework/blazor.boot.json +25 -25
  139. package/wwwroot/_headers +40 -40
  140. package/wwwroot/_redirects +1 -1
  141. package/wwwroot/index.html +772 -772
  142. package/wwwroot/js/marketing-tool.js +180 -180
  143. package/wwwroot/manifest.webmanifest +23 -23
  144. package/wwwroot/service-worker-assets.js +109 -81
  145. package/wwwroot/service-worker.js +33 -33
  146. package/wwwroot/_framework/MindExecution.Shared.rjqlf0umjn.dll +0 -0
@@ -3,9 +3,9 @@
3
3
  (function () {
4
4
  'use strict';
5
5
 
6
- // LOD 설정 - 카메라 Z 기반
7
- const CAMERA_Z_THRESHOLD = 4000; // z < 4000이면 고해상도, 이상이면 저해상도
8
- const ENABLE_WEBGL_GLOW = false;
6
+ // LOD 설정 - 카메라 Z 기반
7
+ const CAMERA_Z_THRESHOLD = 4000; // z < 4000이면 고해상도, 이상이면 저해상도
8
+ const ENABLE_WEBGL_GLOW = false;
9
9
 
10
10
  const QUALITY_SCALES = {
11
11
  HIGH: 1.0,
@@ -19,21 +19,21 @@
19
19
 
20
20
  // 업데이트 큐 (프레임당 여러 개 처리 가능)
21
21
  const updateQueue = [];
22
- let isProcessing = false;
23
- let module = null;
24
- let lastCameraZ = null;
25
- let lastDesiredLevel = null;
26
- function isDocumentHidden() {
27
- return typeof document !== 'undefined' && document.visibilityState === 'hidden';
28
- }
29
-
30
- function scheduleNonVisualFrame(callback, hiddenDelay = 16) {
31
- if (typeof requestAnimationFrame === 'function' && !isDocumentHidden()) {
32
- return requestAnimationFrame(callback);
33
- }
34
-
35
- return setTimeout(() => callback(typeof performance !== 'undefined' ? performance.now() : Date.now()), hiddenDelay);
36
- }
22
+ let isProcessing = false;
23
+ let module = null;
24
+ let lastCameraZ = null;
25
+ let lastDesiredLevel = null;
26
+ function isDocumentHidden() {
27
+ return typeof document !== 'undefined' && document.visibilityState === 'hidden';
28
+ }
29
+
30
+ function scheduleNonVisualFrame(callback, hiddenDelay = 16) {
31
+ if (typeof requestAnimationFrame === 'function' && !isDocumentHidden()) {
32
+ return requestAnimationFrame(callback);
33
+ }
34
+
35
+ return setTimeout(() => callback(typeof performance !== 'undefined' ? performance.now() : Date.now()), hiddenDelay);
36
+ }
37
37
 
38
38
  // ▼▼▼ [Perf] Yield heavy work to idle time ▼▼▼
39
39
  function yieldToIdle() {
@@ -46,26 +46,26 @@
46
46
  });
47
47
  }
48
48
 
49
- function deferDispose(tex) {
50
- if (!tex || typeof tex.dispose !== 'function') return;
51
- if (typeof requestIdleCallback === 'function') {
52
- requestIdleCallback(() => { try { tex.dispose(); } catch { } });
53
- } else {
54
- setTimeout(() => { try { tex.dispose(); } catch { } }, 0);
55
- }
56
- }
57
-
58
- function removeGlowMesh(group) {
59
- if (!group?.getObjectByName) return null;
60
- const glowMesh = group.getObjectByName('glow');
61
- if (!glowMesh) return null;
62
-
63
- group.remove(glowMesh);
64
- deferDispose(glowMesh.geometry);
65
- deferDispose(glowMesh.material);
66
- return null;
67
- }
68
- // ▲▲▲ [Perf] ▲▲▲
49
+ function deferDispose(tex) {
50
+ if (!tex || typeof tex.dispose !== 'function') return;
51
+ if (typeof requestIdleCallback === 'function') {
52
+ requestIdleCallback(() => { try { tex.dispose(); } catch { } });
53
+ } else {
54
+ setTimeout(() => { try { tex.dispose(); } catch { } }, 0);
55
+ }
56
+ }
57
+
58
+ function removeGlowMesh(group) {
59
+ if (!group?.getObjectByName) return null;
60
+ const glowMesh = group.getObjectByName('glow');
61
+ if (!glowMesh) return null;
62
+
63
+ group.remove(glowMesh);
64
+ deferDispose(glowMesh.geometry);
65
+ deferDispose(glowMesh.material);
66
+ return null;
67
+ }
68
+ // ▲▲▲ [Perf] ▲▲▲
69
69
 
70
70
  /**
71
71
  * LOD 시스템 초기화
@@ -137,18 +137,18 @@
137
137
  lastDesiredLevel = desiredLevel;
138
138
  lastCheckTime = now;
139
139
 
140
- if (ENABLE_WEBGL_GLOW) {
141
- // ★ 모든 노드의 glow 가시성을 카메라 거리에 따라 일괄 업데이트
142
- const showGlow = desiredLevel === 'HIGH';
143
- module.nodeObjectsById.forEach((nodeEntry) => {
144
- const glowMesh = nodeEntry.glObject?.getObjectByName('glow');
145
- if (glowMesh && glowMesh.visible !== showGlow) {
146
- glowMesh.visible = showGlow;
147
- }
148
- });
149
- } else {
150
- module.nodeObjectsById.forEach((nodeEntry) => removeGlowMesh(nodeEntry.glObject));
151
- }
140
+ if (ENABLE_WEBGL_GLOW) {
141
+ // ★ 모든 노드의 glow 가시성을 카메라 거리에 따라 일괄 업데이트
142
+ const showGlow = desiredLevel === 'HIGH';
143
+ module.nodeObjectsById.forEach((nodeEntry) => {
144
+ const glowMesh = nodeEntry.glObject?.getObjectByName('glow');
145
+ if (glowMesh && glowMesh.visible !== showGlow) {
146
+ glowMesh.visible = showGlow;
147
+ }
148
+ });
149
+ } else {
150
+ module.nodeObjectsById.forEach((nodeEntry) => removeGlowMesh(nodeEntry.glObject));
151
+ }
152
152
 
153
153
  // ★ [Perf] Frustum 생성 (한 번만 생성해서 재사용)
154
154
  const frustum = new THREE.Frustum();
@@ -160,9 +160,9 @@
160
160
  module.nodeObjectsById.forEach((nodeEntry, nodeId) => {
161
161
  const model = nodeEntry.model;
162
162
  // ▼▼▼ [Fix] markdown, image 타입도 포함 ▼▼▼
163
- if (!model || (model.contentType !== 'text' && model.contentType !== 'note' && model.contentType !== 'memo' && model.contentType !== 'markdown' && model.contentType !== 'image')) {
164
- return;
165
- }
163
+ if (!model || (model.contentType !== 'text' && model.contentType !== 'note' && model.contentType !== 'memo' && model.contentType !== 'markdown' && model.contentType !== 'image')) {
164
+ return;
165
+ }
166
166
  // ▲▲▲ [Fix] ▲▲▲
167
167
 
168
168
  const currentLevel = nodeEntry.glObject?.userData?.lodLevel;
@@ -178,10 +178,10 @@
178
178
  // ★ [Fix] HIGH 모드에서 CSS3D 지원 노드는 화면 밖이라도 LOW(WebGL)로 내리지 않고 HIGH(CSS3D) 유지
179
179
  // 이렇게 해야 화면 안으로 들어올 때 WebGL -> CSS3D 전환 깜빡임이 없고, 사용자가 원하는 "무조건 CSS3D"가 됨.
180
180
  // (성능 주의: DOM 요소가 많아질 수 있음)
181
- const supportsCss3d = model.contentType === 'text' ||
182
- model.contentType === 'note' ||
183
- model.contentType === 'memo' ||
184
- model.contentType === 'markdown';
181
+ const supportsCss3d = model.contentType === 'text' ||
182
+ model.contentType === 'note' ||
183
+ model.contentType === 'memo' ||
184
+ model.contentType === 'markdown';
185
185
  if (desiredLevel === 'HIGH' && supportsCss3d) {
186
186
  targetLevel = 'HIGH';
187
187
  } else {
@@ -218,10 +218,10 @@
218
218
 
219
219
  // ★ [Safety] CSS3D 모드(HIGH)라면 WebGL Body/Tail 숨김 강제 (외부 간섭 방지)
220
220
  // 다른 로직(선택, 인터랙션 등)에서 실수로 body.visible = true로 되돌리는 경우를 방지
221
- const supportsCss3d = model.contentType === 'text' ||
222
- model.contentType === 'note' ||
223
- model.contentType === 'memo' ||
224
- model.contentType === 'markdown';
221
+ const supportsCss3d = model.contentType === 'text' ||
222
+ model.contentType === 'note' ||
223
+ model.contentType === 'memo' ||
224
+ model.contentType === 'markdown';
225
225
  if (supportsCss3d && targetLevel === 'HIGH' && nodeEntry.currentType === 'CSS') {
226
226
  const body = nodeEntry.glObject?.getObjectByName('body');
227
227
  if (body && body.visible) body.visible = false;
@@ -265,11 +265,11 @@
265
265
 
266
266
  isProcessing = false;
267
267
 
268
- // 남은 작업은 다음 프레임에 처리
269
- if (updateQueue.length > 0) {
270
- scheduleNonVisualFrame(() => processQueue());
271
- }
272
- }
268
+ // 남은 작업은 다음 프레임에 처리
269
+ if (updateQueue.length > 0) {
270
+ scheduleNonVisualFrame(() => processQueue());
271
+ }
272
+ }
273
273
 
274
274
  async function applyTextureQuality(nodeEntry, level) {
275
275
  if (!nodeEntry?.glObject || !nodeEntry?.model) return;
@@ -367,23 +367,23 @@
367
367
 
368
368
  } else if (level === 'HIGH') {
369
369
  // ▼▼▼ [Changed] HIGH 모드: CSS3D 사용 (텍스처 메모리 절약) ▼▼▼
370
- // text, note, markdown 타입만 CSS3D 전환
371
- const supportsCss3d = nodeModel.contentType === 'text' ||
372
- nodeModel.contentType === 'note' ||
373
- nodeModel.contentType === 'memo' ||
374
- nodeModel.contentType === 'markdown';
370
+ // text, note, markdown 타입만 CSS3D 전환
371
+ const supportsCss3d = nodeModel.contentType === 'text' ||
372
+ nodeModel.contentType === 'note' ||
373
+ nodeModel.contentType === 'memo' ||
374
+ nodeModel.contentType === 'markdown';
375
375
 
376
376
  // ▼▼▼ [Fix] cssObject가 없으면 동적 생성 시도 ▼▼▼
377
377
  if (supportsCss3d && !nodeEntry.cssObject) {
378
378
  console.log(`[TextLOD] Creating cssObject for ${nodeId} (contentType=${nodeModel.contentType})`);
379
379
  if (window.MindMapCss3DManager) {
380
- nodeEntry.cssObject = window.MindMapCss3DManager.createCss3dObject(module, nodeModel);
381
- if (nodeEntry.cssObject) {
382
- const glPos = nodeEntry.glObject.position;
383
- nodeEntry.cssObject.position.set(glPos.x, glPos.y, glPos.z);
384
- (module.cssScene || module.scene).add(nodeEntry.cssObject);
385
- console.log(`[TextLOD] ✅ cssObject created and added to scene for ${nodeId}`);
386
- } else {
380
+ nodeEntry.cssObject = window.MindMapCss3DManager.createCss3dObject(module, nodeModel);
381
+ if (nodeEntry.cssObject) {
382
+ const glPos = nodeEntry.glObject.position;
383
+ nodeEntry.cssObject.position.set(glPos.x, glPos.y, glPos.z);
384
+ (module.cssScene || module.scene).add(nodeEntry.cssObject);
385
+ console.log(`[TextLOD] ✅ cssObject created and added to scene for ${nodeId}`);
386
+ } else {
387
387
  console.warn(`[TextLOD] ⚠️ Failed to create cssObject for ${nodeId}`);
388
388
  }
389
389
  }
@@ -508,15 +508,15 @@
508
508
  // ▲▲▲ [Changed] ▲▲▲
509
509
  }
510
510
 
511
- if (ENABLE_WEBGL_GLOW) {
512
- // ★ glow 가시성은 level에 따라 설정
513
- const glowMesh = nodeEntry.glObject.getObjectByName('glow');
514
- if (glowMesh) {
515
- glowMesh.visible = (level === 'HIGH');
516
- }
517
- } else {
518
- removeGlowMesh(nodeEntry.glObject);
519
- }
511
+ if (ENABLE_WEBGL_GLOW) {
512
+ // ★ glow 가시성은 level에 따라 설정
513
+ const glowMesh = nodeEntry.glObject.getObjectByName('glow');
514
+ if (glowMesh) {
515
+ glowMesh.visible = (level === 'HIGH');
516
+ }
517
+ } else {
518
+ removeGlowMesh(nodeEntry.glObject);
519
+ }
520
520
 
521
521
  // LOD 레벨 저장
522
522
  nodeEntry.glObject.userData.lodLevel = level;
@@ -540,8 +540,8 @@
540
540
  if (!module) return;
541
541
 
542
542
  module.nodeObjectsById.forEach((nodeEntry, nodeId) => {
543
- if (nodeEntry.model?.contentType === 'text' || nodeEntry.model?.contentType === 'note' || nodeEntry.model?.contentType === 'memo') {
544
- updateQueue.push({
543
+ if (nodeEntry.model?.contentType === 'text' || nodeEntry.model?.contentType === 'note' || nodeEntry.model?.contentType === 'memo') {
544
+ updateQueue.push({
545
545
  nodeId: nodeId,
546
546
  nodeEntry: nodeEntry,
547
547
  level: level
@@ -570,8 +570,8 @@
570
570
  // ★ [New] Optionally queue for immediate regeneration
571
571
  if (regenerate && module) {
572
572
  const nodeEntry = module.nodeObjectsById.get(nodeId);
573
- if (nodeEntry && (nodeEntry.model?.contentType === 'text' || nodeEntry.model?.contentType === 'note' || nodeEntry.model?.contentType === 'memo')) {
574
- const cameraZ = module.camera?.position?.z || 0;
573
+ if (nodeEntry && (nodeEntry.model?.contentType === 'text' || nodeEntry.model?.contentType === 'note' || nodeEntry.model?.contentType === 'memo')) {
574
+ const cameraZ = module.camera?.position?.z || 0;
575
575
  const desiredLevel = cameraZ < CAMERA_Z_THRESHOLD ? 'HIGH' : 'LOW';
576
576
 
577
577
  // Reset LOD level to force regeneration
@@ -612,8 +612,8 @@
612
612
  }
613
613
 
614
614
  const nodeEntry = module.nodeObjectsById.get(nodeId);
615
- if (nodeEntry && (nodeEntry.model?.contentType === 'text' || nodeEntry.model?.contentType === 'note' || nodeEntry.model?.contentType === 'memo')) {
616
- if (nodeEntry.glObject) {
615
+ if (nodeEntry && (nodeEntry.model?.contentType === 'text' || nodeEntry.model?.contentType === 'note' || nodeEntry.model?.contentType === 'memo')) {
616
+ if (nodeEntry.glObject) {
617
617
  nodeEntry.glObject.userData.lodLevel = null;
618
618
  }
619
619