@mindexec/cli 0.2.258 → 0.2.260

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.258",
3
+ "version": "0.2.260",
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-local-grid-wheel-zoom-v705';
8
+ const MINDMAP_CORE_BUILD_ID = '20260620-css3d-flat-wheel-v708';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -513,6 +513,10 @@
513
513
  );
514
514
  }
515
515
 
516
+ function isLocalSnapGridOnlyTheme(module) {
517
+ return module?.currentThemeObject?.userData?.localSnapGrid === true;
518
+ }
519
+
516
520
  function renderCss3dCameraForCameraNavigation(module, reason = 'camera-navigation') {
517
521
  const renderer = module?.cssRenderer || null;
518
522
  const camera = module?.camera || null;
@@ -557,6 +561,12 @@
557
561
  module._clearWebglCanvasCameraTransform?.();
558
562
  module._webglCameraMotionDeferred = true;
559
563
  module._themeCameraMotionDeferred = true;
564
+ const frozenMode = mode || 'uaZoomFrozenWebgl';
565
+ if (module._lastWebglSurfaceFrozenForZoomKey === frozenMode &&
566
+ module._lastWebglRenderInfo?.webglSurfaceFrozenForZoom === true) {
567
+ return true;
568
+ }
569
+ module._lastWebglSurfaceFrozenForZoomKey = frozenMode;
560
570
  module._lastWebglRenderInfo = {
561
571
  calls: 0,
562
572
  triangles: 0,
@@ -564,7 +574,7 @@
564
574
  lines: 0,
565
575
  skipped: true,
566
576
  webglSurfaceFrozenForZoom: true,
567
- [mode || 'uaZoomFrozenWebgl']: true
577
+ [frozenMode]: true
568
578
  };
569
579
  return true;
570
580
  }
@@ -1667,7 +1677,7 @@
1667
1677
  });
1668
1678
  }
1669
1679
 
1670
- updateCursorDomElement(module);
1680
+ module._cursorDomDeferredForMotion = true;
1671
1681
 
1672
1682
  const isWebglRenderEnabled = renderDebugFlags.enableWebglRender !== false;
1673
1683
  let usedWebglCanvasCameraTransform = false;
@@ -1893,7 +1903,7 @@
1893
1903
  });
1894
1904
  }
1895
1905
 
1896
- updateCursorDomElement(module);
1906
+ module._cursorDomDeferredForMotion = true;
1897
1907
 
1898
1908
  let usedWebglCanvasCameraTransform = false;
1899
1909
  if (isWebglRenderEnabled === true && module.renderer && module.scene && module.camera) {
@@ -3890,6 +3900,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3890
3900
  this._lastAnimationLoopDelayMs = 0;
3891
3901
  this._lastAnimationWakeReason = '';
3892
3902
  this._wheelZoomDirectSettleTimer = null;
3903
+ this._wheelZoomDirectSettleDueAt = 0;
3893
3904
  // ▲▲▲ [Optimization] ▲▲▲
3894
3905
 
3895
3906
  // ▼▼▼ [State] Loading flag (hide nodes during board load) ▼▼▼
@@ -4545,22 +4556,47 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4545
4556
  16,
4546
4557
  Math.floor(Number(delayMs) || (CAMERA_ZOOM_END_DELAY_MS + 18))
4547
4558
  );
4548
- this.clearWheelZoomDirectSettle();
4549
- this._wheelZoomDirectSettleTimer = setTimeout(() => {
4550
- this._wheelZoomDirectSettleTimer = null;
4551
- if (this.isZooming !== true) {
4552
- return;
4553
- }
4554
- if (this._animationLoopRunning === true) {
4555
- this.requestAnimationWake('wheel-zoom-direct-finalize');
4556
- } else {
4557
- this.animate();
4558
- }
4559
- }, safeDelayMs);
4559
+ const now = typeof performance !== 'undefined' && typeof performance.now === 'function'
4560
+ ? performance.now()
4561
+ : Date.now();
4562
+ this._wheelZoomDirectSettleDueAt = now + safeDelayMs;
4563
+
4564
+ if (this._wheelZoomDirectSettleTimer) {
4565
+ return true;
4566
+ }
4567
+
4568
+ const scheduleSettleWake = (waitMs) => {
4569
+ this._wheelZoomDirectSettleTimer = setTimeout(() => {
4570
+ this._wheelZoomDirectSettleTimer = null;
4571
+ if (this.isZooming !== true) {
4572
+ this._wheelZoomDirectSettleDueAt = 0;
4573
+ return;
4574
+ }
4575
+
4576
+ const timerNow = typeof performance !== 'undefined' && typeof performance.now === 'function'
4577
+ ? performance.now()
4578
+ : Date.now();
4579
+ const remainingMs = Number(this._wheelZoomDirectSettleDueAt || 0) - timerNow;
4580
+ if (remainingMs > 8) {
4581
+ scheduleSettleWake(Math.max(16, Math.min(80, remainingMs)));
4582
+ return;
4583
+ }
4584
+
4585
+ this._wheelZoomDirectSettleDueAt = 0;
4586
+ if (this._animationLoopRunning === true) {
4587
+ this.requestAnimationWake('wheel-zoom-direct-finalize');
4588
+ } else {
4589
+ this.animate();
4590
+ }
4591
+ }, Math.max(16, Math.floor(Number(waitMs) || safeDelayMs)));
4592
+ };
4593
+
4594
+ scheduleSettleWake(safeDelayMs);
4560
4595
  return true;
4561
4596
  }
4562
4597
 
4563
4598
  clearWheelZoomDirectSettle() {
4599
+ this._wheelZoomDirectSettleDueAt = 0;
4564
4600
  if (!this._wheelZoomDirectSettleTimer) {
4565
4601
  return false;
4566
4602
  }
@@ -5370,7 +5406,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5370
5406
  coalescedWheelEvents: Number(options?.coalescedWheelEvents || 0)
5371
5407
  });
5372
5408
 
5373
- updateCursorDomElement(this);
5409
+ this._cursorDomDeferredForMotion = true;
5374
5410
 
5375
5411
  let usedWebglCanvasCameraTransform = false;
5376
5412
  if (canRenderWebgl === true) {
@@ -6483,6 +6519,10 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6483
6519
  this._wasResizingLastFrame = this.isResizing === true;
6484
6520
  if (zoomEndedThisFrame || panEndedThisFrame || cameraEndedThisFrame || resizeEndedThisFrame) {
6485
6521
  this._lastMotionEndAt = frameStart;
6522
+ if (this._cursorDomDeferredForMotion === true) {
6523
+ updateCursorDomElement(this);
6524
+ this._cursorDomDeferredForMotion = false;
6525
+ }
6486
6526
  if (cameraEndedThisFrame) {
6487
6527
  this._cameraNavigationOverlayInputTime = 0;
6488
6528
  this._overlayDirty = true;
@@ -6817,7 +6857,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6817
6857
  });
6818
6858
  }
6819
6859
 
6820
- updateCursorDomElement(this);
6860
+ this._cursorDomDeferredForMotion = true;
6821
6861
  const shouldFreezeWebglCanvasForImmediateZoom =
6822
6862
  shouldFreezeWebglSurfaceForZoom(this) === true;
6823
6863
  const canReuseWebglCanvasForImmediateMotion = !!(
@@ -6833,6 +6873,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6833
6873
  if (shouldFreezeWebglCanvasForImmediateZoom !== true &&
6834
6874
  !canReuseWebglCanvasForImmediateMotion &&
6835
6875
  renderDebugFlags.enableThemeAnimation !== false &&
6876
+ isLocalSnapGridOnlyTheme(this) !== true &&
6836
6877
  this.currentThemeObject &&
6837
6878
  typeof this.currentThemeObject.animate === 'function') {
6838
6879
  const themeRunner = window.MindMapThemes?.runAnimationIfNeeded;
@@ -6992,7 +7033,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6992
7033
  this._deferPassiveOverlayRefresh = true;
6993
7034
  }
6994
7035
 
6995
- updateCursorDomElement(this);
7036
+ this._cursorDomDeferredForMotion = true;
6996
7037
  const shouldFreezeWebglCanvasForStationaryZoom =
6997
7038
  shouldFreezeWebglSurfaceForZoom(this) === true;
6998
7039
  const canReuseWebglCanvasForStationaryMotion = !!(
@@ -7008,6 +7049,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7008
7049
  if (shouldFreezeWebglCanvasForStationaryZoom !== true &&
7009
7050
  !canReuseWebglCanvasForStationaryMotion &&
7010
7051
  renderDebugFlags.enableThemeAnimation !== false &&
7052
+ isLocalSnapGridOnlyTheme(this) !== true &&
7011
7053
  this.currentThemeObject &&
7012
7054
  typeof this.currentThemeObject.animate === 'function') {
7013
7055
  const themeRunner = window.MindMapThemes?.runAnimationIfNeeded;
@@ -7182,7 +7224,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7182
7224
  });
7183
7225
  }
7184
7226
 
7185
- updateCursorDomElement(this);
7227
+ this._cursorDomDeferredForMotion = true;
7186
7228
  const shouldFreezeWebglCanvasForResidentZoom =
7187
7229
  shouldFreezeWebglSurfaceForZoom(this) === true;
7188
7230
  const canReuseWebglCanvasForResidentMotion = !!(
@@ -7198,6 +7240,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7198
7240
  if (shouldFreezeWebglCanvasForResidentZoom !== true &&
7199
7241
  !canReuseWebglCanvasForResidentMotion &&
7200
7242
  renderDebugFlags.enableThemeAnimation !== false &&
7243
+ isLocalSnapGridOnlyTheme(this) !== true &&
7201
7244
  this.currentThemeObject &&
7202
7245
  typeof this.currentThemeObject.animate === 'function') {
7203
7246
  const themeRunner = window.MindMapThemes?.runAnimationIfNeeded;
@@ -7430,7 +7473,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7430
7473
  let usedWebglCanvasCameraTransformEarly = false;
7431
7474
  if (shouldSampleWebglDuringCameraMotion &&
7432
7475
  shouldFreezeWebglCanvasForEarlyZoom !== true) {
7433
- updateCursorDomElement(this);
7476
+ this._cursorDomDeferredForMotion = true;
7434
7477
  if (isWebglRenderEnabled && this.renderer && this.scene && this.camera) {
7435
7478
  this._clearWebglCanvasCameraTransform();
7436
7479
  this.renderer.render(this.scene, this.camera);
@@ -8209,7 +8252,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
8209
8252
  const shouldSampleWebglDuringCameraMotion =
8210
8253
  renderDebugFlags.sampleWebglDuringCameraMotion === true &&
8211
8254
  (this.frameCount % CAMERA_MOTION_WEBGL_FRAME_INTERVAL) === 0;
8212
- if (!isPureCss3dCameraMotionFrame || shouldSampleWebglDuringCameraMotion) {
8255
+ if (isCameraNavigationOnlyInteractiveFrame === true ||
8256
+ this.isPanning === true ||
8257
+ this.isZooming === true ||
8258
+ isCameraMoving === true) {
8259
+ this._cursorDomDeferredForMotion = true;
8260
+ } else if (!isPureCss3dCameraMotionFrame || shouldSampleWebglDuringCameraMotion) {
8213
8261
  updateCursorDomElement(this);
8214
8262
  }
8215
8263
 
@@ -8228,6 +8276,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
8228
8276
  let themeAnimatedThisFrame = false;
8229
8277
  if (allowContinuousThemeAnimationThisFrame === true &&
8230
8278
  (isThemeAnimationEnabled || shouldForceGpuParticleAnimation) &&
8279
+ isLocalSnapGridOnlyTheme(this) !== true &&
8231
8280
  this.currentThemeObject &&
8232
8281
  typeof this.currentThemeObject.animate === 'function') {
8233
8282
  const forceThemeCameraUpdate =
@@ -31,7 +31,7 @@
31
31
  }
32
32
 
33
33
  function CSS3DRenderer(){
34
- var _width, _height; var _widthHalf, _heightHalf; var cache = { camera:{ fov:0, style:'' }, objects: new WeakMap() };
34
+ var _width, _height; var _widthHalf, _heightHalf; var cache = { camera:{ fov:0, style:'', mode:'matrix3d' }, objects: new WeakMap() };
35
35
  var domElement = document.createElement('div'); domElement.style.overflow = 'hidden'; this.domElement = domElement;
36
36
  var cameraElement = document.createElement('div'); cameraElement.style.webkitTransformStyle = cameraElement.style.transformStyle = 'preserve-3d'; cameraElement.style.pointerEvents = 'none'; cameraElement.style.webkitTransformOrigin = cameraElement.style.transformOrigin = '0 0'; domElement.appendChild(cameraElement);
37
37
 
@@ -41,7 +41,13 @@
41
41
  function getCameraCSSMatrix(matrix){ var e=matrix.elements; return 'matrix3d('+epsilon(e[0])+','+epsilon(-e[1])+','+epsilon(e[2])+','+epsilon(e[3])+','+epsilon(e[4])+','+epsilon(-e[5])+','+epsilon(e[6])+','+epsilon(e[7])+','+epsilon(e[8])+','+epsilon(-e[9])+','+epsilon(e[10])+','+epsilon(e[11])+','+epsilon(e[12])+','+epsilon(-e[13])+','+epsilon(e[14])+','+epsilon(e[15])+')'; }
42
42
  function getObjectCSSMatrix(matrix){ var e=matrix.elements; var m='matrix3d('+epsilon(e[0])+','+epsilon(e[1])+','+epsilon(e[2])+','+epsilon(e[3])+','+epsilon(-e[4])+','+epsilon(-e[5])+','+epsilon(-e[6])+','+epsilon(-e[7])+','+epsilon(e[8])+','+epsilon(e[9])+','+epsilon(e[10])+','+epsilon(e[11])+','+epsilon(e[12])+','+epsilon(e[13])+','+epsilon(e[14])+','+epsilon(e[15])+')'; return m; }
43
43
  function renderObject(object, scene, camera, cameraCSSMatrix){ if (object.isCSS3DObject){ var style=getObjectCSSMatrix(object.matrixWorld); var display=object.visible ? '' : 'none'; var element=object.element; var cached=cache.objects.get(object); if (cached===undefined || cached.style!==style){ element.style.webkitTransform=element.style.transform=style; } if (cached===undefined || cached.display!==display){ element.style.display=display; } if (cached===undefined || cached.style!==style || cached.display!==display){ cache.objects.set(object, { style, display }); } if (element.parentNode !== cameraElement){ cameraElement.appendChild(element); } } for (var i=0,l=object.children.length;i<l;i++){ renderObject(object.children[i], scene, camera, cameraCSSMatrix); } }
44
- function renderCameraOnly(renderer, camera){ var fov=camera.projectionMatrix.elements[5]*_heightHalf; if (cache.camera.fov!==fov){ renderer.domElement.style.webkitPerspective=renderer.domElement.style.perspective=fov+'px'; cache.camera.fov=fov; } if (camera.parent===null && camera.matrixWorldNeedsUpdate===true) camera.updateMatrixWorld(); var cameraCSSMatrix='translateZ('+fov+'px)'+getCameraCSSMatrix(camera.matrixWorldInverse); var style=cameraCSSMatrix+'translate('+_widthHalf+'px,'+_heightHalf+'px)'; if (cache.camera.style!==style){ cameraElement.style.webkitTransform=cameraElement.style.transform=style; cache.camera.style=style; } return cameraCSSMatrix; }
44
+ function setCameraElementMode(mode){
45
+ if (cache.camera.mode === mode) return;
46
+ cache.camera.mode = mode;
47
+ var style = mode === 'flat' ? 'flat' : 'preserve-3d';
48
+ cameraElement.style.webkitTransformStyle = cameraElement.style.transformStyle = style;
49
+ }
50
+ function renderCameraOnly(renderer, camera){ setCameraElementMode('matrix3d'); var fov=camera.projectionMatrix.elements[5]*_heightHalf; if (cache.camera.fov!==fov){ renderer.domElement.style.webkitPerspective=renderer.domElement.style.perspective=fov+'px'; cache.camera.fov=fov; } if (camera.parent===null && camera.matrixWorldNeedsUpdate===true) camera.updateMatrixWorld(); var cameraCSSMatrix='translateZ('+fov+'px)'+getCameraCSSMatrix(camera.matrixWorldInverse); var style=cameraCSSMatrix+'translate('+_widthHalf+'px,'+_heightHalf+'px)'; if (cache.camera.style!==style){ cameraElement.style.webkitTransform=cameraElement.style.transform=style; cache.camera.style=style; } return cameraCSSMatrix; }
45
51
  function renderFlatCameraOnly(renderer, camera, options){
46
52
  if (!camera || !_width || !_height || !camera.isPerspectiveCamera) return false;
47
53
  var position = camera.position || {};
@@ -63,12 +69,13 @@
63
69
  var ty = Math.round(translateY / translateBucket) * translateBucket;
64
70
  var s = Math.round(scale / scaleBucket) * scaleBucket;
65
71
  var style = 'flat|'+Math.round(_width)+'|'+Math.round(_height)+'|'+Math.round(tx / translateBucket)+'|'+Math.round(ty / translateBucket)+'|'+Math.round(s / scaleBucket);
72
+ setCameraElementMode('flat');
66
73
  if (cache.camera.fov !== 0){
67
74
  renderer.domElement.style.webkitPerspective = renderer.domElement.style.perspective = '';
68
75
  cache.camera.fov = 0;
69
76
  }
70
77
  if (cache.camera.style !== style){
71
- cameraElement.style.webkitTransform = cameraElement.style.transform = 'translate3d('+tx.toFixed(3)+'px,'+ty.toFixed(3)+'px,0) scale('+s.toFixed(6)+','+(-s).toFixed(6)+')';
78
+ cameraElement.style.webkitTransform = cameraElement.style.transform = 'matrix('+s.toFixed(6)+',0,0,'+(-s).toFixed(6)+','+tx.toFixed(3)+','+ty.toFixed(3)+')';
72
79
  cache.camera.style = style;
73
80
  }
74
81
  return true;
@@ -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-local-grid-wheel-zoom-v705" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-local-grid-wheel-zoom-v705" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-css3d-flat-wheel-v708" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-css3d-flat-wheel-v708" />
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-local-grid-wheel-zoom-v705';
582
+ const scriptVersion = '20260620-css3d-flat-wheel-v708';
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": "iiECfCDe",
2
+ "version": "4mKj1mKm",
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-ZD4BuG/qNa9B6cje0Prf1T9lWdnLv3azcQDqcu4LWF4=",
81
+ "hash": "sha256-VlEtNj0oIkvIkgTr1/NcqEQGkNS9SuFKDXsdwxd1nDs=",
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
83
83
  },
84
84
  {
@@ -182,7 +182,7 @@
182
182
  "url": "_content/MindExecution.Shared/js/plan-master.js"
183
183
  },
184
184
  {
185
- "hash": "sha256-zZ6nh8fh4HnO5rV//tfE4WB119Ez9Gjg26P7k0idcIE=",
185
+ "hash": "sha256-2IxneOfAhc2Sq8hl7ywEBzZaaFX22FZaW89WB0rAgUk=",
186
186
  "url": "_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js"
187
187
  },
188
188
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-cT/4dyrhG2eQz7HKOf4fcBIn4qhPlMHdbA4tqQymjOQ=",
837
+ "hash": "sha256-VL0U4RpYqj0SZ1628QiRWigygszwi/VJUJg1YRqrCvA=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: iiECfCDe */
1
+ /* Manifest version: 4mKj1mKm */
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