@mindexec/cli 0.2.26 → 0.2.27

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.26",
3
+ "version": "0.2.27",
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 = '20260610-template-board-ready-v205';
8
+ const MINDMAP_CORE_BUILD_ID = '20260613-cursor-blink-v206';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -83,6 +83,7 @@
83
83
  const PASSIVE_OVERLAY_INTERACTIVE_DENSE_VISIBLE_THRESHOLD = 40;
84
84
  const PASSIVE_OVERLAY_IDLE_DELAY_MS = 500;
85
85
  const PASSIVE_OVERLAY_PAN_IDLE_DELAY_MS = 500;
86
+ const CURSOR_BLINK_INTERVAL_MS = 500;
86
87
  const HOME_CAMERA_NORMAL_MID_Z = 8250;
87
88
  const HOME_DENSE_CLUSTER_MIN_CELL_SIZE = 1200;
88
89
  const HOME_DENSE_CLUSTER_MAX_CELL_SIZE = 3600;
@@ -2497,6 +2498,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
2497
2498
  this.cursorMesh = null;
2498
2499
  this.cursorMaterial = null;
2499
2500
  this.cursorLineMaterial = null;
2501
+ this._cursorBlinkVisible = true;
2502
+ this._lastCursorBlinkAt = 0;
2500
2503
  this._viewStatePersistTimer = null;
2501
2504
  this._pendingViewStateSnapshot = null;
2502
2505
  this._pendingViewStateKey = null;
@@ -5062,21 +5065,37 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5062
5065
  // 5. Cursor Animation
5063
5066
  // ----------------------------------------------------------------
5064
5067
  let cursorAnimatedThisFrame = false;
5065
- const shouldAnimateCursor =
5066
- !!this.cursorMaterial &&
5067
- (
5068
- (isContinuousTheme === true && allowContinuousThemeAnimationThisFrame === true) ||
5069
- isInteractiveFrame === true ||
5070
- shouldUpdate === true ||
5071
- hasForcedUpdate === true ||
5072
- isBoardLoading === true
5073
- );
5074
- if (shouldAnimateCursor) {
5075
- const time = Date.now() * 0.005;
5076
- const val = (Math.sin(time) * 0.5) + 0.5;
5077
- this.cursorMaterial.color.setRGB(val, val, val);
5078
- if (this.cursorLineMaterial) this.cursorLineMaterial.color.setRGB(val, val, val);
5079
- cursorAnimatedThisFrame = true;
5068
+ let cursorBlinkWakeDelayMs = Number.POSITIVE_INFINITY;
5069
+ const hasCursorBlinkTarget = !!(this.cursorMesh && this.cursorMaterial);
5070
+ if (hasCursorBlinkTarget) {
5071
+ if (this.cursorMesh.visible !== (this._cursorBlinkVisible === true)) {
5072
+ this.cursorMesh.visible = this._cursorBlinkVisible === true;
5073
+ cursorAnimatedThisFrame = true;
5074
+ }
5075
+
5076
+ const previousBlinkAt = Number(this._lastCursorBlinkAt || 0);
5077
+ if (!Number.isFinite(previousBlinkAt) || previousBlinkAt <= 0) {
5078
+ this._lastCursorBlinkAt = frameStart;
5079
+ this._cursorBlinkVisible = true;
5080
+ if (this.cursorMesh.visible !== true) {
5081
+ this.cursorMesh.visible = true;
5082
+ cursorAnimatedThisFrame = true;
5083
+ }
5084
+ } else {
5085
+ const elapsedBlinkMs = Math.max(0, frameStart - previousBlinkAt);
5086
+ if (elapsedBlinkMs >= CURSOR_BLINK_INTERVAL_MS) {
5087
+ const elapsedBlinkSteps = Math.max(1, Math.floor(elapsedBlinkMs / CURSOR_BLINK_INTERVAL_MS));
5088
+ if ((elapsedBlinkSteps % 2) === 1) {
5089
+ this._cursorBlinkVisible = this._cursorBlinkVisible !== true;
5090
+ }
5091
+ this._lastCursorBlinkAt = previousBlinkAt + (elapsedBlinkSteps * CURSOR_BLINK_INTERVAL_MS);
5092
+ this.cursorMesh.visible = this._cursorBlinkVisible === true;
5093
+ cursorAnimatedThisFrame = true;
5094
+ }
5095
+ }
5096
+
5097
+ const nextBlinkInMs = CURSOR_BLINK_INTERVAL_MS - Math.max(0, frameStart - Number(this._lastCursorBlinkAt || frameStart));
5098
+ cursorBlinkWakeDelayMs = Math.max(1, Math.min(CURSOR_BLINK_INTERVAL_MS, Math.ceil(nextBlinkInMs)));
5080
5099
  }
5081
5100
 
5082
5101
  // 6. Theme Animation
@@ -5475,12 +5494,32 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
5475
5494
  shouldSyncTextOverlays !== true &&
5476
5495
  hasPendingAnimationWakeWork !== true;
5477
5496
  if (shouldParkIdleAnimationLoop) {
5497
+ if (hasCursorBlinkTarget) {
5498
+ nextAnimationLoopDelayMs = cursorBlinkWakeDelayMs;
5499
+ this._lastAnimationLoopDelayMs = nextAnimationLoopDelayMs;
5500
+ this._animationLoopExecuting = false;
5501
+ this._scheduleAnimationLoop(loop, nextAnimationLoopDelayMs);
5502
+ return;
5503
+ }
5504
+
5478
5505
  this._lastAnimationLoopDelayMs = -1;
5479
5506
  this._animationLoopExecuting = false;
5480
5507
  return;
5481
5508
  }
5482
5509
 
5483
- nextAnimationLoopDelayMs = 0;
5510
+ const shouldDelayAfterCursorOnlyFrame =
5511
+ cursorAnimatedThisFrame === true &&
5512
+ shouldCaptureFramePerf !== true &&
5513
+ isBoardLoading !== true &&
5514
+ isInteractiveFrame !== true &&
5515
+ shouldUpdate !== true &&
5516
+ themeAnimatedThisFrame !== true &&
5517
+ hasContinuousThemeAnimationFrame !== true &&
5518
+ shouldRenderCss3dFrame !== true &&
5519
+ shouldSyncTextOverlays !== true &&
5520
+ hasPendingAnimationWakeWork !== true &&
5521
+ hasCursorBlinkTarget === true;
5522
+ nextAnimationLoopDelayMs = shouldDelayAfterCursorOnlyFrame ? cursorBlinkWakeDelayMs : 0;
5484
5523
  this._lastAnimationLoopDelayMs = nextAnimationLoopDelayMs;
5485
5524
  this._animationLoopExecuting = false;
5486
5525
  this._scheduleAnimationLoop(loop, nextAnimationLoopDelayMs);
@@ -6182,6 +6182,10 @@
6182
6182
 
6183
6183
  function getMemoIconKey(nodeModel) {
6184
6184
  const semanticType = getNodeSemanticType(nodeModel);
6185
+ if (semanticType === REMOTE_FLEET_SEMANTIC_TYPE) {
6186
+ return 'network-wired';
6187
+ }
6188
+
6185
6189
  if (semanticType === 'MindCanvasAgent' || semanticType === 'AgentCommand') {
6186
6190
  return 'robot';
6187
6191
  }
@@ -558,7 +558,7 @@
558
558
  }
559
559
 
560
560
  const base = '_content/MindExecution.Shared/js/';
561
- const scriptVersion = '20260613-remote-screen-monitor-v492';
561
+ const scriptVersion = '20260613-cursor-blink-remote-icon-v493';
562
562
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
563
563
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
564
564
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "pdZBY4HV",
2
+ "version": "dzmlSBJx",
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-OmYQpvRRLwtglr/vxtxNehzAsxu7ff8XxkT2YNxwLWs=",
81
+ "hash": "sha256-LtkB8IRvIm+FJDH5Kx4zNth2hyesdL4YqTPJylSkcHY=",
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
83
83
  },
84
84
  {
@@ -86,7 +86,7 @@
86
86
  "url": "_content/MindExecution.Shared/js/mind-map-core.js.backup"
87
87
  },
88
88
  {
89
- "hash": "sha256-evnO3l4V8QouakV955IY87wMR6kYuXQU5LEAjOjONO0=",
89
+ "hash": "sha256-wZrUQUYTsiH7hkHaZPeEBdqG+r+e2UDR9vqZmyARSFg=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-BUjUsG/CTn5wyAwuO52yc0McqhRH8QVA7dDCN+LuIBE=",
837
+ "hash": "sha256-6JYaZ2X3Gg9XoAZomsa4QjcmaQDb7YpKcGVGvxLSXTg=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: pdZBY4HV */
1
+ /* Manifest version: dzmlSBJx */
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