@mindexec/cli 0.2.308 → 0.2.309

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.308",
3
+ "version": "0.2.309",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -1484,17 +1484,36 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1484
1484
 
1485
1485
  .mind-map-text-overlay-v2-card.is-passive {
1486
1486
  pointer-events: none;
1487
- /* CSS3D owns card background/edge; passive overlay only contributes
1488
- readable text fragments and must never paint over CSS3D node chrome. */
1487
+ /* Passive overlay paints screen-space chrome for text-like nodes so the
1488
+ user does not see CSS3D's camera-scaled hard card edge in NEAR. */
1489
1489
  contain: layout style;
1490
1490
  overflow: visible;
1491
- background: transparent !important;
1492
- background-color: transparent !important;
1491
+ background: rgba(255, 255, 255, 0.985) !important;
1492
+ background-color: rgba(255, 255, 255, 0.985) !important;
1493
1493
  background-image: none !important;
1494
+ border: 1px solid rgba(55, 65, 81, 0.28) !important;
1495
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05) !important;
1496
+ border-radius: 2px !important;
1497
+ outline: none !important;
1498
+ }
1499
+
1500
+ .mind-map-text-overlay-v2-card.is-passive[data-content-type="memo"],
1501
+ .mind-map-text-overlay-v2-card.is-passive[data-content-type="note"] {
1502
+ border-color: rgba(55, 65, 81, 0.18) !important;
1503
+ border-radius: 6px !important;
1504
+ }
1505
+
1506
+ .mind-map-text-overlay-v2-card.is-passive[data-content-type="code"],
1507
+ .mind-map-text-overlay-v2-card.is-passive[data-content-type="text"],
1508
+ .mind-map-text-overlay-v2-card.is-passive[data-content-type="markdown"] {
1509
+ border-radius: 1px !important;
1494
1510
  }
1495
1511
 
1496
1512
  .mind-map-text-overlay-v2-card.is-passive .mind-map-text-overlay-v2-body {
1497
1513
  pointer-events: auto;
1514
+ text-rendering: auto;
1515
+ -webkit-font-smoothing: auto;
1516
+ -moz-osx-font-smoothing: auto;
1498
1517
  }
1499
1518
 
1500
1519
  .mind-map-text-overlay-v2-shell {
@@ -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 = '20260621-video-prefetch-v785';
8
+ const MINDMAP_CORE_BUILD_ID = '20260621-near-lod-pixel-snap-v790';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -77,7 +77,7 @@
77
77
  });
78
78
  const CanvasPhaseSet = new Set(Object.values(CanvasPhase));
79
79
  const VIEWPORT_METRICS_POLL_INTERVAL = 480;
80
- const PASSIVE_DOM_OVERLAY_RUNTIME_ENABLED = false;
80
+ const PASSIVE_DOM_OVERLAY_RUNTIME_ENABLED = true;
81
81
  const PASSIVE_OVERLAY_ZOOM_DEFER_VISIBLE_THRESHOLD = 24;
82
82
  const PASSIVE_OVERLAY_INTERACTIVE_REFRESH_INTERVAL_MS = 48;
83
83
  const PASSIVE_OVERLAY_INTERACTIVE_DENSE_REFRESH_INTERVAL_MS = 72;
@@ -9023,6 +9023,16 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
9023
9023
  const overlayV2State = useTextOverlayV2 && shouldTrackTextOverlayDirty
9024
9024
  ? (this._textOverlayV2State || null)
9025
9025
  : null;
9026
+ let hasVisibleOverlayV2Card = false;
9027
+ if (overlayV2State?.cards?.forEach) {
9028
+ overlayV2State.cards.forEach(card => {
9029
+ if (hasVisibleOverlayV2Card || !card || card.style.display === 'none') {
9030
+ return;
9031
+ }
9032
+
9033
+ hasVisibleOverlayV2Card = true;
9034
+ });
9035
+ }
9026
9036
  const hasOverlayV2DirtyState = !!(
9027
9037
  overlayV2State && (
9028
9038
  overlayV2State.dirtyLayout === true ||
@@ -9033,6 +9043,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
9033
9043
  );
9034
9044
  const hasOverlayFocus = hasFocusedTextOverlay || hasEditingOverlay;
9035
9045
  const hasMotionBlockingOverlayFocus = hasEditingOverlay;
9046
+ const shouldCleanupInactivePassiveOverlay =
9047
+ useTextOverlayV2 &&
9048
+ hasVisibleOverlayV2Card === true &&
9049
+ shouldRenderPassiveDomTextOverlay !== true &&
9050
+ hasLiveInteractiveDomOverlay !== true &&
9051
+ !hasOverlayFocus;
9036
9052
  const visibleOverlayCount = isPassiveDomOverlayRuntimeEnabled
9037
9053
  ? Math.max(
9038
9054
  Number(this._visibleIds?.size || 0),
@@ -9563,7 +9579,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
9563
9579
  const shouldSyncTextOverlays =
9564
9580
  effectiveOverlayDirty === true ||
9565
9581
  (useTextOverlayV2
9566
- ? (hasOverlayV2DirtyState || shouldRefreshPassiveDomTextOverlay || shouldFinalizePassiveOverlayLayout || (hasMotionBlockingOverlayFocus && shouldUpdateCss3d))
9582
+ ? (hasOverlayV2DirtyState || shouldCleanupInactivePassiveOverlay || shouldRefreshPassiveDomTextOverlay || shouldFinalizePassiveOverlayLayout || (hasMotionBlockingOverlayFocus && shouldUpdateCss3d))
9567
9583
  : (hasMotionBlockingOverlayFocus && shouldUpdateCss3d));
9568
9584
  const shouldAttemptPassiveOverlayCameraFastPath =
9569
9585
  useTextOverlayV2 &&
@@ -51,7 +51,7 @@
51
51
  // ▲▲▲ [Usage] ▲▲▲
52
52
 
53
53
  // Procedural line rendering settings
54
- const LOD_RENDERER_BUILD_ID = '20260621-video-prefetch-v785';
54
+ const LOD_RENDERER_BUILD_ID = '20260621-near-lod-pixel-snap-v790';
55
55
  const DirtyKind = Object.freeze({
56
56
  ResidentFullRebuild: 'resident-full-rebuild',
57
57
  ResidentPatch: 'resident-patch',
@@ -4482,13 +4482,41 @@ const LOD_RENDERER_BUILD_ID = '20260621-video-prefetch-v785';
4482
4482
  }
4483
4483
  }
4484
4484
 
4485
+ _restoreVisibleCss3dHighDetailForNear(nodeObjectsById, module, lodBand) {
4486
+ if (lodBand !== 'NEAR' || !nodeObjectsById) {
4487
+ return 0;
4488
+ }
4489
+
4490
+ let restoredCount = 0;
4491
+ for (const entry of nodeObjectsById.values()) {
4492
+ const cssElement = entry?.cssObject?.element || null;
4493
+ if (!cssElement ||
4494
+ entry.cssObject?.visible !== true ||
4495
+ cssElement.style.display === 'none' ||
4496
+ !cssElement.classList?.contains?.('lod-low')) {
4497
+ continue;
4498
+ }
4499
+
4500
+ this._setCss3dLodClass(entry, true);
4501
+ restoredCount++;
4502
+ }
4503
+
4504
+ if (restoredCount > 0 && module) {
4505
+ module._css3dVisualChangedThisFrame = true;
4506
+ module._css3dVisualChangedSinceLastRender = true;
4507
+ }
4508
+
4509
+ return restoredCount;
4510
+ }
4511
+
4485
4512
  _shouldUseHighCss3dDetail(entry, module) {
4486
4513
  const cameraZ = Number(module?.camera?.position?.z || 0);
4487
- const lodBand = this._currentLodBand || getLodBandForCameraZ(cameraZ);
4488
- if (lodBand === 'NEAR') {
4514
+ const cameraBand = getLodBandForCameraZ(cameraZ);
4515
+ if (cameraBand === 'NEAR') {
4489
4516
  return true;
4490
4517
  }
4491
4518
 
4519
+ const lodBand = this._currentLodBand || cameraBand;
4492
4520
  const nodeId = String(entry?.model?.id || entry?.model?.Id || entry?.glObject?.userData?.nodeId || '').trim();
4493
4521
  const selectedNodeId = String(module?.selectedNodeIdJs || module?.selectedNodeId || '').trim();
4494
4522
  if (nodeId && selectedNodeId && nodeId === selectedNodeId) {
@@ -6010,6 +6038,7 @@ const LOD_RENDERER_BUILD_ID = '20260621-video-prefetch-v785';
6010
6038
  // ▼▼▼ [Fix] Keep CSS3D visibility synced while panning in near mode ▼▼▼
6011
6039
  if (!this.isInLODMode) {
6012
6040
  this._currentLodBand = lodBand;
6041
+ this._restoreVisibleCss3dHighDetailForNear(nodeObjectsById, module, lodBand);
6013
6042
  const visibleIds = this._getNearVisibleIds(module);
6014
6043
  if (!visibleIds || visibleIds.size === 0) {
6015
6044
  perfTime('fullResHandoff', () => {
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  const DEBUG = false;
5
- const PASSIVE_DOM_OVERLAY_ENABLED = false;
5
+ const PASSIVE_DOM_OVERLAY_ENABLED = true;
6
6
  const DEFAULT_OVERLAY_SCROLLABLE_SELECTOR = '.node-response, .note-content, .markdown-body, .prose, .note-textarea, .code-body, .code-content, .pdf-content, .text-content, .file-content, .map-node-memo__body, .map-node-memo__body-view, .map-node-memo__agent-plan-body, .map-node-memo__agent-console-body, pre, code';
7
7
  const PASSIVE_OVERLAY_NEAR_EXIT_GRACE_MS = 220;
8
8
  const PASSIVE_OVERLAY_CANDIDATE_GRACE_MS = 160;
@@ -336,7 +336,7 @@
336
336
  state.passiveNearStickyUntil = 0;
337
337
  }
338
338
 
339
- return hasVisibleLiveInteractiveOverlayCandidate(module);
339
+ return false;
340
340
  }
341
341
 
342
342
  function shouldUseVisiblePassiveOverlayCandidates(module) {
@@ -956,10 +956,6 @@
956
956
  return false;
957
957
  }
958
958
 
959
- if (entry && supportsTextOverlayEntry(entry)) {
960
- return false;
961
- }
962
-
963
959
  return true;
964
960
  }
965
961
 
@@ -1298,6 +1294,29 @@
1298
1294
  return Math.max(baseZIndex, candidate + baseZIndex);
1299
1295
  }
1300
1296
 
1297
+ function getDevicePixelRatio() {
1298
+ const dpr = Number(globalThis?.devicePixelRatio || 1);
1299
+ return Number.isFinite(dpr) && dpr > 0 ? Math.min(4, Math.max(1, dpr)) : 1;
1300
+ }
1301
+
1302
+ function snapScreenPixel(value, dpr = getDevicePixelRatio()) {
1303
+ const numeric = Number(value || 0);
1304
+ if (!Number.isFinite(numeric)) {
1305
+ return 0;
1306
+ }
1307
+
1308
+ return Math.round(numeric * dpr) / dpr;
1309
+ }
1310
+
1311
+ function snapScreenLength(value, dpr = getDevicePixelRatio()) {
1312
+ const numeric = Number(value || 0);
1313
+ if (!Number.isFinite(numeric)) {
1314
+ return 1;
1315
+ }
1316
+
1317
+ return Math.max(1 / dpr, Math.round(Math.max(1 / dpr, numeric) * dpr) / dpr);
1318
+ }
1319
+
1301
1320
  function applyPlacement(module, element, rect, zIndex, entry = null) {
1302
1321
  if (!module || !element || !rect) {
1303
1322
  return;
@@ -1305,8 +1324,13 @@
1305
1324
 
1306
1325
  const baseWidth = Math.max(1, Number(rect.baseWidth || rect.width || 1));
1307
1326
  const baseHeight = Math.max(1, Number(rect.baseHeight || rect.height || 1));
1308
- const scaleX = Number(rect.width || baseWidth) / baseWidth;
1309
- const scaleY = Number(rect.height || baseHeight) / baseHeight;
1327
+ const dpr = getDevicePixelRatio();
1328
+ const left = snapScreenPixel(rect.left || 0, dpr);
1329
+ const top = snapScreenPixel(rect.top || 0, dpr);
1330
+ const width = snapScreenLength(rect.width || baseWidth || 1, dpr);
1331
+ const height = snapScreenLength(rect.height || baseHeight || 1, dpr);
1332
+ const scaleX = width / baseWidth;
1333
+ const scaleY = height / baseHeight;
1310
1334
  const preferCssZoom = shouldPreferOverlayCssZoom(module, entry);
1311
1335
  const canUseZoom =
1312
1336
  preferCssZoom &&
@@ -1318,10 +1342,10 @@
1318
1342
  const shell = element.firstElementChild || null;
1319
1343
 
1320
1344
  element.style.display = 'block';
1321
- element.style.left = `${Number(rect.left || 0)}px`;
1322
- element.style.top = `${Number(rect.top || 0)}px`;
1323
- element.style.width = `${Math.max(1, Number(rect.width || baseWidth || 1))}px`;
1324
- element.style.height = `${Math.max(1, Number(rect.height || baseHeight || 1))}px`;
1345
+ element.style.left = `${left}px`;
1346
+ element.style.top = `${top}px`;
1347
+ element.style.width = `${width}px`;
1348
+ element.style.height = `${height}px`;
1325
1349
  element.style.transform = '';
1326
1350
  element.style.zoom = '';
1327
1351
  applyScrollbarScaleCompensation(element, scaleX, scaleY);
@@ -1336,14 +1360,18 @@
1336
1360
  applyScrollbarScaleCompensation(shell, scaleX, scaleY);
1337
1361
 
1338
1362
  if (canUseZoom) {
1339
- shell.style.zoom = `${scaleX}`;
1363
+ shell.style.zoom = `${Math.max(0.01, Math.round(scaleX * 100000) / 100000)}`;
1340
1364
  module._overlayDebugPlacementZoomCount = Number(module._overlayDebugPlacementZoomCount || 0) + 1;
1341
1365
  } else {
1342
- shell.style.transform = `scale(${scaleX}, ${scaleY})`;
1366
+ const snappedScaleX = Math.max(0.01, Math.round(scaleX * 100000) / 100000);
1367
+ const snappedScaleY = Math.max(0.01, Math.round(scaleY * 100000) / 100000);
1368
+ shell.style.transform = `scale(${snappedScaleX}, ${snappedScaleY})`;
1343
1369
  module._overlayDebugPlacementTransformCount = Number(module._overlayDebugPlacementTransformCount || 0) + 1;
1344
1370
  }
1345
1371
  } else if (!canUseZoom) {
1346
- element.style.transform = `scale(${scaleX}, ${scaleY})`;
1372
+ const snappedScaleX = Math.max(0.01, Math.round(scaleX * 100000) / 100000);
1373
+ const snappedScaleY = Math.max(0.01, Math.round(scaleY * 100000) / 100000);
1374
+ element.style.transform = `scale(${snappedScaleX}, ${snappedScaleY})`;
1347
1375
  module._overlayDebugPlacementTransformCount = Number(module._overlayDebugPlacementTransformCount || 0) + 1;
1348
1376
  }
1349
1377
  element.style.zIndex = String(resolveOverlayZIndex(entry, zIndex));
@@ -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=20260621-video-prefetch-v785" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260621-video-prefetch-v785" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260621-near-lod-pixel-snap-v790" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260621-near-lod-pixel-snap-v790" />
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 = '20260621-video-prefetch-v785';
582
+ const scriptVersion = '20260621-near-lod-pixel-snap-v790';
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": "jBFdtOmP",
2
+ "version": "qR19js7U",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -42,7 +42,7 @@
42
42
  "url": "_content/MindExecution.Shared/css/app.css"
43
43
  },
44
44
  {
45
- "hash": "sha256-QyE+9OXJBCXf5eXHuMaxnGjVAMIuQr72tNhfSCk6nro=",
45
+ "hash": "sha256-uUo6RfwT80RrRI95nGw6SISUrer/BE9+7P3yVivBYXQ=",
46
46
  "url": "_content/MindExecution.Shared/css/mind-map-overrides.css"
47
47
  },
48
48
  {
@@ -78,7 +78,7 @@
78
78
  "url": "_content/MindExecution.Shared/js/marked.min.js"
79
79
  },
80
80
  {
81
- "hash": "sha256-bcZumly3UqFp3yXp94h51Uect2dFJXYGVRKxtJkh4HE=",
81
+ "hash": "sha256-5WxowCqXOM5gcHZIaCotoNvWIC1paUc/UWdcQ0tqaXo=",
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-btpizB1MkhK5bRl7BmaL4+ZNHh2bZrg160eaiBbzRy8=",
117
+ "hash": "sha256-Nct6u0jhFqOSEzDDBROMfhB4SvUw0yb2DK065toNffk=",
118
118
  "url": "_content/MindExecution.Shared/js/mind-map-lod-renderer.js"
119
119
  },
120
120
  {
@@ -154,7 +154,7 @@
154
154
  "url": "_content/MindExecution.Shared/js/mind-map-text-lod-system.js"
155
155
  },
156
156
  {
157
- "hash": "sha256-pEdLlTuNhb8coOCRcx1fX+xLyD8ATKxwR8CXupgbgtk=",
157
+ "hash": "sha256-zGfIZ50rYA0nDkeMNB+wv2WRhssu6lHXb5ERwvLbcq4=",
158
158
  "url": "_content/MindExecution.Shared/js/mind-map-text-overlay-v2.js"
159
159
  },
160
160
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-mvQ5z9xIyVIoYzxOcaAL8lUhs30CGFe2NcbVq3Wa0AU=",
837
+ "hash": "sha256-5IzHBpG6V4csffSXfPHWC7BKgybKjT61K0dk0XOOvWE=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: jBFdtOmP */
1
+ /* Manifest version: qR19js7U */
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