@mindexec/cli 0.2.401 → 0.2.403

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.401",
3
+ "version": "0.2.403",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -1456,7 +1456,7 @@
1456
1456
  overlayLayoutChanged: moduleInstance._overlayDebugLayoutChanged === true,
1457
1457
  overlayContentChanged: moduleInstance._overlayDebugContentChanged === true,
1458
1458
  overlayForceRefresh: moduleInstance._overlayDebugForceRefresh === true,
1459
- cameraMotionFastPathStatus: null,
1459
+ cameraMotionFastPathStatus: moduleInstance._lastImmediateCameraFeedbackStatus || null,
1460
1460
  metricsSnapshotMs: Number(metricsSnapshotMs.toFixed(2)),
1461
1461
  metricsSnapshotCached: false,
1462
1462
  metricsSnapshotAgeMs: 0,
@@ -3162,6 +3162,10 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3162
3162
  this._ctrlWheelScrollInputTime = 0;
3163
3163
  this._ctrlWheelScrollLastDeltaY = 0;
3164
3164
  this._cameraNavigationOverlayInputTime = 0;
3165
+ this._lastImmediateCameraFeedbackStatus = null;
3166
+ this._immediateCameraFeedbackCount = 0;
3167
+ this._immediateCameraFeedbackCss3dCount = 0;
3168
+ this._immediateCameraFeedbackEdgeCount = 0;
3165
3169
  // Match background-themes.js 'XYGrid' size1.
3166
3170
  this.GRID_SIZE = 10;
3167
3171
  // ?�▲??[Changed] ?�▲??
@@ -4102,6 +4106,115 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4102
4106
  }
4103
4107
  }
4104
4108
 
4109
+ applyImmediateCameraNavigationFeedback(reason = 'camera-navigation-input') {
4110
+ const now = typeof performance !== 'undefined' && typeof performance.now === 'function'
4111
+ ? performance.now()
4112
+ : Date.now();
4113
+ const status = {
4114
+ used: false,
4115
+ reason: String(reason || 'camera-navigation-input'),
4116
+ css3dCamera: false,
4117
+ automationEdges: false,
4118
+ motionGrid: false,
4119
+ localSnapGrid: false,
4120
+ skippedReason: '',
4121
+ count: Number(this._immediateCameraFeedbackCount || 0),
4122
+ updatedAt: now
4123
+ };
4124
+
4125
+ const finish = (skippedReason = '') => {
4126
+ status.skippedReason = skippedReason;
4127
+ this._lastImmediateCameraFeedbackStatus = status;
4128
+ return status.used === true;
4129
+ };
4130
+
4131
+ if (!this.camera || this._animationLoopExecuting === true || this.isLoading === true) {
4132
+ return finish('runtime-busy');
4133
+ }
4134
+
4135
+ const nextX = Number(this.targetX ?? this.camera.position.x);
4136
+ const nextY = Number(this.targetY ?? this.camera.position.y);
4137
+ const nextZ = Number(this.targetZ ?? this.camera.position.z);
4138
+ if (!Number.isFinite(nextX) || !Number.isFinite(nextY) || !Number.isFinite(nextZ)) {
4139
+ return finish('invalid-target');
4140
+ }
4141
+
4142
+ const currentX = Number(this.camera.position.x || 0);
4143
+ const currentY = Number(this.camera.position.y || 0);
4144
+ const currentZ = Number(this.camera.position.z || 0);
4145
+ if (Math.abs(nextX - currentX) < 0.001 &&
4146
+ Math.abs(nextY - currentY) < 0.001 &&
4147
+ Math.abs(nextZ - currentZ) < 0.001) {
4148
+ return finish('unchanged');
4149
+ }
4150
+
4151
+ this.camera.position.set(nextX, nextY, nextZ);
4152
+ this.camera.updateMatrixWorld(true);
4153
+ this._viewStatePersistAfterMotion = true;
4154
+ this._cameraMovingThisFrame = true;
4155
+ this._immediateCameraFeedbackCount = Number(this._immediateCameraFeedbackCount || 0) + 1;
4156
+ status.used = true;
4157
+ status.count = this._immediateCameraFeedbackCount;
4158
+
4159
+ const flags = this.renderDebugFlags || getRenderDebugFlagsSnapshot();
4160
+ const isCss3dEnabled = flags.enableCss3d !== false;
4161
+ const hasFocusedTextOverlay = !!(
4162
+ String(this._textOverlayV2State?.selectionNodeId || '').trim() ||
4163
+ String(this._selectableTextOverlayNodeId || '').trim()
4164
+ );
4165
+ const hasEditingOverlay = !!(
4166
+ String(this._textOverlayV2State?.editing?.nodeId || '').trim() ||
4167
+ String(this._editingOverlayState?.nodeId || '').trim() ||
4168
+ this.isEditingNote === true
4169
+ );
4170
+ const isNodeInteracting = !!(
4171
+ this.isDraggingNode ||
4172
+ this.isDraggingMultipleNodes ||
4173
+ this.isResizing ||
4174
+ this.isScrollbarDragging ||
4175
+ this.isSelecting
4176
+ );
4177
+ const hasCss3dDirtyTransforms = !!(
4178
+ this._cssParentRepairNeeded === true ||
4179
+ this._css3dVisualChangedThisFrame === true ||
4180
+ this._css3dVisualChangedSinceLastRender === true ||
4181
+ (this._cssTransformDirtyIds?.size || 0) > 0
4182
+ );
4183
+ const canRenderCss3dCamera = !!(
4184
+ this.cssRenderer &&
4185
+ typeof this.cssRenderer.renderCamera === 'function' &&
4186
+ isCss3dEnabled === true &&
4187
+ this.lodRenderer?.isInLODMode !== true &&
4188
+ !isNodeInteracting &&
4189
+ !hasFocusedTextOverlay &&
4190
+ !hasEditingOverlay &&
4191
+ !hasCss3dDirtyTransforms &&
4192
+ this.isWindowResizing !== true
4193
+ );
4194
+
4195
+ if (canRenderCss3dCamera === true) {
4196
+ this.cssRenderer.renderCamera(this.camera);
4197
+ this._immediateCameraFeedbackCss3dCount = Number(this._immediateCameraFeedbackCss3dCount || 0) + 1;
4198
+ status.css3dCamera = true;
4199
+ status.css3dCount = this._immediateCameraFeedbackCss3dCount;
4200
+ }
4201
+
4202
+ if (this._shouldTouchMotionGridLayerForCameraNavigation?.() === true) {
4203
+ status.motionGrid = this._syncMotionGridLayerForCameraNavigation?.() === true;
4204
+ }
4205
+
4206
+ status.localSnapGrid = syncLocalSnapGridForCameraNavigation(this, true) === true;
4207
+
4208
+ if (syncBusinessAutomationEdgesForCameraNavigation(this, true, false) === true) {
4209
+ this._immediateCameraFeedbackEdgeCount = Number(this._immediateCameraFeedbackEdgeCount || 0) + 1;
4210
+ status.automationEdges = true;
4211
+ status.edgeCount = this._immediateCameraFeedbackEdgeCount;
4212
+ }
4213
+
4214
+ this._lastImmediateCameraFeedbackStatus = status;
4215
+ return true;
4216
+ }
4217
+
4105
4218
  getCurrentBoardId() {
4106
4219
  return window.mindMap?.activeBoardId || _currentBoardId || null;
4107
4220
  }
@@ -5892,16 +6005,15 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5892
6005
  const forceUpdateFrames = Math.max(0, Number(this._forceUpdateFrames || 0));
5893
6006
  const panLiveRefreshForceFrames = Math.max(0, Number(this._panLiveRefreshForceFrames || 0));
5894
6007
  const hasForcedUpdate = forceUpdateFrames > 0;
5895
- // Mouse-pan live refresh keeps the render loop awake; it should not disable motion throttles.
5896
- const hasOnlyPanLiveRefreshForcedUpdate =
6008
+ // Camera navigation wake frames keep the render loop awake; they should not disable motion throttles.
6009
+ const hasOnlyCameraNavigationForcedUpdate =
5897
6010
  hasForcedUpdate &&
5898
- this.isPanning === true &&
5899
- this.isZooming !== true &&
5900
- panLiveRefreshForceFrames >= forceUpdateFrames;
5901
- const hasNonPanForcedUpdate =
6011
+ panLiveRefreshForceFrames >= forceUpdateFrames &&
6012
+ (this.isPanning === true || this.isZooming === true || isCameraMoving === true);
6013
+ const hasNonCameraForcedUpdate =
5902
6014
  hasForcedUpdate &&
5903
- hasOnlyPanLiveRefreshForcedUpdate !== true;
5904
- const hasNonCameraNavigationForcedUpdate = hasNonPanForcedUpdate;
6015
+ hasOnlyCameraNavigationForcedUpdate !== true;
6016
+ const hasNonCameraNavigationForcedUpdate = hasNonCameraForcedUpdate;
5905
6017
  const isLodModeActive = this.lodRenderer?.isInLODMode === true;
5906
6018
  const residentDirty = isResidentMidFarLodFrame &&
5907
6019
  this.lodRenderer?.hasResidentDirtyWork?.(this.camera, this) === true;
@@ -5915,7 +6027,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5915
6027
  this.isPanning !== true &&
5916
6028
  this.isZooming !== true &&
5917
6029
  !isNodeInteracting &&
5918
- !hasNonPanForcedUpdate &&
6030
+ !hasNonCameraNavigationForcedUpdate &&
5919
6031
  !hasPendingNearCssWarmup &&
5920
6032
  typeof this.lodRenderer?.shouldSkipStableResidentFrame === 'function') {
5921
6033
  canDeferResidentDirtyIdleFrame = this.lodRenderer.shouldSkipStableResidentFrame(this.camera, this) === true;
@@ -5928,7 +6040,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5928
6040
  residentDirtyRequiresUpdate !== true &&
5929
6041
  residentBandChanging !== true &&
5930
6042
  !isNodeInteracting &&
5931
- !hasNonPanForcedUpdate &&
6043
+ !hasNonCameraNavigationForcedUpdate &&
5932
6044
  !hasPendingNearCssWarmup;
5933
6045
  const movingUpdateDue = isCameraMoving && (
5934
6046
  !isLodModeActive ||
@@ -6101,7 +6213,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6101
6213
  this.isZooming !== true &&
6102
6214
  !shouldFreezeVisibilityDuringMotion &&
6103
6215
  !isNodeInteracting &&
6104
- !hasNonPanForcedUpdate &&
6216
+ !hasNonCameraNavigationForcedUpdate &&
6105
6217
  !hasPendingNearCssWarmup &&
6106
6218
  !isLodPanVisibilityRefreshDue &&
6107
6219
  !this.isWindowResizing;
@@ -6274,7 +6386,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6274
6386
  residentDirty !== true &&
6275
6387
  residentBandChanging !== true &&
6276
6388
  !isNodeInteracting &&
6277
- !hasNonPanForcedUpdate &&
6389
+ !hasNonCameraNavigationForcedUpdate &&
6278
6390
  !hasPendingNearCssWarmup;
6279
6391
  if (canSkipResidentLod) {
6280
6392
  lodUpdateSkippedThisFrame = true;
@@ -6334,7 +6446,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6334
6446
  this.isPanning === true &&
6335
6447
  this.isZooming !== true &&
6336
6448
  !isNodeInteracting &&
6337
- !hasNonPanForcedUpdate &&
6449
+ !hasNonCameraNavigationForcedUpdate &&
6338
6450
  !hasPendingNearCssWarmup &&
6339
6451
  !this.isWindowResizing;
6340
6452
  const shouldSyncCss3dForVisibilityChange =
@@ -6687,15 +6799,22 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6687
6799
 
6688
6800
  _profileSection('webglRender');
6689
6801
  // ?�▼??[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
+ );
6690
6810
  const canUseCss3dCameraFastPath = !!(
6691
6811
  this.cssRenderer &&
6692
6812
  typeof this.cssRenderer.renderCamera === 'function' &&
6693
6813
  isCss3dEnabled &&
6694
6814
  !isInLodMode &&
6695
6815
  shouldUpdateCss3d &&
6696
- this.isPanning === true &&
6697
- this.isZooming !== true &&
6698
- isCameraMoving === true &&
6816
+ (this.isPanning === true || this.isZooming === true || isCameraMoving === true) &&
6817
+ (isCameraMoving === true || hasFreshImmediateCameraFeedback === true) &&
6699
6818
  !isNodeInteracting &&
6700
6819
  !hasNonCameraNavigationForcedUpdate &&
6701
6820
  !hasPendingNearCssWarmup &&
@@ -6948,9 +7067,11 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6948
7067
  visibilityStableSkip: canSkipVisibilityCullingForStableFrame === true,
6949
7068
  visibilitySkipReason: visibilityCullingSkipReason || this._lastVisibilityCullingSkipReason || '',
6950
7069
  incrementalPanVisibility: isIncrementalPanVisibilityFrame === true,
7070
+ freshImmediateCameraFeedback: hasFreshImmediateCameraFeedback === true,
6951
7071
  shouldSyncCss3dTransforms: shouldSyncCss3dTransforms === true,
6952
7072
  shouldRenderCss3d: shouldRenderCss3dFrame === true,
6953
7073
  usedCss3dCameraFastPath: canUseCss3dCameraFastPath === true,
7074
+ immediateCameraFeedback: this._lastImmediateCameraFeedbackStatus || null,
6954
7075
  shouldSyncTextOverlays: shouldSyncTextOverlays === true,
6955
7076
  usedPassiveOverlayCameraFastPath: usedPassiveOverlayCameraFastPath === true,
6956
7077
  passiveOverlaySuppressed: isPassiveOverlaySuppressed === true,
@@ -5,7 +5,7 @@ window.MindMapInteractions = (function () {
5
5
  const MOTION_DOM_FANOUT_DELAY_MS = 180;
6
6
  const MOTION_DOM_FANOUT_ENABLED = false;
7
7
  const MOTION_WILL_CHANGE_ENABLE_DELAY_MS = 240;
8
- const WHEEL_ZOOM_TARGET_UPDATE_MODE = 'raf-coalesced-direct';
8
+ const WHEEL_ZOOM_TARGET_UPDATE_MODE = 'event-direct';
9
9
  const PRIMARY_CLICK_DELAY_MS = 280;
10
10
  const BACKGROUND_PRIMARY_CLICK_DELAY_MS = 320;
11
11
  const eventHandlers = new WeakMap();
@@ -603,10 +603,34 @@ window.MindMapInteractions = (function () {
603
603
  if (!module) {
604
604
  return;
605
605
  }
606
- wakeCameraNavigationAnimation(module, 'pan-input');
606
+ wakeCameraNavigationAnimation(module, 'pan-input', { immediate: true, forceFrames: 2 });
607
607
  }
608
608
 
609
- function wakeCameraNavigationAnimation(module, reason = 'camera-navigation-input') {
609
+ function applyImmediateCameraNavigationFeedback(module, reason = 'camera-navigation-input') {
610
+ if (module && typeof module.applyImmediateCameraNavigationFeedback === 'function') {
611
+ module.applyImmediateCameraNavigationFeedback(reason);
612
+ }
613
+ }
614
+
615
+ function markCameraNavigationForceFrames(module, frames = 2) {
616
+ if (!module) {
617
+ return;
618
+ }
619
+
620
+ const safeFrames = Math.max(0, Math.floor(Number(frames || 0)));
621
+ if (safeFrames <= 0) {
622
+ return;
623
+ }
624
+
625
+ module._forceUpdateFrames = Math.max(Number(module._forceUpdateFrames || 0), safeFrames);
626
+ module._panLiveRefreshForceFrames = Math.max(Number(module._panLiveRefreshForceFrames || 0), safeFrames);
627
+ }
628
+
629
+ function wakeCameraNavigationAnimation(module, reason = 'camera-navigation-input', options = {}) {
630
+ markCameraNavigationForceFrames(module, options?.forceFrames ?? 0);
631
+ if (options?.immediate === true) {
632
+ applyImmediateCameraNavigationFeedback(module, reason);
633
+ }
610
634
  if (module && typeof module.requestAnimationWake === 'function') {
611
635
  module.requestAnimationWake(reason);
612
636
  }
@@ -6362,7 +6386,7 @@ window.MindMapInteractions = (function () {
6362
6386
  module._lastPanInputAt = panInputAt;
6363
6387
  module._deferPassiveOverlayRefresh = true;
6364
6388
  module._cameraNavigationOverlayInputTime = panInputAt;
6365
- wakeCameraNavigationAnimation(module, 'trackpad-pan-input');
6389
+ wakeCameraNavigationAnimation(module, 'trackpad-pan-input', { immediate: true, forceFrames: 2 });
6366
6390
 
6367
6391
  if (module.isSelecting) {
6368
6392
  updateSelectionBox(module);
@@ -6387,6 +6411,13 @@ window.MindMapInteractions = (function () {
6387
6411
  return;
6388
6412
  }
6389
6413
 
6414
+ if (WHEEL_ZOOM_TARGET_UPDATE_MODE === 'event-direct') {
6415
+ const wheelNow = getWheelTimestamp();
6416
+ markCanvasWheelActivity(module, wheelNow, { throttleMs: WHEEL_ACTIVITY_BURST_INTERVAL_MS });
6417
+ performCameraZoomBuffered(module, deltaY, e.clientX, e.clientY, { inputTime: wheelNow });
6418
+ return;
6419
+ }
6420
+
6390
6421
  wheelBuffer.deltaY += deltaY;
6391
6422
  wheelBuffer.lastClientX = e.clientX;
6392
6423
  wheelBuffer.lastClientY = e.clientY;
@@ -6496,9 +6527,9 @@ window.MindMapInteractions = (function () {
6496
6527
  const newY = worldMouseY - (worldMouseY - module.targetY) * zoomRatio;
6497
6528
  module.targetX = newX;
6498
6529
  module.targetY = newY;
6530
+ applyImmediateCameraNavigationFeedback(module, 'wheel-zoom-input');
6499
6531
  const settleFrames = 2;
6500
- module._forceUpdateFrames = Math.max(Number(module._forceUpdateFrames || 0), settleFrames);
6501
- wakeCameraNavigationAnimation(module, 'wheel-zoom-input');
6532
+ wakeCameraNavigationAnimation(module, 'wheel-zoom-input', { forceFrames: settleFrames });
6502
6533
  // ▲▲▲ [Changed] ▲▲▲
6503
6534
 
6504
6535
  // ▼▼▼ [Perf] 줌 종료 감지 및 CSS3D 업데이트 타이머 ▼▼▼
@@ -6649,10 +6680,11 @@ window.MindMapInteractions = (function () {
6649
6680
 
6650
6681
  const panFactor = 0.001 * module.camera.position.z;
6651
6682
  module.targetY -= deltaY * panFactor;
6652
- module._forceUpdateFrames = Math.max(module._forceUpdateFrames || 0, 2);
6683
+ applyImmediateCameraNavigationFeedback(module, 'ctrl-wheel-pan-input');
6653
6684
  module._deferPassiveOverlayRefresh = false;
6654
6685
  module._overlayDirty = true;
6655
6686
  window.MindMapTextOverlayV2?.invalidateView?.(module);
6687
+ wakeCameraNavigationAnimation(module, 'ctrl-wheel-pan-input', { forceFrames: 2 });
6656
6688
 
6657
6689
  if (module.isSelecting) {
6658
6690
  updateSelectionBox(module);
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "GIgxXFFU",
2
+ "version": "D0Lw/Sy6",
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-vg5A+jUp1q8pNFLDoYxZSJvnXKldtLM9x+4fE9ZVL8o=",
81
+ "hash": "sha256-z9d5HhFqgp3XZPL33ZM+jyoKP1tXbxXu8tJO10XC0gs=",
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
83
83
  },
84
84
  {
@@ -106,7 +106,7 @@
106
106
  "url": "_content/MindExecution.Shared/js/mind-map-glow-shader.js"
107
107
  },
108
108
  {
109
- "hash": "sha256-EQRL/Bpor3JV+VXC+nmVHqOTG+XxE61wV1Oi6c4tL8Q=",
109
+ "hash": "sha256-QpXY2g89ekLPTa3GDB/lse5U2wQm39lXq7V3RUNLhd0=",
110
110
  "url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
111
111
  },
112
112
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: GIgxXFFU */
1
+ /* Manifest version: D0Lw/Sy6 */
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