@mindexec/cli 0.2.452 → 0.2.454

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.
Files changed (34) hide show
  1. package/electron/main.cjs +12 -0
  2. package/electron/source-smoke.mjs +15 -0
  3. package/package.json +2 -2
  4. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  5. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  6. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  7. package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +1 -1
  8. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +211 -245
  9. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +77 -103
  10. package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +5 -7
  11. package/wwwroot/_content/MindExecution.Shared/js/mind-map-logic-workers.js +9 -3
  12. package/wwwroot/_content/MindExecution.Shared/js/mind-map-render-plan.js +294 -12
  13. package/wwwroot/_framework/{MindExecution.Core.9h7x2mjn0w.dll → MindExecution.Core.sxhdhda5s2.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Kernel.8te3ay3qs6.dll → MindExecution.Kernel.j8gyjmvupu.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Plugins.Admin.imt43kggvu.dll → MindExecution.Plugins.Admin.91tk6u6ry5.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Plugins.Business.26yozgyvan.dll → MindExecution.Plugins.Business.b7h6v1eygj.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Plugins.Concept.k7fd1qvmfx.dll → MindExecution.Plugins.Concept.i2zgmkmpwv.dll} +0 -0
  18. package/wwwroot/_framework/{MindExecution.Plugins.Directory.88ng22x3y0.dll → MindExecution.Plugins.Directory.r6is6647n2.dll} +0 -0
  19. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.ll20yqlc09.dll → MindExecution.Plugins.PlanMaster.s95n9skblk.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.gqu5xngvav.dll → MindExecution.Plugins.YouTube.33l2m0y23q.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Shared.6ivt1fatt3.dll → MindExecution.Shared.hvehzbzkt7.dll} +0 -0
  22. package/wwwroot/_framework/{MindExecution.Web.7tki7xqpt0.dll → MindExecution.Web.krui41i71h.dll} +0 -0
  23. package/wwwroot/_framework/blazor.boot.json +21 -21
  24. package/wwwroot/app-icon-1024.png +0 -0
  25. package/wwwroot/apple-touch-icon.png +0 -0
  26. package/wwwroot/favicon-32x32.png +0 -0
  27. package/wwwroot/favicon.ico +0 -0
  28. package/wwwroot/icon-192.png +0 -0
  29. package/wwwroot/icon-512.png +0 -0
  30. package/wwwroot/index.html +8 -4
  31. package/wwwroot/manifest.webmanifest +21 -19
  32. package/wwwroot/mindexec-favicon-v2.png +0 -0
  33. package/wwwroot/service-worker-assets.js +52 -32
  34. package/wwwroot/service-worker.js +1 -1
@@ -1,7 +1,7 @@
1
1
  (function () {
2
2
  'use strict';
3
3
 
4
- const BUILD_ID = '20260713-normal-boundary-plan-v41';
4
+ const BUILD_ID = '20260728-camera-render-policy-v43';
5
5
  const FRAME_SAMPLE_LIMIT = 240;
6
6
  const INITIAL_LINE_TEXTURE_ROWS = 1024;
7
7
  const GPU_WARM_RETRY_DELAY_MS = 120;
@@ -18,6 +18,147 @@
18
18
  'lodCleanup', 'lodNodeScan', 'lodResidentApply', 'lodLinePatch', 'lodImageInstances',
19
19
  'lodPositionPatch', 'lodFallbacks', 'lodOther'
20
20
  ];
21
+ const CAMERA_ONLY_WEBGL_BLOCKERS = Object.freeze({
22
+ NotCameraOnly: 1 << 0,
23
+ Css3dCameraPathUnavailable: 1 << 1,
24
+ WebglDisabled: 1 << 2,
25
+ BoardLoading: 1 << 3,
26
+ ResidentLod: 1 << 4,
27
+ NonCameraUpdate: 1 << 5,
28
+ ThemeAnimation: 1 << 6,
29
+ WebglTheme: 1 << 7,
30
+ CssCoverageIncomplete: 1 << 8,
31
+ FullResHandoff: 1 << 9,
32
+ ResidentMeshVisible: 1 << 10,
33
+ ImageVisual: 1 << 11,
34
+ AnimatedImageStatus: 1 << 12,
35
+ CursorVisual: 1 << 13,
36
+ DebugVisual: 1 << 14,
37
+ FullResGlVisual: 1 << 15
38
+ });
39
+ const CAMERA_ONLY_WEBGL_BLOCKER_NAMES = Object.freeze([
40
+ [CAMERA_ONLY_WEBGL_BLOCKERS.NotCameraOnly, 'not-camera-only'],
41
+ [CAMERA_ONLY_WEBGL_BLOCKERS.Css3dCameraPathUnavailable, 'css3d-camera-path-unavailable'],
42
+ [CAMERA_ONLY_WEBGL_BLOCKERS.WebglDisabled, 'webgl-disabled'],
43
+ [CAMERA_ONLY_WEBGL_BLOCKERS.BoardLoading, 'board-loading'],
44
+ [CAMERA_ONLY_WEBGL_BLOCKERS.ResidentLod, 'resident-lod'],
45
+ [CAMERA_ONLY_WEBGL_BLOCKERS.NonCameraUpdate, 'non-camera-update'],
46
+ [CAMERA_ONLY_WEBGL_BLOCKERS.ThemeAnimation, 'theme-animation'],
47
+ [CAMERA_ONLY_WEBGL_BLOCKERS.WebglTheme, 'webgl-theme'],
48
+ [CAMERA_ONLY_WEBGL_BLOCKERS.CssCoverageIncomplete, 'css-coverage-incomplete'],
49
+ [CAMERA_ONLY_WEBGL_BLOCKERS.FullResHandoff, 'fullres-handoff'],
50
+ [CAMERA_ONLY_WEBGL_BLOCKERS.ResidentMeshVisible, 'resident-mesh-visible'],
51
+ [CAMERA_ONLY_WEBGL_BLOCKERS.ImageVisual, 'image-visual'],
52
+ [CAMERA_ONLY_WEBGL_BLOCKERS.AnimatedImageStatus, 'animated-image-status'],
53
+ [CAMERA_ONLY_WEBGL_BLOCKERS.CursorVisual, 'cursor-visual'],
54
+ [CAMERA_ONLY_WEBGL_BLOCKERS.DebugVisual, 'debug-visual'],
55
+ [CAMERA_ONLY_WEBGL_BLOCKERS.FullResGlVisual, 'fullres-gl-visual']
56
+ ]);
57
+
58
+ function isRendererDprInteractionActive(module, frameState = null) {
59
+ return !!(
60
+ frameState?.isCameraMoving === true ||
61
+ module?.isZooming === true ||
62
+ module?.isPanning === true ||
63
+ module?._cameraMovingThisFrame === true ||
64
+ module?._panSmoothingActive === true ||
65
+ module?._wheelZoomBurstActive === true ||
66
+ module?.isDraggingNode === true ||
67
+ module?.isDraggingMultipleNodes === true ||
68
+ module?.isResizing === true ||
69
+ module?.isWindowResizing === true
70
+ );
71
+ }
72
+
73
+ function getCameraOnlyWebglBlockerMask(module, frameState = null) {
74
+ const renderer = module?.lodRenderer || null;
75
+ let blockers = 0;
76
+ if (frameState?.isCameraNavigationOnlyInteractiveFrame !== true) {
77
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.NotCameraOnly;
78
+ }
79
+ if (frameState?.canUseCss3dCameraFastPath !== true) {
80
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.Css3dCameraPathUnavailable;
81
+ }
82
+ if (frameState?.isWebglRenderEnabled !== true) {
83
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.WebglDisabled;
84
+ }
85
+ if (frameState?.isBoardLoading === true) {
86
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.BoardLoading;
87
+ }
88
+ if (frameState?.isInLodMode === true || renderer?.isInLODMode !== false) {
89
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.ResidentLod;
90
+ }
91
+ if (frameState?.hasNonCameraNavigationForcedUpdate === true) {
92
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.NonCameraUpdate;
93
+ }
94
+ if (frameState?.themeAnimatedThisFrame === true || module?._forceThemeAnimationFrame === true) {
95
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.ThemeAnimation;
96
+ }
97
+ if (module?.currentThemeObject?.userData?.localSnapGrid !== true) {
98
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.WebglTheme;
99
+ }
100
+
101
+ const visibleCount = Number(module?._visibleIds?.size || 0);
102
+ const nearCssVisibleCount = Number(renderer?._nearCssVisibleIds?.size || 0);
103
+ const activeFullResCssCount = Number(renderer?._activeFullResCssNodeIds?.size || 0);
104
+ const pendingFullResCssCount = Number(renderer?._fullResCssPendingReadyIds?.size || 0);
105
+ const hasCompleteCssCoverage =
106
+ nearCssVisibleCount === visibleCount &&
107
+ activeFullResCssCount === visibleCount &&
108
+ pendingFullResCssCount === 0 &&
109
+ (visibleCount === 0 || !!renderer?._lastNearCssNoWorkKey);
110
+ if (!hasCompleteCssCoverage) {
111
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.CssCoverageIncomplete;
112
+ }
113
+
114
+ // The full-res motion optimizer owns this cached proof: only CSS-backed,
115
+ // unselected text-like nodes enter the set after their whole GL group is
116
+ // hidden. Images, media, selected nodes, and open agent consoles remain
117
+ // outside it and therefore fail closed without a scene traversal here.
118
+ const motionHiddenGlCount = Number(renderer?._fullResMotionHiddenGlIds?.size || 0);
119
+ if (motionHiddenGlCount !== visibleCount) {
120
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.FullResGlVisual;
121
+ }
122
+
123
+ const fullResHandoffActive =
124
+ renderer?._fullResHandoffActive === true ||
125
+ renderer?._hasCss3dQueueItems?.() === true ||
126
+ renderer?._css3dProcessing === true;
127
+ if (fullResHandoffActive) {
128
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.FullResHandoff;
129
+ }
130
+
131
+ const residentMeshVisible =
132
+ renderer?.instancedHaloMesh?.visible === true ||
133
+ renderer?.instancedMesh?.visible === true ||
134
+ renderer?.instancedBorderLineMesh?.visible === true ||
135
+ renderer?.instancedLineMesh?.visible === true ||
136
+ renderer?.instancedConsoleMesh?.visible === true ||
137
+ renderer?.instancedImageMesh?.visible === true;
138
+ if (residentMeshVisible) {
139
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.ResidentMeshVisible;
140
+ }
141
+ if (Number(renderer?._fullResImageVisualIds?.size || 0) > 0) {
142
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.ImageVisual;
143
+ }
144
+ if (Number(module?._activeImageStatusTextures?.size || 0) > 0) {
145
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.AnimatedImageStatus;
146
+ }
147
+ if (module?.cursorMesh?.visible === true) {
148
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.CursorVisual;
149
+ }
150
+ if (Number(module?.debugGroup?.children?.length || 0) > 0) {
151
+ blockers |= CAMERA_ONLY_WEBGL_BLOCKERS.DebugVisual;
152
+ }
153
+ return blockers;
154
+ }
155
+
156
+ function getCameraOnlyWebglBlockerNames(mask) {
157
+ const normalizedMask = Number(mask || 0);
158
+ return CAMERA_ONLY_WEBGL_BLOCKER_NAMES
159
+ .filter(([flag]) => (normalizedMask & flag) !== 0)
160
+ .map(([, name]) => name);
161
+ }
21
162
 
22
163
  function configureImageAtlasTexture(texture, THREE) {
23
164
  if (!texture || !THREE) return texture;
@@ -410,11 +551,110 @@
410
551
  return true;
411
552
  }
412
553
 
413
- function hasAnimatedGifCssFallbackCandidates(renderer, module, isAnimatedGifModel) {
554
+ function invalidateAnimatedGifCssFallbackCandidateCache(renderer) {
555
+ if (!renderer) return;
556
+ renderer._animatedGifFallbackCandidateCacheValid = false;
557
+ }
558
+
559
+ function invalidateActiveCssMediaFallbackCountCache(renderer) {
560
+ if (!renderer) return;
561
+ renderer._activeCssMediaFallbackCountCacheValid = false;
562
+ }
563
+
564
+ function markLodImageCssFallbacksChanged(renderer) {
565
+ if (!renderer) return;
566
+ renderer._lodImageCssFallbackRevision =
567
+ Number(renderer._lodImageCssFallbackRevision || 0) + 1;
568
+ invalidateAnimatedGifCssFallbackCandidateCache(renderer);
569
+ invalidateActiveCssMediaFallbackCountCache(renderer);
570
+ }
571
+
572
+ function createTrackedLodImageCssFallbackSet(renderer) {
573
+ return new class extends Set {
574
+ add(value) {
575
+ if (!this.has(value)) {
576
+ super.add(value);
577
+ markLodImageCssFallbacksChanged(renderer);
578
+ }
579
+ return this;
580
+ }
581
+
582
+ delete(value) {
583
+ const deleted = super.delete(value);
584
+ if (deleted) markLodImageCssFallbacksChanged(renderer);
585
+ return deleted;
586
+ }
587
+
588
+ clear() {
589
+ if (this.size <= 0) return;
590
+ super.clear();
591
+ markLodImageCssFallbacksChanged(renderer);
592
+ }
593
+ }();
594
+ }
595
+
596
+ function getActiveCssMediaFallbackCountCached(renderer, module) {
597
+ if (!renderer) return 0;
598
+ const nodeObjectsById = module?.nodeObjectsById || renderer?._module?.nodeObjectsById || null;
599
+ const fallbackRevision = Number(renderer?._lodImageCssFallbackRevision || 0);
600
+ const fallbackCount = Number(renderer?._lodImageCssFallbackNodeIds?.size || 0);
601
+ if (fallbackCount <= 0) {
602
+ renderer._activeCssMediaFallbackCountCacheNodeMap = nodeObjectsById;
603
+ renderer._activeCssMediaFallbackCountCacheRevision = fallbackRevision;
604
+ renderer._activeCssMediaFallbackCountCacheFallbackCount = 0;
605
+ renderer._activeCssMediaFallbackCountCacheValue = 0;
606
+ renderer._activeCssMediaFallbackCountCacheValid = true;
607
+ return 0;
608
+ }
609
+ if (renderer._activeCssMediaFallbackCountCacheValid === true &&
610
+ renderer._activeCssMediaFallbackCountCacheNodeMap === nodeObjectsById &&
611
+ Number(renderer._activeCssMediaFallbackCountCacheRevision || 0) === fallbackRevision &&
612
+ Number(renderer._activeCssMediaFallbackCountCacheFallbackCount || 0) === fallbackCount) {
613
+ renderer._activeCssMediaFallbackCountCacheHitCount =
614
+ Number(renderer._activeCssMediaFallbackCountCacheHitCount || 0) + 1;
615
+ return Number(renderer._activeCssMediaFallbackCountCacheValue || 0);
616
+ }
617
+
618
+ const activeFallbackCount =
619
+ Number(renderer._getActiveCssMediaLodFallbackCount?.(module) || 0);
620
+ renderer._activeCssMediaFallbackCountScanCount =
621
+ Number(renderer._activeCssMediaFallbackCountScanCount || 0) + 1;
622
+ renderer._activeCssMediaFallbackCountCacheNodeMap = nodeObjectsById;
623
+ renderer._activeCssMediaFallbackCountCacheRevision = fallbackRevision;
624
+ renderer._activeCssMediaFallbackCountCacheFallbackCount = fallbackCount;
625
+ renderer._activeCssMediaFallbackCountCacheValue = activeFallbackCount;
626
+ renderer._activeCssMediaFallbackCountCacheValid = true;
627
+ return activeFallbackCount;
628
+ }
629
+
630
+ function hasAnimatedGifCssFallbackCandidates(renderer, module, isAnimatedGifModel, selectionKey = '') {
414
631
  const nodeObjectsById = module?.nodeObjectsById || renderer?._module?.nodeObjectsById || null;
415
632
  if (!nodeObjectsById || typeof isAnimatedGifModel !== 'function') return false;
633
+ const visibilityVersion = Number(module?._visibilityVersion || 0);
634
+ const fallbackRevision = Number(renderer?._lodImageCssFallbackRevision || 0);
635
+ const fallbackCount = Number(renderer?._lodImageCssFallbackNodeIds?.size || 0);
636
+ const residentDirtySerial = Number(renderer?._instancesDirtySerial || 0);
637
+ const normalizedSelectionKey = String(selectionKey || '');
638
+ if (renderer?._animatedGifFallbackCandidateCacheValid === true &&
639
+ renderer._animatedGifFallbackCandidateNodeMap === nodeObjectsById &&
640
+ Number(renderer._animatedGifFallbackCandidateVisibilityVersion || 0) === visibilityVersion &&
641
+ Number(renderer._animatedGifFallbackCandidateFallbackRevision || 0) === fallbackRevision &&
642
+ Number(renderer._animatedGifFallbackCandidateFallbackCount || 0) === fallbackCount &&
643
+ Number(renderer._animatedGifFallbackCandidateResidentDirtySerial || 0) === residentDirtySerial &&
644
+ String(renderer._animatedGifFallbackCandidateSelectionKey || '') === normalizedSelectionKey) {
645
+ renderer._animatedGifFallbackCandidateCacheHitCount =
646
+ Number(renderer._animatedGifFallbackCandidateCacheHitCount || 0) + 1;
647
+ return renderer._animatedGifFallbackCandidateCacheValue === true;
648
+ }
649
+
650
+ renderer._animatedGifFallbackCandidateScanCount =
651
+ Number(renderer._animatedGifFallbackCandidateScanCount || 0) + 1;
416
652
  const isGifId = (value) => {
417
653
  const nodeId = String(value || '').trim();
654
+ if (nodeId) {
655
+ renderer._animatedGifFallbackCandidateNodeVisitCount =
656
+ Number(renderer._animatedGifFallbackCandidateNodeVisitCount || 0) + 1;
657
+ }
418
658
  return !!nodeId && isAnimatedGifModel(nodeObjectsById.get(nodeId)?.model) === true;
419
659
  };
420
660
  const scan = (ids) => {
@@ -423,10 +663,21 @@
423
663
  return false;
424
664
  };
425
665
  const visibleIds = module?._visibleIds || null;
426
- if (scan(visibleIds)) return true;
427
- if (module?._prevVisibleIds !== visibleIds && scan(module?._prevVisibleIds)) return true;
428
- if (isGifId(module?.selectedNodeIdJs) || scan(module?.multiSelectedNodeIds)) return true;
429
- return scan(renderer?._lodImageCssFallbackNodeIds);
666
+ const result =
667
+ scan(visibleIds) ||
668
+ (module?._prevVisibleIds !== visibleIds && scan(module?._prevVisibleIds)) ||
669
+ isGifId(module?.selectedNodeIdJs) ||
670
+ scan(module?.multiSelectedNodeIds) ||
671
+ scan(renderer?._lodImageCssFallbackNodeIds);
672
+ renderer._animatedGifFallbackCandidateNodeMap = nodeObjectsById;
673
+ renderer._animatedGifFallbackCandidateVisibilityVersion = visibilityVersion;
674
+ renderer._animatedGifFallbackCandidateFallbackRevision = fallbackRevision;
675
+ renderer._animatedGifFallbackCandidateFallbackCount = fallbackCount;
676
+ renderer._animatedGifFallbackCandidateResidentDirtySerial = residentDirtySerial;
677
+ renderer._animatedGifFallbackCandidateSelectionKey = normalizedSelectionKey;
678
+ renderer._animatedGifFallbackCandidateCacheValue = result === true;
679
+ renderer._animatedGifFallbackCandidateCacheValid = true;
680
+ return result === true;
430
681
  }
431
682
 
432
683
  function hasResidentDirtyWork(renderer, camera, module, resolveLodBand, buildSelectionKey, isAnimatedGifModel) {
@@ -434,7 +685,8 @@
434
685
  const lodBand = camera && typeof resolveLodBand === 'function'
435
686
  ? resolveLodBand(Number(camera.position?.z || 0))
436
687
  : renderer._currentLodBand;
437
- if (renderer._instancesDirty === true || renderer._imageInstancesDirty === true ||
688
+ const hasTypedResidentDirtyWork =
689
+ renderer._instancesDirty === true || renderer._imageInstancesDirty === true ||
438
690
  renderer._positionsOnlyDirty === true || renderer._isNodeArrayDirty === true ||
439
691
  Number(renderer._dirtyPositionIds?.size || 0) > 0 || Number(renderer._pendingSelectionRefreshIds?.size || 0) > 0 ||
440
692
  renderer._imageAtlasRebuildPending === true || Number(renderer._imageAtlasQueuedIds?.size || 0) > 0 ||
@@ -442,16 +694,28 @@
442
694
  renderer._imageAtlasBatchActive === true || renderer._lodCleanupPending === true ||
443
695
  renderer._deferLineRestorePending === true || renderer._hasPendingLineDetailRestore?.(lodBand) === true ||
444
696
  Number(renderer._pendingLodVisibilityVersion ?? -1) >= 0 || renderer._fullResHandoffActive === true ||
445
- renderer.isLoading === true || module?.isLoading === true || renderer._hasResidentLodInstances?.() !== true) return true;
697
+ renderer.isLoading === true || module?.isLoading === true || renderer._hasResidentLodInstances?.() !== true;
698
+ if (hasTypedResidentDirtyWork) {
699
+ invalidateAnimatedGifCssFallbackCandidateCache(renderer);
700
+ return true;
701
+ }
446
702
  const selectionKey = typeof buildSelectionKey === 'function'
447
703
  ? buildSelectionKey(module?.multiSelectedNodeIds || null, module?.selectedNodeIdJs || null)
448
704
  : '';
449
- if (renderer._lastAppliedLodSelectionKey !== selectionKey) return true;
705
+ if (renderer._lastAppliedLodSelectionKey !== selectionKey) {
706
+ invalidateAnimatedGifCssFallbackCandidateCache(renderer);
707
+ return true;
708
+ }
450
709
  const usesCssImageFallbacks = renderer._shouldUseCssImageFallbackInResidentLod?.(module, lodBand) === true;
451
- const usesAnimatedGifFallbacks = hasAnimatedGifCssFallbackCandidates(renderer, module, isAnimatedGifModel);
710
+ const usesAnimatedGifFallbacks = hasAnimatedGifCssFallbackCandidates(
711
+ renderer,
712
+ module,
713
+ isAnimatedGifModel,
714
+ selectionKey
715
+ );
452
716
  const fallbackCount = Number(renderer._lodImageCssFallbackNodeIds?.size || 0);
453
717
  if (!usesAnimatedGifFallbacks && fallbackCount <= 0) return false;
454
- const activeFallbackCount = Number(renderer._getActiveCssMediaLodFallbackCount?.(module) || 0);
718
+ const activeFallbackCount = getActiveCssMediaFallbackCountCached(renderer, module);
455
719
  return (usesAnimatedGifFallbacks && activeFallbackCount <= 0) ||
456
720
  (fallbackCount > 0 && (!(usesCssImageFallbacks || usesAnimatedGifFallbacks) || activeFallbackCount <= 0));
457
721
  }
@@ -800,7 +1064,13 @@
800
1064
  renderer._nearCssVisibleIds?.add?.(nodeId);
801
1065
  if (record.kind === 'image') renderer._syncCssImageBodyBridge?.(entry, module);
802
1066
  if (record.kind === 'video') globalThis.MindMapCss3DManager?.syncVideoNodeVisibilityPlayback?.(entry.model, cssObject, true);
803
- renderer._lodImageCssFallbackNodeIds?.delete?.(nodeId);
1067
+ if (typeof renderer._deleteLodImageCssFallbackNodeId === 'function') {
1068
+ renderer._deleteLodImageCssFallbackNodeId(nodeId);
1069
+ } else {
1070
+ renderer._lodImageCssFallbackNodeIds?.delete?.(nodeId);
1071
+ invalidateAnimatedGifCssFallbackCandidateCache(renderer);
1072
+ invalidateActiveCssMediaFallbackCountCache(renderer);
1073
+ }
804
1074
  state.parked.delete(nodeId);
805
1075
  renderer._residentCssRestoreCount = Number(renderer._residentCssRestoreCount || 0) + 1;
806
1076
  module._css3dVisualChangedThisFrame = true;
@@ -1462,6 +1732,10 @@
1462
1732
  fullResCssFringeLayoutWarmCount: Number(renderer?._fullResCssFringeLayoutWarmCount || 0),
1463
1733
  residentStableLineReuseCount: Number(renderer?._residentStableLineReuseCount || 0),
1464
1734
  residentBoostClearCount: Number(renderer?._residentBoostClearCount || 0),
1735
+ animatedGifFallbackCandidateScanCount: Number(renderer?._animatedGifFallbackCandidateScanCount || 0),
1736
+ animatedGifFallbackCandidateCacheHitCount: Number(renderer?._animatedGifFallbackCandidateCacheHitCount || 0),
1737
+ activeCssMediaFallbackCountScanCount: Number(renderer?._activeCssMediaFallbackCountScanCount || 0),
1738
+ activeCssMediaFallbackCountCacheHitCount: Number(renderer?._activeCssMediaFallbackCountCacheHitCount || 0),
1465
1739
  lineTextureRows: Number(renderer?.lineTextureRows || 0),
1466
1740
  residentGpuWarmComplete: !!renderer &&
1467
1741
  renderer._hasPendingImageAtlasWork?.() !== true &&
@@ -1487,6 +1761,9 @@
1487
1761
  window.MindMapRenderPlan = Object.freeze({
1488
1762
  configureImageAtlasTexture,
1489
1763
  getImageAtlasOutputColorChunk,
1764
+ isRendererDprInteractionActive,
1765
+ getCameraOnlyWebglBlockerMask,
1766
+ getCameraOnlyWebglBlockerNames,
1490
1767
  syncCommittedResidentTextCount,
1491
1768
  clearFullResImageVisuals,
1492
1769
  buildFullResKey,
@@ -1506,6 +1783,11 @@
1506
1783
  reuseStableVisibleCss,
1507
1784
  reuseActiveCssMediaFallback,
1508
1785
  hasAnimatedGifCssFallbackCandidates,
1786
+ invalidateAnimatedGifCssFallbackCandidateCache,
1787
+ getActiveCssMediaFallbackCountCached,
1788
+ invalidateActiveCssMediaFallbackCountCache,
1789
+ markLodImageCssFallbacksChanged,
1790
+ createTrackedLodImageCssFallbackSet,
1509
1791
  hasResidentDirtyWork,
1510
1792
  hasPendingNearCssWarmup,
1511
1793
  reusePreparedImageInstances,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-k4lwKbjJ9g84j895BOdrv32i+eUyBH6giaTuE3n/Wks=",
4
+ "hash": "sha256-ozr0I9dILkt75rgHyhws29r5tPUaoSZNhR5IIMPzRmk=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -122,16 +122,16 @@
122
122
  "System.brmz7yk5qh.dll": "System.dll",
123
123
  "netstandard.b50t77veor.dll": "netstandard.dll",
124
124
  "System.Private.CoreLib.g6ztz7cmo2.dll": "System.Private.CoreLib.dll",
125
- "MindExecution.Core.9h7x2mjn0w.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.8te3ay3qs6.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.imt43kggvu.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.26yozgyvan.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.k7fd1qvmfx.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.88ng22x3y0.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.ll20yqlc09.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.gqu5xngvav.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.6ivt1fatt3.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.7tki7xqpt0.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.sxhdhda5s2.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.j8gyjmvupu.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.91tk6u6ry5.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.b7h6v1eygj.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.i2zgmkmpwv.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.r6is6647n2.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.s95n9skblk.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.33l2m0y23q.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.hvehzbzkt7.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.krui41i71h.dll": "MindExecution.Web.dll",
135
135
  "dotnet.native.566r55w3xu.js": "dotnet.native.js",
136
136
  "dotnet.native.x6q5aixc38.wasm": "dotnet.native.wasm",
137
137
  "dotnet.js": "dotnet.js",
@@ -276,18 +276,18 @@
276
276
  "System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
277
277
  "System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
278
278
  "netstandard.b50t77veor.dll": "sha256-//jQGOXjb8ET8WtXgOJrAxLx6E7zDJ5RjRRutwkvmxo=",
279
- "MindExecution.Core.9h7x2mjn0w.dll": "sha256-4xFFMH5EUob9RXyohd+joGOoBTaarjSHyzY5kx3PRew=",
280
- "MindExecution.Kernel.8te3ay3qs6.dll": "sha256-RND/bkb6ILP8m7z9LRP827D9tNbpZLIKIcrd5uzm8/w=",
281
- "MindExecution.Plugins.Business.26yozgyvan.dll": "sha256-BhpTZtrJq26NpvKtYqHfYLKf2pJ93U0/R7WiPZMSedc=",
282
- "MindExecution.Plugins.Concept.k7fd1qvmfx.dll": "sha256-QEcnhJgU5OshztWG/haRRIbg3NnykUuI0vEYkx2d9rU=",
283
- "MindExecution.Plugins.PlanMaster.ll20yqlc09.dll": "sha256-KWcHEcj5l+QAGZXfxf7DCnyH1ACHwBwSVCgRReQPvyc=",
284
- "MindExecution.Shared.6ivt1fatt3.dll": "sha256-Qp5kQWJBgQ7XXBot/X/66cV19jqiEwUFLd9b20Oamgw=",
285
- "MindExecution.Web.7tki7xqpt0.dll": "sha256-JVtnGWCckZKnsid5V7G/01xTp3mnhCwxl112V16RTCg="
279
+ "MindExecution.Core.sxhdhda5s2.dll": "sha256-EIG5k0LEruwTjYF7YvBuQE7fvA8PjNqrVdVmBFoT3Es=",
280
+ "MindExecution.Kernel.j8gyjmvupu.dll": "sha256-swEZF4B89KFSR41x8negm6EC2/0mUl04DC1OcftiXAs=",
281
+ "MindExecution.Plugins.Business.b7h6v1eygj.dll": "sha256-aeAydGWzKaSuHiyUC3J7DaAJadTFaA6+nH4FKQDw53s=",
282
+ "MindExecution.Plugins.Concept.i2zgmkmpwv.dll": "sha256-dqQfhEjHX5uUJGT9Mg7NBoR6acPw7mgNL8Kj3W0AOm4=",
283
+ "MindExecution.Plugins.PlanMaster.s95n9skblk.dll": "sha256-kOyfHalRgMqdg46kBYFgiCX658udoDuwVM9q0rRKFjM=",
284
+ "MindExecution.Shared.hvehzbzkt7.dll": "sha256-jaQX0/pCtCVVmjc1lhP4/7cjTOZEuRs1N6d411G2eQQ=",
285
+ "MindExecution.Web.krui41i71h.dll": "sha256-QHRGgfNtxRcpVgYCkRu8CAnDoOEPMxl5fO03/4xitbQ="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.imt43kggvu.dll": "sha256-Bt7O2MFpDgzgB7CeUA4tB79feUGJiGvR7Zh4fUcGY+U=",
289
- "MindExecution.Plugins.Directory.88ng22x3y0.dll": "sha256-mDOSQlu0aRlQ+9xQUmvcZAazdUkU4IFbPZ4yJjCegxs=",
290
- "MindExecution.Plugins.YouTube.gqu5xngvav.dll": "sha256-KJg4t8mJDtKx8ElI66yv4H9Uw04BKb2g1d2RddYYhBk="
288
+ "MindExecution.Plugins.Admin.91tk6u6ry5.dll": "sha256-/e3ID1fHcTs61cU4k7Xis6qyq280i5dMBV1VxEzlB/U=",
289
+ "MindExecution.Plugins.Directory.r6is6647n2.dll": "sha256-E+nM/owGe41raBzurfDs4uNfmMFCtzXBt9cLv5ckr8Y=",
290
+ "MindExecution.Plugins.YouTube.33l2m0y23q.dll": "sha256-wbIiPGdzKEfUXoG42y0fT3HqEIenHcIo9vYY4y/SAVM="
291
291
  }
292
292
  },
293
293
  "cacheBootResources": true,
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -4,9 +4,13 @@
4
4
  <head>
5
5
  <meta charset="utf-8" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>MindExec | Business Execution OS for solo builders</title>
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
- <base href="/" />
7
+ <title>MindExec | Business Execution OS for solo builders</title>
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
+ <base href="/" />
10
+ <meta name="theme-color" content="#071a36" />
11
+ <link rel="icon" type="image/png" sizes="32x32" href="/mindexec-favicon-v2.png" />
12
+ <link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png?v=20260728-app-icon-v1" />
13
+ <link rel="manifest" href="manifest.webmanifest?v=20260728-app-icon-v1" />
10
14
  <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260629-ai-task-flow-v863" />
11
15
  <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260629-mdm-shadow-v856" />
12
16
  <!-- ??좎뜦堉??Font Awesome (local) ??좎뜦堉??-->
@@ -579,7 +583,7 @@
579
583
  }
580
584
 
581
585
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260727-world-grid-spotlight-v953';
586
+ const scriptVersion = '20260728-camera-render-policy-v961';
583
587
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
584
588
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
585
589
  const criticalScripts = [
@@ -1,22 +1,24 @@
1
1
  {
2
2
  "name": "MindExec",
3
3
  "short_name": "MindExec",
4
- "id": "./",
5
- "start_url": "./",
6
- "display": "standalone",
7
- "background_color": "#ffffff",
8
- "theme_color": "#03173d",
9
- "prefer_related_applications": false,
10
- "icons": [
11
- {
12
- "src": "icon-512.png",
13
- "type": "image/png",
14
- "sizes": "512x512"
15
- },
16
- {
17
- "src": "icon-192.png",
18
- "type": "image/png",
19
- "sizes": "192x192"
20
- }
21
- ]
22
- }
4
+ "id": "./",
5
+ "start_url": "./",
6
+ "display": "standalone",
7
+ "background_color": "#071a36",
8
+ "theme_color": "#071a36",
9
+ "prefer_related_applications": false,
10
+ "icons": [
11
+ {
12
+ "src": "icon-512.png?v=20260728-app-icon-v1",
13
+ "type": "image/png",
14
+ "sizes": "512x512",
15
+ "purpose": "any maskable"
16
+ },
17
+ {
18
+ "src": "icon-192.png?v=20260728-app-icon-v1",
19
+ "type": "image/png",
20
+ "sizes": "192x192",
21
+ "purpose": "any maskable"
22
+ }
23
+ ]
24
+ }
Binary file