@mindexec/cli 0.2.296 → 0.2.298

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.296",
3
+ "version": "0.2.298",
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: 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-flat-camera-pan-y-v754';
8
+ const MINDMAP_CORE_BUILD_ID = '20260620-fullres-handoff-aa-v756';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -2526,7 +2526,7 @@
2526
2526
  }
2527
2527
  });
2528
2528
 
2529
- module.lodRenderer?.requestResidentPatch?.('resident-schema-change');
2529
+ module.lodRenderer?.requestResidentSchemaSync?.('render-debug-flags');
2530
2530
 
2531
2531
  if ((!flags.enableCss3dWillChange || !flags.enableCss3d) && window.MindMapCss3DManager?.setWillChange) {
2532
2532
  window.MindMapCss3DManager.setWillChange(false, module);
@@ -51,7 +51,7 @@
51
51
  // ▲▲▲ [Usage] ▲▲▲
52
52
 
53
53
  // Procedural line rendering settings
54
- const LOD_RENDERER_BUILD_ID = '20260620-flat-camera-pan-y-v754';
54
+ const LOD_RENDERER_BUILD_ID = '20260620-fullres-handoff-aa-v756';
55
55
  const DirtyKind = Object.freeze({
56
56
  ResidentFullRebuild: 'resident-full-rebuild',
57
57
  ResidentPatch: 'resident-patch',
@@ -943,6 +943,7 @@
943
943
  this._fullResHandoffMinCoverage = 0.92;
944
944
  this._fullResHandoffMaxMs = 1400;
945
945
  this._fullResPanHandoffMaxMs = 1200;
946
+ this._fullResHandoffHardMaxMs = 2600;
946
947
  this._tmpWorldPos = new THREE.Vector3();
947
948
  this._tmpWorldQuat = new THREE.Quaternion();
948
949
  this._tmpWorldScale = new THREE.Vector3();
@@ -974,6 +975,7 @@
974
975
  this._residentBuilt = false;
975
976
  this._residentFullBuildCount = 0;
976
977
  this._lastResidentFullBuildReason = '';
978
+ this._lastAppliedResidentSchemaSignature = '';
977
979
  this._lastBlockedResidentRebuildReason = '';
978
980
  this._lastBlockedResidentRebuildAt = 0;
979
981
  this._postLoadVisualSyncPending = false;
@@ -2559,6 +2561,12 @@
2559
2561
  return;
2560
2562
  }
2561
2563
 
2564
+ emitMindCanvasTrace('lod.fullResHandoff.finish', this._module, {
2565
+ reason: String(reason || 'unknown'),
2566
+ build: LOD_RENDERER_BUILD_ID,
2567
+ previousBand: this._fullResHandoffPreviousBand || null,
2568
+ ageMs: Math.max(0, performance.now() - Number(this._fullResHandoffStartedAt || performance.now()))
2569
+ });
2562
2570
  this._fullResHandoffActive = false;
2563
2571
  this._fullResHandoffStartedAt = 0;
2564
2572
  this._fullResHandoffUntil = 0;
@@ -2581,11 +2589,13 @@
2581
2589
  let visibleCssCount = 0;
2582
2590
  let pendingCssCount = 0;
2583
2591
  let pendingImageCssCount = 0;
2592
+ let pendingNonImageCssCount = 0;
2584
2593
  for (const nodeId of visibleIds) {
2585
2594
  const entry = nodeObjectsById.get(nodeId);
2586
2595
  if (!entry || !supportsCss3dNodeModel(entry.model)) continue;
2587
2596
 
2588
2597
  eligibleCount++;
2598
+ const contentType = getNodeContentType(entry.model);
2589
2599
  const element = entry.cssObject?.element;
2590
2600
  const cssVisible =
2591
2601
  this._nearCssVisibleIds.has(nodeId) &&
@@ -2594,13 +2604,15 @@
2594
2604
  element.style.display !== 'none';
2595
2605
  if (!cssVisible) {
2596
2606
  pendingCssCount++;
2597
- if (getNodeContentType(entry.model) === 'image') {
2607
+ if (contentType === 'image') {
2598
2608
  pendingImageCssCount++;
2609
+ } else {
2610
+ pendingNonImageCssCount++;
2599
2611
  }
2600
2612
  continue;
2601
2613
  }
2602
2614
 
2603
- if (getNodeContentType(entry.model) === 'image') {
2615
+ if (contentType === 'image') {
2604
2616
  if (this._isCssImageReady(entry)) {
2605
2617
  visibleCssCount++;
2606
2618
  } else {
@@ -2622,15 +2634,30 @@
2622
2634
  this._css3dProcessing !== true &&
2623
2635
  this._nearEntryBoostFrames <= 0;
2624
2636
  const hasPendingCss = pendingCssCount > 0;
2625
- const timedOut = performance.now() >= this._fullResHandoffUntil;
2637
+ const now = performance.now();
2638
+ const timedOut = now >= this._fullResHandoffUntil;
2639
+ const handoffAgeMs = Math.max(0, now - Number(this._fullResHandoffStartedAt || now));
2640
+ const hardTimedOut = handoffAgeMs >= this._fullResHandoffHardMaxMs;
2626
2641
  const hasPendingImageCss = pendingImageCssCount > 0;
2627
- const coverageReady = coverage >= this._fullResHandoffMinCoverage && !hasPendingImageCss;
2642
+ const hasPendingNonImageCss = pendingNonImageCssCount > 0;
2643
+ const coverageReady = coverage >= this._fullResHandoffMinCoverage && !hasPendingNonImageCss;
2628
2644
  const idleReady = queueIdle && !hasPendingCss && !hasPendingImageCss;
2629
-
2630
- if (coverageReady || idleReady) {
2631
- this._finishFullResHandoff(idleReady ? 'queue-idle-all-css-visible' : 'coverage');
2645
+ const imageOnlyTimeoutReady = timedOut &&
2646
+ hasPendingImageCss &&
2647
+ !hasPendingNonImageCss &&
2648
+ visibleCssCount > 0;
2649
+ const hardTimeoutReady = hardTimedOut &&
2650
+ (coverage >= 0.5 || visibleCssCount > 0 || queueIdle);
2651
+
2652
+ if (coverageReady || idleReady || imageOnlyTimeoutReady || hardTimeoutReady) {
2653
+ this._finishFullResHandoff(
2654
+ idleReady ? 'queue-idle-all-css-visible' :
2655
+ imageOnlyTimeoutReady ? 'timeout-image-css' :
2656
+ hardTimeoutReady ? 'hard-timeout' :
2657
+ 'coverage'
2658
+ );
2632
2659
  } else {
2633
- if (timedOut && hasPendingCss) {
2660
+ if (timedOut && hasPendingCss && !hardTimedOut) {
2634
2661
  this._fullResHandoffUntil = Math.max(
2635
2662
  Number(this._fullResHandoffUntil || 0),
2636
2663
  performance.now() + this._fullResPanHandoffMaxMs
@@ -3072,6 +3099,7 @@
3072
3099
  this._residentBuildPhase = 'ready';
3073
3100
  this._residentFullBuildCount = Number(this._residentFullBuildCount || 0) + 1;
3074
3101
  this._lastResidentFullBuildReason = String(reason || 'unknown');
3102
+ this._lastAppliedResidentSchemaSignature = this._buildResidentSchemaSignature(this._module);
3075
3103
  emitMindCanvasTrace('lod.fullBuild', this._module, {
3076
3104
  reason: this._lastResidentFullBuildReason,
3077
3105
  count: Number(this._residentFullBuildCount || 0),
@@ -3112,6 +3140,67 @@
3112
3140
  }
3113
3141
  }
3114
3142
 
3143
+ _buildResidentSchemaSignature(module = this._module) {
3144
+ const flags = module?.renderDebugFlags || {};
3145
+ return [
3146
+ LOD_RENDERER_BUILD_ID,
3147
+ isCss3dRendererEnabled(module) ? 'css3d:on' : 'css3d:off',
3148
+ flags.enableCssImageLodFallback === true ? 'css-image-fallback:on' : 'css-image-fallback:off'
3149
+ ].join('|');
3150
+ }
3151
+
3152
+ _tryApplyResidentSchemaSyncNoop(reason = 'resident-schema-change') {
3153
+ const lodBand = this._currentLodBand || this._getActiveLodBand?.() || null;
3154
+ const nextSignature = this._buildResidentSchemaSignature(this._module);
3155
+ const canSkip =
3156
+ FORCE_RESIDENT_INSTANCES_IN_MID_FAR === true &&
3157
+ this._residentBuilt === true &&
3158
+ this._hasResidentLodInstances() === true &&
3159
+ this._instancesDirty !== true &&
3160
+ this._isNodeArrayDirty !== true &&
3161
+ this._lastAppliedResidentSchemaSignature === nextSignature;
3162
+
3163
+ if (!canSkip) {
3164
+ return false;
3165
+ }
3166
+
3167
+ this._syncInstancedImageMeshVisibility();
3168
+ this._markCss3dSyncNeeded(false);
3169
+ this._lastAppliedResidentSchemaSignature = nextSignature;
3170
+ if (this._module) {
3171
+ this._module._forceUpdateFrames = Math.max(Number(this._module._forceUpdateFrames || 0), 1);
3172
+ }
3173
+ emitMindCanvasTrace('patch.applied', this._module, {
3174
+ kind: DirtyKind.ResidentPatch,
3175
+ reason: String(reason || 'resident-schema-change'),
3176
+ normalizedReason: 'resident-schema-change',
3177
+ mode: 'resident-schema-noop',
3178
+ lodBand,
3179
+ schemaSignature: nextSignature
3180
+ });
3181
+ return true;
3182
+ }
3183
+
3184
+ requestResidentSchemaSync(reason = 'resident-schema-change') {
3185
+ const requestReason = String(reason || 'resident-schema-change');
3186
+ if (this._tryApplyResidentSchemaSyncNoop(requestReason)) {
3187
+ return true;
3188
+ }
3189
+
3190
+ this._setInstancesDirty('resident-schema-change');
3191
+ this._markLodResyncNeeded(false);
3192
+ if (this._module) {
3193
+ this._module._forceUpdateFrames = Math.max(Number(this._module._forceUpdateFrames || 0), 2);
3194
+ }
3195
+ emitMindCanvasTrace('lod.patch.request', this._module, {
3196
+ reason: requestReason,
3197
+ normalizedReason: 'resident-schema-change',
3198
+ mode: 'resident-schema-sync',
3199
+ lodBand: this._currentLodBand || null
3200
+ });
3201
+ return true;
3202
+ }
3203
+
3115
3204
  _hasPendingLineDetailRestore(lodBand = this._currentLodBand) {
3116
3205
  return ENABLE_INSTANCED_TEXT_LINES === true &&
3117
3206
  this._lineDetailsPatchPending === true &&
@@ -9350,6 +9439,7 @@
9350
9439
  this._residentBuilt = false;
9351
9440
  this._residentFullBuildCount = 0;
9352
9441
  this._lastResidentFullBuildReason = '';
9442
+ this._lastAppliedResidentSchemaSignature = '';
9353
9443
  this._lastBlockedResidentRebuildReason = '';
9354
9444
  this._lastBlockedResidentRebuildAt = 0;
9355
9445
  this._nearPriorityBuffer = [];
@@ -9643,6 +9733,10 @@
9643
9733
 
9644
9734
  requestResidentPatch(reason = 'resident-patch', nodeIds = null) {
9645
9735
  const normalizedReason = String(reason || 'resident-patch');
9736
+ if (normalizedReason === 'resident-schema-change') {
9737
+ return this.requestResidentSchemaSync(normalizedReason);
9738
+ }
9739
+
9646
9740
  if ((normalizedReason === 'add-node' || normalizedReason === 'remove-node' || normalizedReason === 'update-node') &&
9647
9741
  this._tryApplyResidentStructureDelta(normalizedReason, nodeIds)) {
9648
9742
  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-flat-camera-pan-y-v754" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-flat-camera-pan-y-v754" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260620-fullres-handoff-aa-v756" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260620-fullres-handoff-aa-v756" />
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-flat-camera-pan-y-v754';
582
+ const scriptVersion = '20260620-fullres-handoff-aa-v756';
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": "w4TAjKJM",
2
+ "version": "hjUfORzu",
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-0hG8T14JPmgbOP1xbPzWCQEhkDC3SXrqlx8HoJM9e3s=",
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-Pm6Fsfi1yFjFA4zyI0Qtkmtirf9GeV8IY0hP7wEsut4=",
81
+ "hash": "sha256-+7nR5UKQCHuP9metel5kUUQH3ymykf+dYJaI+h9qHao=",
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-2PMWOyq5zxt8mpd/hkCK6uBvf88/kDV8P/wNY0MgIfM=",
117
+ "hash": "sha256-kmCskZhRIl7SKSFNOyOeWYPFe7pQihKx+ckVRPs++fA=",
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-iSaoLAeLcFTemqhQxhR9UVS0+6eqB7yktppGhu4zBu4=",
837
+ "hash": "sha256-dXqSHxd8CnNzgsM5/6qkUJu1w+EwxOOcmwpMN+dTU5c=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: w4TAjKJM */
1
+ /* Manifest version: hjUfORzu */
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