@mindexec/cli 0.2.297 → 0.2.299

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.297",
3
+ "version": "0.2.299",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -95,6 +95,22 @@ body.mind-map-scroll-locked {
95
95
  transform: translateZ(0);
96
96
  }
97
97
 
98
+ .css3d-resolution-wrapper > .map-node,
99
+ .css3d-resolution-wrapper > .map-node-bubble,
100
+ .css3d-resolution-wrapper > .map-node-note,
101
+ .css3d-resolution-wrapper > .map-node-memo,
102
+ .css3d-resolution-wrapper > .map-node-file,
103
+ .css3d-resolution-wrapper > .map-node-image,
104
+ .css3d-resolution-wrapper > .map-node-code {
105
+ contain: layout style !important;
106
+ content-visibility: visible !important;
107
+ contain-intrinsic-size: auto !important;
108
+ transform: var(--css3d-node-resolution-transform, none) !important;
109
+ will-change: auto !important;
110
+ -webkit-backface-visibility: visible !important;
111
+ backface-visibility: visible !important;
112
+ }
113
+
98
114
  .css3d-resolution-wrapper.node-type-image img,
99
115
  .css3d-resolution-wrapper.node-type-video video,
100
116
  .css3d-resolution-wrapper.node-type-embed iframe,
@@ -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-resident-schema-noop-v755';
8
+ const MINDMAP_CORE_BUILD_ID = '20260620-css3d-single-aa-v758';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -1714,6 +1714,9 @@
1714
1714
  elapsedSinceZoomInput > CAMERA_ZOOM_END_DELAY_MS) {
1715
1715
  return false;
1716
1716
  }
1717
+ if (module.lodRenderer?.willLodBandChange?.(module.camera) === true) {
1718
+ return false;
1719
+ }
1717
1720
 
1718
1721
  module._viewSyncMotionActive = true;
1719
1722
  module._cameraMovingThisFrame = false;
@@ -10321,11 +10324,26 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
10321
10324
  this.targetY = y;
10322
10325
  this.targetZ = z;
10323
10326
  this.camera.position.set(x, y, z);
10327
+ this.camera.updateProjectionMatrix?.();
10328
+ this.camera.updateMatrixWorld?.(true);
10329
+
10330
+ if (typeof this.updateVisibility === 'function') {
10331
+ this.updateVisibility(this.camera);
10332
+ }
10333
+ if (this.lodRenderer) {
10334
+ if (typeof this.lodRenderer.requestVisualRefresh === 'function') {
10335
+ this.lodRenderer.requestVisualRefresh('camera-state-change');
10336
+ }
10337
+ if (this.nodeObjectsById && typeof this.lodRenderer.updateLOD === 'function') {
10338
+ this.lodRenderer.updateLOD(this.camera, this.nodeObjectsById, this);
10339
+ }
10340
+ }
10324
10341
 
10325
10342
  if (cursorX !== undefined && cursorY !== undefined) {
10326
10343
  this.updateCursorPosition(cursorX, cursorY, false, null, false);
10327
10344
  }
10328
10345
  requestCameraNavigationOverlayRefresh(this, 4);
10346
+ this._forceUpdateFrames = Math.max(Number(this._forceUpdateFrames || 0), 2);
10329
10347
  this._lastPersistedViewStateKey = this.buildViewStateKey(this.buildViewStateSnapshot());
10330
10348
  }
10331
10349
 
@@ -15,6 +15,8 @@
15
15
  const CSS_IMAGE_PROMOTION_BUDGET_MS = 4;
16
16
  const CSS_IMAGE_BLOB_CACHE_LIMIT = 160;
17
17
  const CSS_IMAGE_DISPLAY_MAX_CONCURRENCY = 8;
18
+ const CSS3D_TEXT_NODE_RESOLUTION_SCALE = 2.0;
19
+ const CSS3D_MEDIA_NODE_RESOLUTION_SCALE = 1.0;
18
20
  const LOOPBACK_ASSET_URL_REGEX = /^http:\/\/(?:127(?:\.\d{1,3}){3}|localhost|\[::1\])(?::\d+)?\/assets\//i;
19
21
  let _cssImagePreviewHoldUntil = 0;
20
22
  let _cssImagePromotionQueue = [];
@@ -57,6 +59,15 @@
57
59
 
58
60
  syncMindCanvasPlatformRenderClasses();
59
61
 
62
+ function getCss3dNodeResolutionScale(contentTypeLower) {
63
+ const type = String(contentTypeLower || '').toLowerCase();
64
+ if (type === 'image' || type === 'video' || type === 'embed') {
65
+ return CSS3D_MEDIA_NODE_RESOLUTION_SCALE;
66
+ }
67
+
68
+ return CSS3D_TEXT_NODE_RESOLUTION_SCALE;
69
+ }
70
+
60
71
  function detectCsvDelimiter(csvText) {
61
72
  const text = String(csvText || '');
62
73
  const candidates = [',', '\t', ';', '|'];
@@ -22785,7 +22796,7 @@
22785
22796
  clonedElement.style.transformOrigin = '0% 0%';
22786
22797
 
22787
22798
  // ▼▼▼ [Clarity] Scale factor for high-resolution rendering ▼▼▼
22788
- const resolutionScale = 1.0;
22799
+ const resolutionScale = getCss3dNodeResolutionScale(contentTypeLower);
22789
22800
  clonedElement.style.width = `${width}px`;
22790
22801
  clonedElement.style.height = `${height}px`;
22791
22802
  clonedElement.style.minWidth = `${width}px`;
@@ -22803,7 +22814,9 @@
22803
22814
  clonedElement.style.top = '0px';
22804
22815
  // ▲▲▲ [Changed] ▲▲▲
22805
22816
 
22806
- clonedElement.style.transform = resolutionScale === 1 ? 'none' : `scale(${resolutionScale})`;
22817
+ const innerResolutionTransform = resolutionScale === 1 ? 'none' : `scale(${resolutionScale})`;
22818
+ clonedElement.style.transform = innerResolutionTransform;
22819
+ clonedElement.style.setProperty('--css3d-node-resolution-transform', innerResolutionTransform);
22807
22820
  clonedElement.style.transformOrigin = '0 0'; // Scale from top-left
22808
22821
  clonedElement.style.transition = 'none';
22809
22822
  clonedElement.style.webkitTransition = 'none';
@@ -23032,6 +23045,7 @@
23032
23045
  }
23033
23046
  const inner = el.firstElementChild;
23034
23047
  if (inner) {
23048
+ const innerResolutionTransform = resolutionScale === 1 ? 'none' : `scale(${resolutionScale})`;
23035
23049
  if (inner.style.width !== `${worldWidth}px`) {
23036
23050
  inner.style.width = `${worldWidth}px`;
23037
23051
  }
@@ -23050,10 +23064,13 @@
23050
23064
  if (inner.style.maxHeight !== `${worldHeight}px`) {
23051
23065
  inner.style.maxHeight = `${worldHeight}px`;
23052
23066
  }
23053
- if (inner.style.transform !== `scale(${resolutionScale})`) {
23054
- inner.style.transform = `scale(${resolutionScale})`;
23067
+ if (inner.style.transform !== innerResolutionTransform) {
23068
+ inner.style.transform = innerResolutionTransform;
23055
23069
  inner.style.transformOrigin = '0 0';
23056
23070
  }
23071
+ if (inner.style.getPropertyValue('--css3d-node-resolution-transform') !== innerResolutionTransform) {
23072
+ inner.style.setProperty('--css3d-node-resolution-transform', innerResolutionTransform);
23073
+ }
23057
23074
  }
23058
23075
  }
23059
23076
 
@@ -51,7 +51,7 @@
51
51
  // ▲▲▲ [Usage] ▲▲▲
52
52
 
53
53
  // Procedural line rendering settings
54
- const LOD_RENDERER_BUILD_ID = '20260620-ua-resident-schema-noop-v755';
54
+ const LOD_RENDERER_BUILD_ID = '20260620-css3d-single-aa-v758';
55
55
  const DirtyKind = Object.freeze({
56
56
  ResidentFullRebuild: 'resident-full-rebuild',
57
57
  ResidentPatch: 'resident-patch',
@@ -940,9 +940,11 @@
940
940
  this._fullResHandoffStartedAt = 0;
941
941
  this._fullResHandoffUntil = 0;
942
942
  this._fullResHandoffPreviousBand = null;
943
+ this._fullResHandoffEnabled = false;
943
944
  this._fullResHandoffMinCoverage = 0.92;
944
945
  this._fullResHandoffMaxMs = 1400;
945
946
  this._fullResPanHandoffMaxMs = 1200;
947
+ this._fullResHandoffHardMaxMs = 2600;
946
948
  this._tmpWorldPos = new THREE.Vector3();
947
949
  this._tmpWorldQuat = new THREE.Quaternion();
948
950
  this._tmpWorldScale = new THREE.Vector3();
@@ -2532,6 +2534,10 @@
2532
2534
 
2533
2535
  _startFullResHandoff(previousBand, reason, maxMs = this._fullResHandoffMaxMs) {
2534
2536
  if (this.isLoading || this.isInLODMode !== false) return;
2537
+ if (this._fullResHandoffEnabled !== true) {
2538
+ this._finishFullResHandoff('disabled');
2539
+ return;
2540
+ }
2535
2541
 
2536
2542
  const now = performance.now();
2537
2543
  const duration = Number.isFinite(maxMs) ? maxMs : this._fullResHandoffMaxMs;
@@ -2560,6 +2566,12 @@
2560
2566
  return;
2561
2567
  }
2562
2568
 
2569
+ emitMindCanvasTrace('lod.fullResHandoff.finish', this._module, {
2570
+ reason: String(reason || 'unknown'),
2571
+ build: LOD_RENDERER_BUILD_ID,
2572
+ previousBand: this._fullResHandoffPreviousBand || null,
2573
+ ageMs: Math.max(0, performance.now() - Number(this._fullResHandoffStartedAt || performance.now()))
2574
+ });
2563
2575
  this._fullResHandoffActive = false;
2564
2576
  this._fullResHandoffStartedAt = 0;
2565
2577
  this._fullResHandoffUntil = 0;
@@ -2582,11 +2594,13 @@
2582
2594
  let visibleCssCount = 0;
2583
2595
  let pendingCssCount = 0;
2584
2596
  let pendingImageCssCount = 0;
2597
+ let pendingNonImageCssCount = 0;
2585
2598
  for (const nodeId of visibleIds) {
2586
2599
  const entry = nodeObjectsById.get(nodeId);
2587
2600
  if (!entry || !supportsCss3dNodeModel(entry.model)) continue;
2588
2601
 
2589
2602
  eligibleCount++;
2603
+ const contentType = getNodeContentType(entry.model);
2590
2604
  const element = entry.cssObject?.element;
2591
2605
  const cssVisible =
2592
2606
  this._nearCssVisibleIds.has(nodeId) &&
@@ -2595,13 +2609,15 @@
2595
2609
  element.style.display !== 'none';
2596
2610
  if (!cssVisible) {
2597
2611
  pendingCssCount++;
2598
- if (getNodeContentType(entry.model) === 'image') {
2612
+ if (contentType === 'image') {
2599
2613
  pendingImageCssCount++;
2614
+ } else {
2615
+ pendingNonImageCssCount++;
2600
2616
  }
2601
2617
  continue;
2602
2618
  }
2603
2619
 
2604
- if (getNodeContentType(entry.model) === 'image') {
2620
+ if (contentType === 'image') {
2605
2621
  if (this._isCssImageReady(entry)) {
2606
2622
  visibleCssCount++;
2607
2623
  } else {
@@ -2623,15 +2639,30 @@
2623
2639
  this._css3dProcessing !== true &&
2624
2640
  this._nearEntryBoostFrames <= 0;
2625
2641
  const hasPendingCss = pendingCssCount > 0;
2626
- const timedOut = performance.now() >= this._fullResHandoffUntil;
2642
+ const now = performance.now();
2643
+ const timedOut = now >= this._fullResHandoffUntil;
2644
+ const handoffAgeMs = Math.max(0, now - Number(this._fullResHandoffStartedAt || now));
2645
+ const hardTimedOut = handoffAgeMs >= this._fullResHandoffHardMaxMs;
2627
2646
  const hasPendingImageCss = pendingImageCssCount > 0;
2628
- const coverageReady = coverage >= this._fullResHandoffMinCoverage && !hasPendingImageCss;
2647
+ const hasPendingNonImageCss = pendingNonImageCssCount > 0;
2648
+ const coverageReady = coverage >= this._fullResHandoffMinCoverage && !hasPendingNonImageCss;
2629
2649
  const idleReady = queueIdle && !hasPendingCss && !hasPendingImageCss;
2630
-
2631
- if (coverageReady || idleReady) {
2632
- this._finishFullResHandoff(idleReady ? 'queue-idle-all-css-visible' : 'coverage');
2650
+ const imageOnlyTimeoutReady = timedOut &&
2651
+ hasPendingImageCss &&
2652
+ !hasPendingNonImageCss &&
2653
+ visibleCssCount > 0;
2654
+ const hardTimeoutReady = hardTimedOut &&
2655
+ (coverage >= 0.5 || visibleCssCount > 0 || queueIdle);
2656
+
2657
+ if (coverageReady || idleReady || imageOnlyTimeoutReady || hardTimeoutReady) {
2658
+ this._finishFullResHandoff(
2659
+ idleReady ? 'queue-idle-all-css-visible' :
2660
+ imageOnlyTimeoutReady ? 'timeout-image-css' :
2661
+ hardTimeoutReady ? 'hard-timeout' :
2662
+ 'coverage'
2663
+ );
2633
2664
  } else {
2634
- if (timedOut && hasPendingCss) {
2665
+ if (timedOut && hasPendingCss && !hardTimedOut) {
2635
2666
  this._fullResHandoffUntil = Math.max(
2636
2667
  Number(this._fullResHandoffUntil || 0),
2637
2668
  performance.now() + this._fullResPanHandoffMaxMs
@@ -2644,6 +2675,7 @@
2644
2675
  }
2645
2676
 
2646
2677
  _maybeStartFullResHandoffForPendingCss(visibleIds, nodeObjectsById, module, previousBand) {
2678
+ if (this._fullResHandoffEnabled !== true) return;
2647
2679
  if (this._fullResHandoffActive || this.isInLODMode || this.isLoading) return;
2648
2680
  if (!visibleIds || visibleIds.size === 0 || !nodeObjectsById) return;
2649
2681
  if (module?.isPanning !== true && this._nearEntryBoostFrames <= 0) return;
@@ -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-resident-schema-noop-v755" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-ua-resident-schema-noop-v755" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-css3d-single-aa-v758" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-css3d-single-aa-v758" />
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-resident-schema-noop-v755';
582
+ const scriptVersion = '20260620-css3d-single-aa-v758';
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": "YH25K8sb",
2
+ "version": "Lnn9EG9z",
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-zsNb+3FjEoGDJ9DgMdmdUDcqtZZutCCxWLOD11C0c00=",
45
+ "hash": "sha256-vVQG8dZd8XPd5lEd2meBWtET9S2XmSjWYfRG4FlMdIU=",
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-nLoLyFnrQWw0WNrmyJYptH4WuiklwW9teJaA5OTkMHQ=",
81
+ "hash": "sha256-raydXreUnr7yxmsjp+XyoxUPnVTYKhB41VU1PLq3PCE=",
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-7EaYYlLCVJUt4lVERVxZG+LFs6pU84WbUElA89mnmlE=",
89
+ "hash": "sha256-3l5a2qua37GH1l1Use9Uvs+gcyAssbWa3EX3BKEATng=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -114,7 +114,7 @@
114
114
  "url": "_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js"
115
115
  },
116
116
  {
117
- "hash": "sha256-M7N27m0+FOdOLRnYz1TG80HZArq4myZjBcTXBQ8awV0=",
117
+ "hash": "sha256-iLW9QMJ9V9dlbrTy237dLYkCEZYYNiyXIf9NNPAIElE=",
118
118
  "url": "_content/MindExecution.Shared/js/mind-map-lod-renderer.js"
119
119
  },
120
120
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-fMClm7fwJVb8a6qwDJy0W2Yz2LFw6C1nkl0dZWgNEoA=",
837
+ "hash": "sha256-aAhit/PSlXG9mUxc/uVhPIv5tlk5grTes5A5/VERvCk=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: YH25K8sb */
1
+ /* Manifest version: Lnn9EG9z */
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