@mindexec/cli 0.2.403 → 0.2.405

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.403",
3
+ "version": "0.2.405",
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 = '20260627-midfar-border-soft-v835';
8
+ const MINDMAP_CORE_BUILD_ID = '20260628-pan-wheel-resident-defer-v840';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -3165,6 +3165,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3165
3165
  this._lastImmediateCameraFeedbackStatus = null;
3166
3166
  this._immediateCameraFeedbackCount = 0;
3167
3167
  this._immediateCameraFeedbackCss3dCount = 0;
3168
+ this._immediateCameraFeedbackWebglCount = 0;
3168
3169
  this._immediateCameraFeedbackEdgeCount = 0;
3169
3170
  // Match background-themes.js 'XYGrid' size1.
3170
3171
  this.GRID_SIZE = 10;
@@ -4117,6 +4118,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4117
4118
  automationEdges: false,
4118
4119
  motionGrid: false,
4119
4120
  localSnapGrid: false,
4121
+ webgl: false,
4120
4122
  skippedReason: '',
4121
4123
  count: Number(this._immediateCameraFeedbackCount || 0),
4122
4124
  updatedAt: now
@@ -4199,6 +4201,24 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4199
4201
  status.css3dCount = this._immediateCameraFeedbackCss3dCount;
4200
4202
  }
4201
4203
 
4204
+ const canRenderWebglCamera = !!(
4205
+ this.renderer &&
4206
+ this.scene &&
4207
+ flags.enableWebglRender !== false &&
4208
+ this.isLoading !== true &&
4209
+ (this.lodRenderer?.isInLODMode === true || status.css3dCamera !== true)
4210
+ );
4211
+ if (canRenderWebglCamera === true) {
4212
+ try {
4213
+ this.renderer.render(this.scene, this.camera);
4214
+ status.webgl = true;
4215
+ this._immediateCameraFeedbackWebglCount = Number(this._immediateCameraFeedbackWebglCount || 0) + 1;
4216
+ status.webglCount = this._immediateCameraFeedbackWebglCount;
4217
+ } catch (err) {
4218
+ status.webglError = err?.message || String(err || 'unknown');
4219
+ }
4220
+ }
4221
+
4202
4222
  if (this._shouldTouchMotionGridLayerForCameraNavigation?.() === true) {
4203
4223
  status.motionGrid = this._syncMotionGridLayerForCameraNavigation?.() === true;
4204
4224
  }
@@ -5787,6 +5807,15 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5787
5807
  }
5788
5808
  : () => { };
5789
5809
 
5810
+ const lastImmediateCameraFeedbackAtFrameStart = this._lastImmediateCameraFeedbackStatus || null;
5811
+ const lastImmediateCameraFeedbackAgeAtFrameStart =
5812
+ frameStart - Number(lastImmediateCameraFeedbackAtFrameStart?.updatedAt || 0);
5813
+ const hasFreshImmediateCameraFeedbackAtFrameStart = !!(
5814
+ lastImmediateCameraFeedbackAtFrameStart?.used === true &&
5815
+ lastImmediateCameraFeedbackAgeAtFrameStart >= 0 &&
5816
+ lastImmediateCameraFeedbackAgeAtFrameStart <= 120
5817
+ );
5818
+
5790
5819
  // 1. Camera Movement Interpolation
5791
5820
  // ----------------------------------------------------------------
5792
5821
  // ?�▼??[Changed] Time-normalized camera smoothing ?�▼?? // Mouse move events can arrive at an uneven cadence even when rAF is 60fps.
@@ -5804,7 +5833,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5804
5833
 
5805
5834
  // Check delta
5806
5835
  const deltaMove = this.camera.position.distanceToSquared(this._tmpOldCamPos);
5807
- const isCameraMoving = deltaMove > 0.0001;
5836
+ const didCameraPositionChange = deltaMove > 0.0001;
5837
+ const isCameraMoving = didCameraPositionChange || hasFreshImmediateCameraFeedbackAtFrameStart;
5808
5838
  if (isCameraMoving) {
5809
5839
  this._viewStatePersistAfterMotion = true;
5810
5840
  }
@@ -6020,6 +6050,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6020
6050
  const residentBandChanging = isResidentMidFarLodFrame &&
6021
6051
  this.lodRenderer?.willLodBandChange?.(this.camera) === true;
6022
6052
  let canDeferResidentDirtyIdleFrame = false;
6053
+ let canDeferResidentDirtyMotionFrame = false;
6023
6054
  if (isResidentMidFarLodFrame &&
6024
6055
  residentDirty === true &&
6025
6056
  residentBandChanging !== true &&
@@ -6032,9 +6063,20 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6032
6063
  typeof this.lodRenderer?.shouldSkipStableResidentFrame === 'function') {
6033
6064
  canDeferResidentDirtyIdleFrame = this.lodRenderer.shouldSkipStableResidentFrame(this.camera, this) === true;
6034
6065
  }
6066
+ if (isResidentMidFarLodFrame &&
6067
+ residentDirty === true &&
6068
+ residentBandChanging !== true &&
6069
+ (isCameraMoving === true || this.isPanning === true || this.isZooming === true) &&
6070
+ !isNodeInteracting &&
6071
+ !hasNonCameraNavigationForcedUpdate &&
6072
+ !hasPendingNearCssWarmup &&
6073
+ typeof this.lodRenderer?.shouldSkipStableResidentFrame === 'function') {
6074
+ canDeferResidentDirtyMotionFrame = this.lodRenderer.shouldSkipStableResidentFrame(this.camera, this) === true;
6075
+ }
6035
6076
  const residentDirtyRequiresUpdate =
6036
6077
  residentDirty === true &&
6037
- canDeferResidentDirtyIdleFrame !== true;
6078
+ canDeferResidentDirtyIdleFrame !== true &&
6079
+ canDeferResidentDirtyMotionFrame !== true;
6038
6080
  const residentMidFarStable =
6039
6081
  isResidentMidFarLodFrame &&
6040
6082
  residentDirtyRequiresUpdate !== true &&
@@ -6799,14 +6841,9 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6799
6841
 
6800
6842
  _profileSection('webglRender');
6801
6843
  // ?�▼??[FIX] LOD 모드(MID/FAR)?�서??CSS3D ?�더???�출 건너?�기 ?�▼?? // CSS3D가 모두 display:none?�어???�더?��? 813�?객체�??�회?�면???�간 ?�비
6802
- const lastImmediateCameraFeedback = this._lastImmediateCameraFeedbackStatus || null;
6803
- const lastImmediateCameraFeedbackAgeMs = frameStart - Number(lastImmediateCameraFeedback?.updatedAt || 0);
6804
- const hasFreshImmediateCameraFeedback = !!(
6805
- lastImmediateCameraFeedback?.used === true &&
6806
- (this.isPanning === true || this.isZooming === true) &&
6807
- lastImmediateCameraFeedbackAgeMs >= 0 &&
6808
- lastImmediateCameraFeedbackAgeMs <= 120
6809
- );
6844
+ const lastImmediateCameraFeedback = lastImmediateCameraFeedbackAtFrameStart;
6845
+ const lastImmediateCameraFeedbackAgeMs = lastImmediateCameraFeedbackAgeAtFrameStart;
6846
+ const hasFreshImmediateCameraFeedback = hasFreshImmediateCameraFeedbackAtFrameStart;
6810
6847
  const canUseCss3dCameraFastPath = !!(
6811
6848
  this.cssRenderer &&
6812
6849
  typeof this.cssRenderer.renderCamera === 'function' &&
@@ -7054,6 +7091,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7054
7091
  freezeFullRes: shouldFreezeFullResDuringMotion === true,
7055
7092
  residentMidFarStable: residentMidFarStable === true,
7056
7093
  residentDirty: residentDirty === true,
7094
+ residentDirtyDeferredIdle: canDeferResidentDirtyIdleFrame === true,
7095
+ residentDirtyDeferredMotion: canDeferResidentDirtyMotionFrame === true,
7057
7096
  residentBandChanging: residentBandChanging === true,
7058
7097
  viewSyncMode: String(lodUpdateBreakdownThisFrame?.mode || ''),
7059
7098
  lodUpdateCalled: lodUpdateCalledThisFrame === true,
@@ -51,7 +51,7 @@
51
51
  // ▲▲▲ [Usage] ▲▲▲
52
52
 
53
53
  // Procedural line rendering settings
54
- const LOD_RENDERER_BUILD_ID = '20260627-midfar-border-soft-v835';
54
+ const LOD_RENDERER_BUILD_ID = '20260628-pan-wheel-resident-defer-v840';
55
55
  const DirtyKind = Object.freeze({
56
56
  ResidentFullRebuild: 'resident-full-rebuild',
57
57
  ResidentPatch: 'resident-patch',
@@ -6551,14 +6551,24 @@
6551
6551
  // Update line disable flag based on current instance count
6552
6552
  // Full rebuild if dirty, otherwise only update positions if dragging
6553
6553
  _prof('instanceUpdate');
6554
+ let residentFullBuildBlockedThisFrame = false;
6554
6555
  if (this._instancesDirty &&
6555
6556
  this._instancesDirtyReason !== 'line-details' &&
6556
6557
  !this._canRunResidentFullRebuild(this._instancesDirtyReason, lodBand)) {
6557
6558
  this._logBlockedResidentFullRebuild(this._instancesDirtyReason, module, lodBand);
6558
- this._clearInstancesDirty();
6559
+ residentFullBuildBlockedThisFrame = true;
6560
+ this._residentRebuildPending = true;
6561
+ const now = typeof performance !== 'undefined' ? performance.now() : Date.now();
6562
+ this._residentRebuildDeferredUntil = Math.max(
6563
+ Number(this._residentRebuildDeferredUntil || 0),
6564
+ now + LOD_RESIDENT_REBUILD_SETTLE_MS
6565
+ );
6566
+ if (module) {
6567
+ module._forceUpdateFrames = Math.max(Number(module._forceUpdateFrames || 0), 4);
6568
+ }
6559
6569
  }
6560
6570
 
6561
- if (this._instancesDirty) {
6571
+ if (this._instancesDirty && residentFullBuildBlockedThisFrame !== true) {
6562
6572
  perfTime('lodResidentApply', () => {
6563
6573
  const fullBuildReason = String(this._instancesDirtyReason || 'unknown');
6564
6574
  if (module?.isLoading !== true && this.isInLODMode !== true) {
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260628-css3d-only-v839';
582
+ const scriptVersion = '20260628-pan-wheel-resident-defer-v840';
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": "D0Lw/Sy6",
2
+ "version": "XYf0od9b",
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-z9d5HhFqgp3XZPL33ZM+jyoKP1tXbxXu8tJO10XC0gs=",
81
+ "hash": "sha256-wF7sNtiWqtPIT1yTShG5wGJcivHKBmeSGeQb74YmpXY=",
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-jI+OWo3GHQ5BpPt9JpxGTGTa8mzi67ufinIizGeHxSs=",
117
+ "hash": "sha256-g0yoIH7FxuwbhZ9k3ByYUWQFMFq5l4N28u3hcqNurQM=",
118
118
  "url": "_content/MindExecution.Shared/js/mind-map-lod-renderer.js"
119
119
  },
120
120
  {
@@ -826,7 +826,7 @@
826
826
  "url": "icon-512.png"
827
827
  },
828
828
  {
829
- "hash": "sha256-prIQFaS+GGMIB15zcGBrRYbhMP5bfUNG2D+LV6lMCOs=",
829
+ "hash": "sha256-V3WKTP7gwOIAz2U2CHddB9UiDVeemE29Fgo0Ng4Z2EI=",
830
830
  "url": "index.html"
831
831
  },
832
832
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: D0Lw/Sy6 */
1
+ /* Manifest version: XYf0od9b */
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