@mindexec/cli 0.2.255 → 0.2.257

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.255",
3
+ "version": "0.2.257",
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 = '20260620-ua-zoom-motion-lite-v702';
8
+ const MINDMAP_CORE_BUILD_ID = '20260620-ua-wheel-zoom-direct-settle-v704';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -3886,6 +3886,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3886
3886
  this._animationIdleCadenceFrame = false;
3887
3887
  this._lastAnimationLoopDelayMs = 0;
3888
3888
  this._lastAnimationWakeReason = '';
3889
+ this._wheelZoomDirectSettleTimer = null;
3889
3890
  // ▲▲▲ [Optimization] ▲▲▲
3890
3891
 
3891
3892
  // ▼▼▼ [State] Loading flag (hide nodes during board load) ▼▼▼
@@ -4481,6 +4482,36 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4481
4482
  }
4482
4483
  }
4483
4484
 
4485
+ requestWheelZoomDirectSettle(delayMs = CAMERA_ZOOM_END_DELAY_MS + 18) {
4486
+ const safeDelayMs = Math.max(
4487
+ 16,
4488
+ Math.floor(Number(delayMs) || (CAMERA_ZOOM_END_DELAY_MS + 18))
4489
+ );
4490
+ this.clearWheelZoomDirectSettle();
4491
+ this._wheelZoomDirectSettleTimer = setTimeout(() => {
4492
+ this._wheelZoomDirectSettleTimer = null;
4493
+ if (this.isZooming !== true) {
4494
+ return;
4495
+ }
4496
+ if (this._animationLoopRunning === true) {
4497
+ this.requestAnimationWake('wheel-zoom-direct-finalize');
4498
+ } else {
4499
+ this.animate();
4500
+ }
4501
+ }, safeDelayMs);
4502
+ return true;
4503
+ }
4504
+
4505
+ clearWheelZoomDirectSettle() {
4506
+ if (!this._wheelZoomDirectSettleTimer) {
4507
+ return false;
4508
+ }
4509
+
4510
+ clearTimeout(this._wheelZoomDirectSettleTimer);
4511
+ this._wheelZoomDirectSettleTimer = null;
4512
+ return true;
4513
+ }
4514
+
4484
4515
  getCurrentBoardId() {
4485
4516
  return window.mindMap?.activeBoardId || _currentBoardId || null;
4486
4517
  }
@@ -5212,6 +5243,127 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5212
5243
  return true;
5213
5244
  }
5214
5245
 
5246
+ presentWheelZoomCameraFrame(clientX = null, clientY = null, options = {}) {
5247
+ if (CAMERA_MOTION_VISUAL_ONLY_FAST_PATH_ENABLED !== true ||
5248
+ this.isLoading === true ||
5249
+ this.isSelecting === true ||
5250
+ this.isDraggingNode === true ||
5251
+ this.isDraggingMultipleNodes === true ||
5252
+ this.isResizing === true ||
5253
+ this.isWindowResizing === true ||
5254
+ !this.camera) {
5255
+ return false;
5256
+ }
5257
+
5258
+ const renderDebugFlags = this.renderDebugFlags || getRenderDebugFlagsSnapshot();
5259
+ const canRenderCss3d = !!(
5260
+ renderDebugFlags.enableCss3d !== false &&
5261
+ this.cssRenderer &&
5262
+ typeof this.cssRenderer.renderCamera === 'function'
5263
+ );
5264
+ const canRenderWebgl = !!(
5265
+ renderDebugFlags.enableWebglRender !== false &&
5266
+ this.renderer &&
5267
+ this.scene
5268
+ );
5269
+ if (canRenderCss3d !== true && canRenderWebgl !== true) {
5270
+ return false;
5271
+ }
5272
+
5273
+ const currentX = Number(this.camera.position?.x || 0);
5274
+ const currentY = Number(this.camera.position?.y || 0);
5275
+ const currentZ = Number(this.camera.position?.z || 1);
5276
+ const targetX = Number.isFinite(Number(this.targetX)) ? Number(this.targetX) : currentX;
5277
+ const targetY = Number.isFinite(Number(this.targetY)) ? Number(this.targetY) : currentY;
5278
+ const targetZ = Number.isFinite(Number(this.targetZ)) ? Math.max(1, Number(this.targetZ)) : Math.max(1, currentZ);
5279
+ const deltaSq =
5280
+ ((targetX - currentX) * (targetX - currentX)) +
5281
+ ((targetY - currentY) * (targetY - currentY)) +
5282
+ ((targetZ - currentZ) * (targetZ - currentZ));
5283
+
5284
+ this.camera.position.set(targetX, targetY, targetZ);
5285
+ this.camera.updateMatrixWorld(true);
5286
+ this._viewStatePersistAfterMotion = true;
5287
+ this._viewSyncMotionActive = true;
5288
+ this._cameraMovingThisFrame = deltaSq > 0.0001;
5289
+ this._lastVisibilityCullingSkipReason = 'ua-wheel-zoom-direct';
5290
+ this._fullResMotionFrozen = this.lodRenderer?.isInLODMode === true ? false : true;
5291
+ this._wasViewStateMotionFrozenLastFrame = this._fullResMotionFrozen === true;
5292
+ this._wasLodMotionFrozenLastFrame = this.lodRenderer?.isInLODMode === true;
5293
+ if (this.lodRenderer?.isInLODMode !== true) {
5294
+ this._fullResVisibilityReconcilePending = true;
5295
+ }
5296
+ this._preserveVisibleSetThisFrame = true;
5297
+ this._passiveOverlayResumeAt = Math.max(
5298
+ Number(this._passiveOverlayResumeAt || 0),
5299
+ (typeof performance !== 'undefined' && typeof performance.now === 'function' ? performance.now() : Date.now()) + PASSIVE_OVERLAY_IDLE_DELAY_MS
5300
+ );
5301
+ if (this._overlayDirty === true ||
5302
+ String(this._textOverlayV2State?.selectionNodeId || '').trim() ||
5303
+ String(this._selectableTextOverlayNodeId || '').trim()) {
5304
+ this._deferPassiveOverlayRefresh = true;
5305
+ }
5306
+
5307
+ if (Number.isFinite(Number(clientX)) && Number.isFinite(Number(clientY))) {
5308
+ this.setLocalSnapGridClientPoint?.(Number(clientX), Number(clientY));
5309
+ }
5310
+
5311
+ recordCameraMotionFastPathStatus(this, 'hit', 'ua-wheel-zoom-direct', {
5312
+ coalescedWheelEvents: Number(options?.coalescedWheelEvents || 0)
5313
+ });
5314
+
5315
+ updateCursorDomElement(this);
5316
+
5317
+ let usedWebglCanvasCameraTransform = false;
5318
+ if (canRenderWebgl === true) {
5319
+ const shouldFreezeWebglCanvasForZoom =
5320
+ shouldFreezeWebglSurfaceForZoom(this) === true;
5321
+ const canReuseWebglCanvas = !!(
5322
+ shouldFreezeWebglCanvasForZoom !== true &&
5323
+ canUseWebglCanvasTransformForCameraMotion(this) === true &&
5324
+ this._lastWebglRenderedCameraState &&
5325
+ this.renderer?.domElement
5326
+ );
5327
+ if (canReuseWebglCanvas === true) {
5328
+ deferContinuousThemeForCameraMotion(this);
5329
+ usedWebglCanvasCameraTransform = this._applyWebglCanvasCameraTransform?.() === true;
5330
+ this._webglCameraMotionDeferred = true;
5331
+ this._lastWebglRenderInfo = {
5332
+ calls: 0,
5333
+ triangles: 0,
5334
+ points: 0,
5335
+ lines: 0,
5336
+ skipped: true,
5337
+ webglCanvasCameraTransform: usedWebglCanvasCameraTransform === true,
5338
+ uaWheelZoomDirect: true
5339
+ };
5340
+ } else if (shouldFreezeWebglCanvasForZoom === true) {
5341
+ markWebglSurfaceFrozenForZoom(this, 'uaWheelZoomDirect');
5342
+ } else {
5343
+ this._clearWebglCanvasCameraTransform?.();
5344
+ this.renderer.render(this.scene, this.camera);
5345
+ this._recordWebglRenderedCameraState?.();
5346
+ const renderInfo = this.renderer?.info?.render || null;
5347
+ this._lastWebglRenderInfo = renderInfo ? {
5348
+ calls: Number(renderInfo.calls || 0),
5349
+ triangles: Number(renderInfo.triangles || 0),
5350
+ points: Number(renderInfo.points || 0),
5351
+ lines: Number(renderInfo.lines || 0),
5352
+ uaWheelZoomDirect: true,
5353
+ webglCanvasCameraBootstrap: true
5354
+ } : null;
5355
+ }
5356
+ }
5357
+
5358
+ this._syncMotionGridLayerForCameraNavigation?.(usedWebglCanvasCameraTransform);
5359
+ this._syncLocalSnapGridPositionOnly?.(true);
5360
+ if (canRenderCss3d === true) {
5361
+ renderCss3dCameraForCameraNavigation(this, 'ua-wheel-zoom-direct');
5362
+ }
5363
+ syncBusinessAutomationEdgesForCameraNavigation(this);
5364
+ return true;
5365
+ }
5366
+
5215
5367
  refreshAgentConsoleVisibilityTracking(force = false) {
5216
5368
  if (!force && this._agentConsoleVisibilityTrackingDirty !== true) {
5217
5369
  return;
@@ -8855,6 +9007,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
8855
9007
  clearTimeout(this._motionGridHideTimer);
8856
9008
  this._motionGridHideTimer = null;
8857
9009
  }
9010
+ this.clearWheelZoomDirectSettle();
8858
9011
  if (this._motionGridLayer) {
8859
9012
  this._motionGridLayer.remove();
8860
9013
  this._motionGridLayer = null;
@@ -6255,6 +6255,7 @@ window.MindMapInteractions = (function () {
6255
6255
  return;
6256
6256
  }
6257
6257
 
6258
+ module.clearWheelZoomDirectSettle?.();
6258
6259
  module.isZooming = false;
6259
6260
  clearZoomMotionChrome(module);
6260
6261
  clearMotionWillChangeEnable(module, { disableIfIdle: true });
@@ -6454,12 +6455,22 @@ window.MindMapInteractions = (function () {
6454
6455
  module.targetZ = newZ;
6455
6456
  // Calculate target position based on mouse position and zoom ratio
6456
6457
  const newX = worldMouseX - (worldMouseX - module.targetX) * zoomRatio;
6457
- const newY = worldMouseY - (worldMouseY - module.targetY) * zoomRatio;
6458
- module.targetX = newX;
6458
+ const newY = worldMouseY - (worldMouseY - module.targetY) * zoomRatio;
6459
+ module.targetX = newX;
6459
6460
  module.targetY = newY;
6460
- module._forceUpdateFrames = Math.max(Number(module._forceUpdateFrames || 0), 2);
6461
- module._cameraNavigationForceFrames = Math.max(Number(module._cameraNavigationForceFrames || 0), 2);
6462
- wakeCameraNavigationAnimation(module, 'wheel-zoom-input');
6461
+ const presentedDirectly = module.presentWheelZoomCameraFrame?.(clientX, clientY, {
6462
+ reason: 'wheel-zoom-direct',
6463
+ coalescedWheelEvents: Number(options.coalescedWheelEvents || 0)
6464
+ }) === true;
6465
+ const settleScheduled =
6466
+ presentedDirectly === true &&
6467
+ module.requestWheelZoomDirectSettle?.() === true;
6468
+ if (settleScheduled !== true) {
6469
+ const settleFrames = 2;
6470
+ module._forceUpdateFrames = Math.max(Number(module._forceUpdateFrames || 0), settleFrames);
6471
+ module._cameraNavigationForceFrames = Math.max(Number(module._cameraNavigationForceFrames || 0), settleFrames);
6472
+ wakeCameraNavigationAnimation(module, presentedDirectly === true ? 'wheel-zoom-direct-settle' : 'wheel-zoom-input');
6473
+ }
6463
6474
  // ▲▲▲ [Changed] ▲▲▲
6464
6475
 
6465
6476
  // ▼▼▼ [Perf] 줌 종료 감지 및 CSS3D 업데이트 타이머 ▼▼▼
@@ -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=20260620-ua-zoom-motion-lite-v702" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-ua-zoom-motion-lite-v702" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-ua-wheel-zoom-direct-settle-v704" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-ua-wheel-zoom-direct-settle-v704" />
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 = '20260620-ua-zoom-motion-lite-v702';
582
+ const scriptVersion = '20260620-ua-wheel-zoom-direct-settle-v704';
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": "7QBlxc4s",
2
+ "version": "sp0zMNR0",
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-o+i+x7LpltW0e2S8nRTwwGwGy1qDpL70R+/Da/+lr/A=",
81
+ "hash": "sha256-+tbg0oVHg45w3EqRroBtWvPm/O8xkG20ZhpQpNXUhPo=",
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-agCyFImDU819fOhCgWbLQpUd+XTc2lV1nmTjAqYb1Vg=",
109
+ "hash": "sha256-7s3ZFEQXCE1cX+sTQ033CroYRxtD5lQ5Y+FGG9NpjEU=",
110
110
  "url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
111
111
  },
112
112
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-KP3YKI1pVCuyzMlVYyt+Vvcs/1SafFXPv7pXpv4LIWs=",
837
+ "hash": "sha256-M5iNp7FBVtopYOq0HzZUPgt+JDG+igkEAF8V6A3h2nY=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: 7QBlxc4s */
1
+ /* Manifest version: sp0zMNR0 */
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