@mindexec/cli 0.2.323 → 0.2.325

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.323",
3
+ "version": "0.2.325",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -1485,29 +1485,13 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1485
1485
 
1486
1486
  .mind-map-text-overlay-v2-card.is-passive {
1487
1487
  pointer-events: none;
1488
- /* Passive overlay paints screen-space chrome for text-like nodes so the
1489
- user does not see CSS3D's camera-scaled hard card edge in NEAR. */
1488
+ /* CSS3D owns card background/edge/glow; passive overlay only contributes
1489
+ readable text fragments and must never paint over the CSS3D chrome. */
1490
1490
  contain: layout style;
1491
1491
  overflow: visible;
1492
- background: rgba(255, 255, 255, 0.985) !important;
1493
- background-color: rgba(255, 255, 255, 0.985) !important;
1492
+ background: transparent !important;
1493
+ background-color: transparent !important;
1494
1494
  background-image: none !important;
1495
- border: 1px solid var(--mind-node-static-edge) !important;
1496
- box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05) !important;
1497
- border-radius: 2px !important;
1498
- outline: none !important;
1499
- }
1500
-
1501
- .mind-map-text-overlay-v2-card.is-passive[data-content-type="memo"],
1502
- .mind-map-text-overlay-v2-card.is-passive[data-content-type="note"] {
1503
- border-color: var(--mind-node-static-edge) !important;
1504
- border-radius: 6px !important;
1505
- }
1506
-
1507
- .mind-map-text-overlay-v2-card.is-passive[data-content-type="code"],
1508
- .mind-map-text-overlay-v2-card.is-passive[data-content-type="text"],
1509
- .mind-map-text-overlay-v2-card.is-passive[data-content-type="markdown"] {
1510
- border-radius: 1px !important;
1511
1495
  }
1512
1496
 
1513
1497
  .mind-map-text-overlay-v2-card.is-passive .mind-map-text-overlay-v2-body {
@@ -1517,6 +1501,10 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
1517
1501
  -moz-osx-font-smoothing: auto;
1518
1502
  }
1519
1503
 
1504
+ body.is-panning .mind-map-text-overlay-v2-card.is-passive .mind-map-text-overlay-v2-body {
1505
+ pointer-events: none !important;
1506
+ }
1507
+
1520
1508
  .mind-map-text-overlay-v2-shell {
1521
1509
  width: 100%;
1522
1510
  height: 100%;
@@ -2062,20 +2050,6 @@ html.mindcanvas-platform-apple .css3d-resolution-wrapper.is-automation-relation-
2062
2050
  caret-color: transparent !important;
2063
2051
  }
2064
2052
 
2065
- .css3d-resolution-wrapper.mind-map-v2-source-suspended:not(.node-type-image):not(.node-type-video):not(.node-type-embed),
2066
- .css3d-resolution-wrapper.mind-map-v2-source-suspended:not(.node-type-image):not(.node-type-video):not(.node-type-embed) > .map-node,
2067
- .css3d-resolution-wrapper.mind-map-v2-source-suspended:not(.node-type-image):not(.node-type-video):not(.node-type-embed) > .map-node-bubble,
2068
- .css3d-resolution-wrapper.mind-map-v2-source-suspended:not(.node-type-image):not(.node-type-video):not(.node-type-embed) > .map-node-note,
2069
- .css3d-resolution-wrapper.mind-map-v2-source-suspended:not(.node-type-image):not(.node-type-video):not(.node-type-embed) > .map-node-code,
2070
- .css3d-resolution-wrapper.mind-map-v2-source-suspended:not(.node-type-image):not(.node-type-video):not(.node-type-embed) > .map-node-memo:not(.map-node-agent):not(.map-node-automation) {
2071
- background: transparent !important;
2072
- background-color: transparent !important;
2073
- background-image: none !important;
2074
- border-color: var(--mind-node-static-edge) !important;
2075
- outline-color: var(--mind-node-static-edge) !important;
2076
- box-shadow: none !important;
2077
- }
2078
-
2079
2053
  .css3d-resolution-wrapper.node-type-image .mind-map-v2-source-suspended,
2080
2054
  .css3d-resolution-wrapper.node-type-video .mind-map-v2-source-suspended,
2081
2055
  .css3d-resolution-wrapper.node-type-embed .mind-map-v2-source-suspended,
@@ -3386,179 +3360,6 @@ html body .css3d-resolution-wrapper.lod-low.node-type-csv-table .csv-table td {
3386
3360
  }
3387
3361
  }
3388
3362
 
3389
- /* Temporary lightweight node visuals.
3390
- CSS3D and passive overlay node surfaces intentionally avoid shadows/glow.
3391
- Keep outlines, borders, and status color so selection and node state remain readable. */
3392
- .css3d-resolution-wrapper,
3393
- .css3d-resolution-wrapper.selected,
3394
- .css3d-resolution-wrapper.selection-style-agent.selected,
3395
- .css3d-resolution-wrapper.is-automation-relation-related,
3396
- .css3d-resolution-wrapper .css3d-dynamic-node,
3397
- .css3d-resolution-wrapper [id^="css3d-node-"],
3398
- .css3d-resolution-wrapper .map-node,
3399
- .css3d-resolution-wrapper .map-node-bubble,
3400
- .css3d-resolution-wrapper .map-node-note,
3401
- .css3d-resolution-wrapper .map-node-memo,
3402
- .css3d-resolution-wrapper .map-node-file,
3403
- .css3d-resolution-wrapper .map-node-image-container,
3404
- .css3d-resolution-wrapper .map-node-template-card,
3405
- .css3d-resolution-wrapper .template-card__shell,
3406
- .css3d-resolution-wrapper .template-card__shell--remote-fleet,
3407
- .mind-map-text-overlay-v2-card,
3408
- .mind-map-text-overlay-v2-card .map-node,
3409
- .mind-map-text-overlay-v2-card .map-node-bubble,
3410
- .mind-map-text-overlay-v2-card .map-node-note,
3411
- .mind-map-text-overlay-v2-card .map-node-memo,
3412
- .mind-map-text-overlay-v2-card .map-node-file,
3413
- .mind-map-text-overlay-v2-card .map-node-image-container,
3414
- .mind-map-text-overlay-v2-card .map-node-template-card,
3415
- .mind-map-text-overlay-v2-card .template-card__shell,
3416
- .mind-map-text-overlay-v2-card .template-card__shell--remote-fleet {
3417
- -webkit-box-shadow: none !important;
3418
- box-shadow: none !important;
3419
- -webkit-filter: none !important;
3420
- filter: none !important;
3421
- }
3422
-
3423
- /* Strong tail guard for the no node-glow policy.
3424
- This intentionally wins after idle/motion class cleanup and after older
3425
- note/image/video/agent/remote rules that used selected-state glow. */
3426
- html body .css3d-resolution-wrapper,
3427
- html body .css3d-resolution-wrapper::before,
3428
- html body .css3d-resolution-wrapper::after,
3429
- html body .css3d-resolution-wrapper *,
3430
- html body .css3d-resolution-wrapper *::before,
3431
- html body .css3d-resolution-wrapper *::after,
3432
- html body .mind-map-text-overlay-v2-card,
3433
- html body .mind-map-text-overlay-v2-card::before,
3434
- html body .mind-map-text-overlay-v2-card::after,
3435
- html body .mind-map-text-overlay-v2-card *,
3436
- html body .mind-map-text-overlay-v2-card *::before,
3437
- html body .mind-map-text-overlay-v2-card *::after {
3438
- -webkit-box-shadow: none !important;
3439
- box-shadow: none !important;
3440
- -webkit-filter: none !important;
3441
- filter: none !important;
3442
- text-shadow: none !important;
3443
- }
3444
-
3445
- html body .css3d-resolution-wrapper {
3446
- transition-property: transform, opacity, border-color, background-color !important;
3447
- }
3448
-
3449
- html body .css3d-resolution-wrapper.node-type-note,
3450
- html body .css3d-resolution-wrapper.node-type-note.selected,
3451
- html body .css3d-resolution-wrapper.node-type-image,
3452
- html body .css3d-resolution-wrapper.node-type-image.selected,
3453
- html body .css3d-resolution-wrapper.node-type-video,
3454
- html body .css3d-resolution-wrapper.node-type-video.selected,
3455
- html body .css3d-resolution-wrapper.node-type-embed,
3456
- html body .css3d-resolution-wrapper.node-type-embed.selected,
3457
- html body .css3d-resolution-wrapper.selected-media-safe,
3458
- html body .css3d-resolution-wrapper.selected-media-safe.selected {
3459
- -webkit-box-shadow: none !important;
3460
- box-shadow: none !important;
3461
- -webkit-filter: none !important;
3462
- filter: none !important;
3463
- }
3464
-
3465
- html body .css3d-resolution-wrapper.node-type-note .map-node-note,
3466
- html body .css3d-resolution-wrapper.node-type-note .map-node-note.selected,
3467
- html body .css3d-resolution-wrapper.node-type-note .map-node-note:focus-within,
3468
- html body .css3d-resolution-wrapper.node-type-image .map-node-image-container,
3469
- html body .css3d-resolution-wrapper.node-type-image .map-node-image-container.selected,
3470
- html body .css3d-resolution-wrapper.node-type-video .map-node,
3471
- html body .css3d-resolution-wrapper.node-type-video .map-node.selected,
3472
- html body .css3d-resolution-wrapper.node-type-embed .map-node,
3473
- html body .css3d-resolution-wrapper.node-type-embed .map-node.selected {
3474
- -webkit-box-shadow: none !important;
3475
- box-shadow: none !important;
3476
- -webkit-filter: none !important;
3477
- filter: none !important;
3478
- outline-offset: 0 !important;
3479
- }
3480
-
3481
- /* Text nodes keep the same dark edge in motion and settled states now that decorative glow/shadow is gone.
3482
- Keep this scoped away from template, MDM, media, CSV, and remote-control cards. */
3483
- html body .css3d-resolution-wrapper > .map-node-bubble,
3484
- html body .css3d-resolution-wrapper > .map-node-note,
3485
- html body .css3d-resolution-wrapper > .map-node-code,
3486
- html body .css3d-resolution-wrapper > .map-node-memo:not(.map-node-agent):not(.map-node-automation):not(.map-node-template-card):not(.map-node-remote-fleet) {
3487
- border: 1px solid var(--mind-node-static-edge) !important;
3488
- -webkit-box-shadow: none !important;
3489
- box-shadow: none !important;
3490
- -webkit-filter: none !important;
3491
- filter: none !important;
3492
- }
3493
-
3494
- html body .css3d-resolution-wrapper.selected > .map-node-bubble,
3495
- html body .css3d-resolution-wrapper.selected > .map-node-note,
3496
- html body .css3d-resolution-wrapper.selected > .map-node-code,
3497
- html body .css3d-resolution-wrapper.selected > .map-node-memo:not(.map-node-agent):not(.map-node-automation):not(.map-node-template-card):not(.map-node-remote-fleet),
3498
- html body .css3d-resolution-wrapper > .map-node-bubble.selected,
3499
- html body .css3d-resolution-wrapper > .map-node-note.selected,
3500
- html body .css3d-resolution-wrapper > .map-node-note:focus-within,
3501
- html body .css3d-resolution-wrapper > .map-node-code.selected,
3502
- html body .css3d-resolution-wrapper > .map-node-code:focus-within,
3503
- html body .css3d-resolution-wrapper > .map-node-memo.selected:not(.map-node-agent):not(.map-node-automation):not(.map-node-template-card):not(.map-node-remote-fleet),
3504
- html body .css3d-resolution-wrapper > .map-node-memo:focus-within:not(.map-node-agent):not(.map-node-automation):not(.map-node-template-card):not(.map-node-remote-fleet) {
3505
- border-color: var(--mind-node-selection-edge) !important;
3506
- -webkit-box-shadow: none !important;
3507
- box-shadow: none !important;
3508
- -webkit-filter: none !important;
3509
- filter: none !important;
3510
- }
3511
-
3512
- html body .css3d-resolution-wrapper > .map-node-agent:not(.map-node-template-card):not(.map-node-remote-fleet),
3513
- html body .css3d-resolution-wrapper > .map-node-automation:not(.map-node-template-card):not(.map-node-remote-fleet),
3514
- html body .css3d-resolution-wrapper.selected > .map-node-agent:not(.map-node-template-card):not(.map-node-remote-fleet),
3515
- html body .css3d-resolution-wrapper.selected > .map-node-automation:not(.map-node-template-card):not(.map-node-remote-fleet),
3516
- html body .css3d-resolution-wrapper > .map-node-agent.selected:not(.map-node-template-card):not(.map-node-remote-fleet),
3517
- html body .css3d-resolution-wrapper > .map-node-agent:focus-within:not(.map-node-template-card):not(.map-node-remote-fleet),
3518
- html body .css3d-resolution-wrapper > .map-node-automation.selected:not(.map-node-template-card):not(.map-node-remote-fleet),
3519
- html body .css3d-resolution-wrapper > .map-node-automation:focus-within:not(.map-node-template-card):not(.map-node-remote-fleet) {
3520
- border-color: var(--mind-node-selection-edge) !important;
3521
- -webkit-box-shadow: none !important;
3522
- box-shadow: none !important;
3523
- -webkit-filter: none !important;
3524
- filter: none !important;
3525
- }
3526
-
3527
- /* Final node edge policy:
3528
- - unselected text-like surfaces use a shared dark edge because glow is removed
3529
- - selected nodes, including AI task nodes, use the same blue edge as notes */
3530
- html body .css3d-resolution-wrapper.node-type-text > .map-node,
3531
- html body .css3d-resolution-wrapper.node-type-markdown > .map-node,
3532
- html body .css3d-resolution-wrapper.node-type-text > .css3d-dynamic-node,
3533
- html body .css3d-resolution-wrapper.node-type-markdown > .css3d-dynamic-node,
3534
- html body .css3d-resolution-wrapper > .map-node-agent:not(.map-node-template-card):not(.map-node-remote-fleet),
3535
- html body .css3d-resolution-wrapper > .map-node-automation:not(.map-node-template-card):not(.map-node-remote-fleet),
3536
- html body .mind-map-text-overlay-v2-shell.type-text,
3537
- html body .mind-map-text-overlay-v2-shell.type-markdown {
3538
- border: 1px solid var(--mind-node-static-edge) !important;
3539
- -webkit-box-shadow: none !important;
3540
- box-shadow: none !important;
3541
- -webkit-filter: none !important;
3542
- filter: none !important;
3543
- }
3544
-
3545
- html body .css3d-resolution-wrapper.selected.node-type-text > .map-node,
3546
- html body .css3d-resolution-wrapper.selected.node-type-markdown > .map-node,
3547
- html body .css3d-resolution-wrapper.selected.node-type-text > .css3d-dynamic-node,
3548
- html body .css3d-resolution-wrapper.selected.node-type-markdown > .css3d-dynamic-node,
3549
- html body .css3d-resolution-wrapper.selected > .map-node-agent:not(.map-node-template-card):not(.map-node-remote-fleet),
3550
- html body .css3d-resolution-wrapper.selected > .map-node-automation:not(.map-node-template-card):not(.map-node-remote-fleet),
3551
- html body .css3d-resolution-wrapper > .map-node-agent.selected:not(.map-node-template-card):not(.map-node-remote-fleet),
3552
- html body .css3d-resolution-wrapper > .map-node-agent:focus-within:not(.map-node-template-card):not(.map-node-remote-fleet),
3553
- html body .css3d-resolution-wrapper > .map-node-automation.selected:not(.map-node-template-card):not(.map-node-remote-fleet),
3554
- html body .css3d-resolution-wrapper > .map-node-automation:focus-within:not(.map-node-template-card):not(.map-node-remote-fleet) {
3555
- border: 1px solid var(--mind-node-selection-edge) !important;
3556
- -webkit-box-shadow: none !important;
3557
- box-shadow: none !important;
3558
- -webkit-filter: none !important;
3559
- filter: none !important;
3560
- }
3561
-
3562
3363
  /* Low-detail CSS3D proxy policy.
3563
3364
  MID/FAR overview cards are not a readable text surface. Keeping the full
3564
3365
  DOM body at that scale turns content into aliasing noise, so non-selected
@@ -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-ref-visual-restore-v807';
8
+ const MINDMAP_CORE_BUILD_ID = '20260621-passive-overlay-visual-v809';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -51,7 +51,7 @@
51
51
  // ▲▲▲ [Usage] ▲▲▲
52
52
 
53
53
  // Procedural line rendering settings
54
- const LOD_RENDERER_BUILD_ID = '20260621-ref-visual-restore-v807';
54
+ const LOD_RENDERER_BUILD_ID = '20260621-passive-overlay-visual-v809';
55
55
  const DirtyKind = Object.freeze({
56
56
  ResidentFullRebuild: 'resident-full-rebuild',
57
57
  ResidentPatch: 'resident-patch',
@@ -4250,77 +4250,8 @@
4250
4250
  return currentVisibleIds.has(nodeId);
4251
4251
  }
4252
4252
 
4253
- _getMaxActiveFullResCssNodes(module = this._module, lodBand = this._currentLodBand) {
4254
- const cameraZ = Number(module?.camera?.position?.z || 0);
4255
- const isMotionFrame =
4256
- module?.isPanning === true ||
4257
- module?.isZooming === true ||
4258
- module?._fullResMotionFrozen === true;
4259
- const avgFrameTime = Number(module?._avgFrameTime || 16);
4260
-
4261
- let maxActive = 32;
4262
- if (lodBand === 'NEAR' || cameraZ < 4500) {
4263
- maxActive = 84;
4264
- } else if (lodBand === 'NORMAL' || cameraZ < 12000) {
4265
- maxActive = 48;
4266
- }
4267
-
4268
- if (isMotionFrame) {
4269
- if (maxActive >= 84) {
4270
- maxActive = 72;
4271
- } else if (maxActive >= 48) {
4272
- maxActive = 40;
4273
- } else {
4274
- maxActive = 28;
4275
- }
4276
- }
4277
-
4278
- if (avgFrameTime > 20) {
4279
- if (maxActive >= 72) {
4280
- maxActive = 60;
4281
- } else if (maxActive >= 40) {
4282
- maxActive = 32;
4283
- } else {
4284
- maxActive = 24;
4285
- }
4286
- }
4287
-
4288
- if (avgFrameTime > 26) {
4289
- if (maxActive >= 60) {
4290
- maxActive = 48;
4291
- } else if (maxActive >= 32) {
4292
- maxActive = 24;
4293
- } else {
4294
- maxActive = 18;
4295
- }
4296
- }
4297
-
4298
- return Math.max(18, maxActive);
4299
- }
4300
-
4301
4253
  _buildFullResCssAllowSet(prioritizedVisible, nodeObjectsById, module = this._module, lodBand = this._currentLodBand) {
4302
4254
  const allowedIds = new Set();
4303
- const currentVisibleIds = this._getNearVisibleIds(module);
4304
- const now = typeof performance !== 'undefined' && typeof performance.now === 'function'
4305
- ? performance.now()
4306
- : Date.now();
4307
- const isMotionFrame =
4308
- module?.isPanning === true ||
4309
- module?.isZooming === true ||
4310
- module?._fullResMotionFrozen === true;
4311
- const recentMotionCooldownActive =
4312
- (now - Number(module?._lastMotionEndAt || 0)) < 180;
4313
-
4314
- // Preserve already visible CSS text during motion and cooldown.
4315
- // Throttling should only slow new entrants, not evict visible text nodes.
4316
- if (currentVisibleIds?.size > 0 && this._nearCssVisibleIds?.size > 0) {
4317
- for (const nodeId of this._nearCssVisibleIds) {
4318
- if (!currentVisibleIds.has(nodeId)) continue;
4319
- const entry = nodeObjectsById?.get?.(nodeId) || null;
4320
- if (!entry || !supportsCss3dNodeModel(entry.model)) continue;
4321
- allowedIds.add(nodeId);
4322
- }
4323
- }
4324
4255
 
4325
4256
  const stickyIds = [
4326
4257
  module?.selectedNodeIdJs || null,
@@ -4352,27 +4283,15 @@
4352
4283
  return allowedIds;
4353
4284
  }
4354
4285
 
4355
- // Once motion settles, reconcile back to the full visible text set.
4356
- if (!isMotionFrame && !recentMotionCooldownActive) {
4357
- for (let i = 0; i < prioritizedVisible.length; i++) {
4358
- const nodeId = prioritizedVisible[i]?.nodeId;
4359
- if (!nodeId || allowedIds.has(nodeId)) continue;
4360
- const entry = nodeObjectsById?.get?.(nodeId) || null;
4361
- if (!entry || !supportsCss3dNodeModel(entry.model)) continue;
4362
- allowedIds.add(nodeId);
4363
- }
4364
- return allowedIds;
4365
- }
4366
-
4367
- let remainingEntrantBudget = Math.max(0, this._getMaxActiveFullResCssNodes(module, lodBand));
4286
+ // Full-res NEAR/NORMAL is the readable CSS3D path. Do not drop visible
4287
+ // text nodes during pan/zoom/cooldown; otherwise the expanded NORMAL band
4288
+ // shows empty cards until the throttled activation queue catches up.
4368
4289
  for (let i = 0; i < prioritizedVisible.length; i++) {
4369
- if (remainingEntrantBudget <= 0) break;
4370
4290
  const nodeId = prioritizedVisible[i]?.nodeId;
4371
4291
  if (!nodeId || allowedIds.has(nodeId)) continue;
4372
4292
  const entry = nodeObjectsById?.get?.(nodeId) || null;
4373
4293
  if (!entry || !supportsCss3dNodeModel(entry.model)) continue;
4374
4294
  allowedIds.add(nodeId);
4375
- remainingEntrantBudget--;
4376
4295
  }
4377
4296
 
4378
4297
  return allowedIds;
@@ -4503,20 +4422,61 @@
4503
4422
  }
4504
4423
  }
4505
4424
 
4506
- _setNodeDetailLevel(entry, level) {
4507
- if (!entry?.cssObject?.element) return;
4508
-
4509
- const el = entry.cssObject.element;
4425
+ _restoreCss3dTextSourceForHighDetail(entry) {
4426
+ const root = entry?.cssObject?.element || null;
4427
+ if (!root) return;
4428
+ if (!isTextLikeModel(entry?.model)) return;
4429
+
4430
+ const nodeId = String(entry?.model?.id || entry?.model?.Id || entry?.glObject?.userData?.nodeId || '').trim();
4431
+ const module = this._module || null;
4432
+ const overlayV2 = window.MindMapTextOverlayV2 || null;
4433
+ const overlayActive = !!nodeId && (
4434
+ overlayV2?.hasSelection?.(module, nodeId) === true ||
4435
+ overlayV2?.hasEditing?.(module, nodeId) === true
4436
+ );
4437
+
4438
+ if (overlayActive) {
4439
+ return;
4440
+ }
4441
+
4442
+ overlayV2?.resumeSource?.(entry);
4443
+
4444
+ const clearSuspendedTarget = (target) => {
4445
+ if (!target) return;
4446
+ target.classList?.remove?.('mind-map-v2-source-suspended');
4447
+ target.classList?.remove?.('mind-map-text-overlay-source-suspended');
4448
+ target.removeAttribute?.('data-text-overlay-source-suspended');
4449
+ if (target.style) {
4450
+ target.style.opacity = '';
4451
+ target.style.pointerEvents = '';
4452
+ target.style.userSelect = '';
4453
+ target.style.webkitUserSelect = '';
4454
+ target.style.caretColor = '';
4455
+ target.style.contentVisibility = '';
4456
+ target.style.containIntrinsicSize = '';
4457
+ target.style.contain = '';
4458
+ }
4459
+ };
4460
+
4461
+ clearSuspendedTarget(root);
4462
+ root.querySelectorAll?.('[data-text-overlay-source-suspended], .mind-map-text-overlay-source-suspended, .mind-map-v2-source-suspended')?.forEach?.(clearSuspendedTarget);
4463
+ }
4464
+
4465
+ _setNodeDetailLevel(entry, level) {
4466
+ if (!entry?.cssObject?.element) return;
4467
+
4468
+ const el = entry.cssObject.element;
4510
4469
  const container = el.querySelector('.node-container') || el;
4511
4470
 
4512
4471
  if (!container?.classList) return;
4513
4472
 
4514
- if (level === 'HIGH') {
4515
- container.classList.remove('lod-low');
4516
- container.classList.add('lod-high');
4517
- } else {
4518
- container.classList.remove('lod-high');
4519
- container.classList.add('lod-low');
4473
+ if (level === 'HIGH') {
4474
+ container.classList.remove('lod-low');
4475
+ container.classList.add('lod-high');
4476
+ this._restoreCss3dTextSourceForHighDetail(entry);
4477
+ } else {
4478
+ container.classList.remove('lod-high');
4479
+ container.classList.add('lod-low');
4520
4480
  }
4521
4481
  }
4522
4482
 
@@ -5691,50 +5651,16 @@
5691
5651
  }
5692
5652
 
5693
5653
  _getAdaptiveNearCssActivationConfig(visibleCount = 0, module = this._module, isNearBoostFrame = false) {
5694
- const avgFrameTime = Number(module?._avgFrameTime || 16);
5695
- const now = typeof performance !== 'undefined' && typeof performance.now === 'function'
5696
- ? performance.now()
5697
- : Date.now();
5698
- const recentMotionCooldownActive =
5699
- (now - Number(module?._lastMotionEndAt || 0)) < 180;
5700
- const fullResMotionFrozen = module?._fullResMotionFrozen === true;
5701
- const isMotionFrame =
5702
- module?.isPanning === true ||
5703
- module?.isZooming === true ||
5704
- module?._fullResMotionFrozen === true;
5705
- const boostCount = isNearBoostFrame ? 1 : 0;
5706
-
5707
- if (fullResMotionFrozen) {
5708
- return {
5709
- maxPerFrame: Math.max(1, (visibleCount >= 144 ? 1 : 2) + boostCount),
5710
- budgetMs: 1
5711
- };
5712
- }
5713
-
5714
- if (isMotionFrame) {
5715
- return {
5716
- maxPerFrame: Math.max(2, (visibleCount >= 144 ? 2 : 3) + boostCount),
5717
- budgetMs: 1.5
5718
- };
5719
- }
5720
-
5721
- if (recentMotionCooldownActive) {
5722
- return {
5723
- maxPerFrame: Math.max(6, (visibleCount >= 144 ? 6 : 8) + boostCount),
5724
- budgetMs: 3.5
5725
- };
5726
- }
5727
-
5728
- if (avgFrameTime > 24) {
5729
- return {
5730
- maxPerFrame: Math.max(8, (visibleCount >= 144 ? 8 : 10) + boostCount),
5731
- budgetMs: 4
5732
- };
5733
- }
5654
+ const visibleBudget = Number.isFinite(Number(visibleCount))
5655
+ ? Math.max(1, Math.ceil(Number(visibleCount)))
5656
+ : Number.MAX_SAFE_INTEGER;
5734
5657
 
5658
+ // NEAR/NORMAL is the readable full-res CSS3D path. Splitting activation
5659
+ // across frames makes some nodes move or reveal later than others, which
5660
+ // is visually worse than a bounded one-tick activation cost.
5735
5661
  return {
5736
- maxPerFrame: Math.max(12, (visibleCount >= 144 ? 12 : 16) + boostCount),
5737
- budgetMs: 5.5
5662
+ maxPerFrame: visibleBudget,
5663
+ budgetMs: Number.MAX_SAFE_INTEGER
5738
5664
  };
5739
5665
  }
5740
5666
 
@@ -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-ref-visual-restore-v807" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260621-ref-visual-restore-v807" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260621-passive-overlay-visual-v809" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260621-passive-overlay-visual-v809" />
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-ref-visual-restore-v807';
582
+ const scriptVersion = '20260621-passive-overlay-visual-v809';
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": "YuN8ayP2",
2
+ "version": "/ZP7j8/4",
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-Uvr4tgKZcGb9AZ+Agd7PDx8i4kPx2FUDSlHXtTGpLno=",
45
+ "hash": "sha256-vid9yH+PpB1piyotFJWl7w8T0rHHzozGJXcARF4Bt3M=",
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-HQSbwZaUQ3ropjW1EVV7QjomoRRoa3YXMOkdckwXFms=",
81
+ "hash": "sha256-/B3VgAaxd8kCxinkwTtDL2FZqd/16ZT776aofWm2d3U=",
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-vUq0uBi8XzXs+3nVu2AXaNVYQSx3C2fl6m1OsmWPgk8=",
117
+ "hash": "sha256-+AKWC0QdceiMs2L5gB8YYo7FGxOKQryQZQUqqcSiE00=",
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-dh3n/MvhqXcupOCla7F326J3sS3z28xor+90tgCO0p0=",
837
+ "hash": "sha256-KY6fyBhIFE2MDuYOYewFBAjKksJZocJxS2uxk73ND3U=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: YuN8ayP2 */
1
+ /* Manifest version: /ZP7j8/4 */
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