@mindexec/cli 0.2.468 → 0.2.470

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 (22) hide show
  1. package/package.json +1 -1
  2. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  3. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  4. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  5. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +30 -176
  6. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +40 -2
  7. package/wwwroot/_content/MindExecution.Shared/js/mind-map-image-policy.js +207 -0
  8. package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +55 -7
  9. package/wwwroot/_framework/{MindExecution.Core.yrfbp4404m.dll → MindExecution.Core.kzbcbkmn27.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Kernel.qpodwwdiwx.dll → MindExecution.Kernel.c7qfof7tfg.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.Admin.8uzx32oujb.dll → MindExecution.Plugins.Admin.2vmuxhdwb6.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.Business.tx05qckwdp.dll → MindExecution.Plugins.Business.pkpabtra36.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.Concept.m3ew6te59x.dll → MindExecution.Plugins.Concept.ibjgxkahfu.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Plugins.Directory.9qioesdf9k.dll → MindExecution.Plugins.Directory.q92uq1o4e5.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.74t0l3lj50.dll → MindExecution.Plugins.PlanMaster.l291yoyxds.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.rw3h96cxzb.dll → MindExecution.Plugins.YouTube.jazcnpkde2.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Shared.ubxwcs5koc.dll → MindExecution.Shared.f51tf15188.dll} +0 -0
  18. package/wwwroot/_framework/{MindExecution.Web.mvn80sbzgp.dll → MindExecution.Web.3crklrc2je.dll} +0 -0
  19. package/wwwroot/_framework/blazor.boot.json +21 -21
  20. package/wwwroot/index.html +2 -1
  21. package/wwwroot/service-worker-assets.js +30 -26
  22. package/wwwroot/service-worker.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.468",
3
+ "version": "0.2.470",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -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 = '20260819-grid-zoom-density-sync-v868';
8
+ const MINDMAP_CORE_BUILD_ID = '20260819-grid-single-css-representation-v869';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -3269,10 +3269,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3269
3269
  this._lastLocalSnapGridWorldPeriod = this._lastLocalSnapGridWorldStep * 10;
3270
3270
  this._localSnapGridRasterPeriodPx = LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX;
3271
3271
  this._lastLocalSnapGridBackgroundSizeKey = '';
3272
- this._localSnapGridTileCanvas = null;
3273
3272
  this._localSnapGridPointerRevision = 0;
3274
3273
  this._lastLocalSnapGridPositionRevision = -1;
3275
- this._localSnapGridStyleDeferredForZoom = false;
3276
3274
  this._localSnapGridPointerWakeDeferredForZoom = false;
3277
3275
  this._lastSnapGridClientX = null;
3278
3276
  this._lastSnapGridClientY = null;
@@ -3341,14 +3339,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3341
3339
  const roundedY = Math.round(nextY * 2) / 2;
3342
3340
  if (Math.abs(Number(this._lastSnapGridClientX ?? Number.NaN) - roundedX) < 0.001 &&
3343
3341
  Math.abs(Number(this._lastSnapGridClientY ?? Number.NaN) - roundedY) < 0.001) {
3344
- if (this.isZooming === true) {
3345
- this._localSnapGridStyleDeferredForZoom = true;
3346
- }
3347
3342
  return false;
3348
3343
  }
3349
- if (this.isZooming === true) {
3350
- this._localSnapGridStyleDeferredForZoom = true;
3351
- }
3352
3344
 
3353
3345
  const previousX = this._lastSnapGridClientX;
3354
3346
  const previousY = this._lastSnapGridClientY;
@@ -3525,7 +3517,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3525
3517
  this._lastLocalSnapGridWorldPeriod = this._lastLocalSnapGridWorldStep * 10;
3526
3518
  this._localSnapGridRasterPeriodPx = LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX;
3527
3519
  this._lastLocalSnapGridBackgroundSizeKey = '';
3528
- this._localSnapGridStyleDeferredForZoom = false;
3529
3520
  return layer;
3530
3521
  }
3531
3522
 
@@ -3712,85 +3703,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3712
3703
  return themeName === 'SpatialGrid2D' ? 'dot' : 'line';
3713
3704
  }
3714
3705
 
3715
- _drawLocalSnapGridTile(canvas, styleKind, smallStepPx, majorStepPx) {
3716
- if (!canvas || typeof canvas.getContext !== 'function') {
3717
- return false;
3718
- }
3719
-
3720
- const ctx = canvas.getContext('2d', { alpha: true });
3721
- if (!ctx) {
3722
- return false;
3723
- }
3724
-
3725
- const smallStep = Math.max(LOCAL_SNAP_GRID_RASTER_MIN_STEP_PX, Number(smallStepPx) || LOCAL_SNAP_GRID_DEFAULT_STEP_PX);
3726
- const majorStep = Math.max(
3727
- smallStep,
3728
- Math.min(
3729
- LOCAL_SNAP_GRID_RASTER_MAX_PERIOD_PX,
3730
- Number(majorStepPx) || LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX
3731
- )
3732
- );
3733
- const tileSize = Math.max(1, majorStep);
3734
- const minorDetailAlpha = this._resolveLocalSnapGridMinorDetailAlpha(smallStep);
3735
- const viewportDpr = Math.max(1, Math.min(3, Number(this._lastViewportDpr || window.devicePixelRatio || 1)));
3736
- const bitmapSize = Math.max(1, Math.ceil(tileSize * viewportDpr));
3737
- if (canvas.width !== bitmapSize) {
3738
- canvas.width = bitmapSize;
3739
- }
3740
- if (canvas.height !== bitmapSize) {
3741
- canvas.height = bitmapSize;
3742
- }
3743
- const rasterScale = bitmapSize / tileSize;
3744
- ctx.setTransform(rasterScale, 0, 0, rasterScale, 0, 0);
3745
- ctx.clearRect(0, 0, tileSize, tileSize);
3746
-
3747
- if (styleKind === 'dot') {
3748
- if (minorDetailAlpha > 0.001) {
3749
- ctx.fillStyle = `rgba(58, 69, 88, ${(0.68 * minorDetailAlpha).toFixed(3)})`;
3750
- const dotRadius = 1.2;
3751
- for (let y = 0; y < tileSize; y += smallStep) {
3752
- for (let x = 0; x < tileSize; x += smallStep) {
3753
- ctx.beginPath();
3754
- ctx.arc(x, y, dotRadius, 0, Math.PI * 2);
3755
- ctx.fill();
3756
- }
3757
- }
3758
- }
3759
-
3760
- ctx.fillStyle = 'rgba(15, 23, 42, 0.82)';
3761
- ctx.beginPath();
3762
- ctx.arc(0, 0, 1.9, 0, Math.PI * 2);
3763
- ctx.fill();
3764
- } else {
3765
- const drawLines = (step, color, width) => {
3766
- ctx.strokeStyle = color;
3767
- ctx.lineWidth = width;
3768
- ctx.beginPath();
3769
- for (let x = 0; x < tileSize; x += step) {
3770
- const pixelX = Math.round(x) + 0.5;
3771
- ctx.moveTo(pixelX, 0);
3772
- ctx.lineTo(pixelX, tileSize);
3773
- }
3774
- for (let y = 0; y < tileSize; y += step) {
3775
- const pixelY = Math.round(y) + 0.5;
3776
- ctx.moveTo(0, pixelY);
3777
- ctx.lineTo(tileSize, pixelY);
3778
- }
3779
- ctx.stroke();
3780
- };
3781
-
3782
- if (minorDetailAlpha > 0.001) {
3783
- drawLines(
3784
- smallStep,
3785
- `rgba(51, 65, 85, ${(0.24 * minorDetailAlpha).toFixed(3)})`,
3786
- 1
3787
- );
3788
- }
3789
- drawLines(majorStep, 'rgba(15, 23, 42, 0.42)', 1);
3790
- }
3791
- return tileSize;
3792
- }
3793
-
3794
3706
  _applyLocalSnapGridStyle(
3795
3707
  layer,
3796
3708
  styleKind,
@@ -3819,6 +3731,14 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3819
3731
  const safeOpacity = Number.isFinite(parsedOpacity)
3820
3732
  ? Math.max(0, Math.min(0.68, parsedOpacity))
3821
3733
  : LOCAL_SNAP_GRID_DEFAULT_OPACITY;
3734
+ if (safeStyleKind === 'line') {
3735
+ return this._applyLocalSnapGridLineStyle(
3736
+ layer,
3737
+ safeSmallStep,
3738
+ safeMajorStep,
3739
+ safeOpacity
3740
+ );
3741
+ }
3822
3742
  const localGridKey = [
3823
3743
  keyPrefix,
3824
3744
  safeStyleKind,
@@ -3830,10 +3750,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3830
3750
  const majorStepValue = safeMajorStep.toFixed(3);
3831
3751
  const minorDetailAlpha = this._resolveLocalSnapGridMinorDetailAlpha(safeSmallStep);
3832
3752
  const showMinorDots = minorDetailAlpha > 0.001;
3833
- const backgroundSizeValue = safeStyleKind === 'dot'
3834
- ? (showMinorDots
3835
- ? `${majorStepValue}px ${majorStepValue}px, ${smallStepValue}px ${smallStepValue}px`
3836
- : `${majorStepValue}px ${majorStepValue}px`)
3753
+ const backgroundSizeValue = showMinorDots
3754
+ ? `${majorStepValue}px ${majorStepValue}px, ${smallStepValue}px ${smallStepValue}px`
3837
3755
  : `${majorStepValue}px ${majorStepValue}px`;
3838
3756
  const backgroundSizeKey = backgroundSizeValue;
3839
3757
 
@@ -3849,46 +3767,22 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3849
3767
 
3850
3768
  const opacityValue = safeOpacity.toFixed(3);
3851
3769
  this._lastLocalSnapGridOpacity = opacityValue;
3852
- if (safeStyleKind === 'dot') {
3853
- const majorDot = 'radial-gradient(circle at 0 0, rgba(15, 23, 42, 0.82) 0 1.9px, transparent 2px)';
3854
- const minorDotAlphaValue = (0.68 * minorDetailAlpha).toFixed(3);
3855
- const minorDot = `radial-gradient(circle at 0 0, rgba(58, 69, 88, ${minorDotAlphaValue}) 0 1.2px, transparent 1.3px)`;
3856
- const backgroundImage = showMinorDots ? `${majorDot}, ${minorDot}` : majorDot;
3857
- this._lastLocalSnapGridKey = localGridKey;
3858
- this._lastLocalSnapGridPatternPeriodPx = safeMajorStep;
3859
- this._localSnapGridRasterPeriodPx = safeMajorStep;
3860
- this._lastLocalSnapGridTransformKey = '';
3861
- if (layer.style.backgroundImage !== backgroundImage) layer.style.backgroundImage = backgroundImage;
3862
- this._lastLocalSnapGridBackgroundSizeKey = backgroundSizeKey;
3863
- if (layer.style.backgroundSize !== backgroundSizeValue) layer.style.backgroundSize = backgroundSizeValue;
3864
- if (layer.style.opacity !== opacityValue) layer.style.opacity = opacityValue;
3865
- return true;
3866
- }
3867
- const tileCanvas = this._localSnapGridTileCanvas || document.createElement('canvas');
3868
- this._localSnapGridTileCanvas = tileCanvas;
3869
- const tileSize = this._drawLocalSnapGridTile(
3870
- tileCanvas,
3871
- safeStyleKind,
3872
- safeSmallStep,
3873
- safeMajorStep
3874
- );
3875
- if (!Number.isFinite(tileSize) || tileSize <= 0) {
3876
- return false;
3877
- }
3770
+ const majorDot = 'radial-gradient(circle at 0 0, rgba(15, 23, 42, 0.82) 0 1.9px, transparent 2px)';
3771
+ const minorDotAlphaValue = (0.68 * minorDetailAlpha).toFixed(3);
3772
+ const minorDot = `radial-gradient(circle at 0 0, rgba(58, 69, 88, ${minorDotAlphaValue}) 0 1.2px, transparent 1.3px)`;
3773
+ const backgroundImage = showMinorDots ? `${majorDot}, ${minorDot}` : majorDot;
3878
3774
  this._lastLocalSnapGridKey = localGridKey;
3879
3775
  this._lastLocalSnapGridPatternPeriodPx = safeMajorStep;
3880
3776
  this._localSnapGridRasterPeriodPx = safeMajorStep;
3881
3777
  this._lastLocalSnapGridTransformKey = '';
3882
- layer.style.backgroundImage = `url("${tileCanvas.toDataURL('image/png')}")`;
3778
+ if (layer.style.backgroundImage !== backgroundImage) layer.style.backgroundImage = backgroundImage;
3883
3779
  this._lastLocalSnapGridBackgroundSizeKey = backgroundSizeKey;
3884
- layer.style.backgroundSize = backgroundSizeValue;
3885
- if (layer.style.opacity !== opacityValue) {
3886
- layer.style.opacity = opacityValue;
3887
- }
3780
+ if (layer.style.backgroundSize !== backgroundSizeValue) layer.style.backgroundSize = backgroundSizeValue;
3781
+ if (layer.style.opacity !== opacityValue) layer.style.opacity = opacityValue;
3888
3782
  return true;
3889
3783
  }
3890
3784
 
3891
- _applyLocalSnapGridMotionStyle(layer, smallStepPx, majorStepPx, opacity) {
3785
+ _applyLocalSnapGridLineStyle(layer, smallStepPx, majorStepPx, opacity) {
3892
3786
  if (!layer) return false;
3893
3787
 
3894
3788
  const safeSmallStep = Math.max(
@@ -3919,7 +3813,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3919
3813
  'linear-gradient(to right, rgba(15, 23, 42, 0.42) 0 1px, transparent 1px)',
3920
3814
  'linear-gradient(to bottom, rgba(15, 23, 42, 0.42) 0 1px, transparent 1px)'
3921
3815
  ].join(', ');
3922
- const motionKey = `motion-line|${smallStepValue}|${majorStepValue}|${safeOpacity.toFixed(3)}`;
3816
+ const motionKey = `line-css|${smallStepValue}|${majorStepValue}|${safeOpacity.toFixed(3)}`;
3923
3817
 
3924
3818
  if (motionKey === this._lastLocalSnapGridKey) return false;
3925
3819
 
@@ -3955,7 +3849,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3955
3849
  LOCAL_SNAP_GRID_DEFAULT_OPACITY,
3956
3850
  'base'
3957
3851
  );
3958
- this._localSnapGridStyleDeferredForZoom = true;
3959
3852
  return true;
3960
3853
  }
3961
3854
 
@@ -4000,7 +3893,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4000
3893
  }
4001
3894
 
4002
3895
  this._localSnapGridVisible = false;
4003
- this._localSnapGridStyleDeferredForZoom = false;
4004
3896
  this._lastLocalSnapGridPositionRevision = -1;
4005
3897
  if (layer.style.opacity !== '0') {
4006
3898
  layer.style.opacity = '0';
@@ -4060,29 +3952,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4060
3952
  this._lastLocalSnapGridWorldStep = gridProjection.worldStep;
4061
3953
  this._lastLocalSnapGridWorldPeriod = gridProjection.worldStep * 10;
4062
3954
  const styleKind = this._getLocalSnapGridStyleKind();
4063
- const shouldDeferLocalGridStyleForZoom =
4064
- this.isZooming === true &&
4065
- styleKind !== 'dot' &&
4066
- !!this._lastLocalSnapGridKey;
4067
-
4068
- if (shouldDeferLocalGridStyleForZoom !== true) {
4069
- this._localSnapGridStyleDeferredForZoom = false;
4070
- this._applyLocalSnapGridStyle(
4071
- layer,
4072
- styleKind,
4073
- smallStepPx,
4074
- majorStepPx,
4075
- opacity
4076
- );
4077
- } else if (shouldDeferLocalGridStyleForZoom === true) {
4078
- this._applyLocalSnapGridMotionStyle(
4079
- layer,
4080
- smallStepPx,
4081
- majorStepPx,
4082
- opacity
4083
- );
4084
- this._localSnapGridStyleDeferredForZoom = true;
4085
- }
3955
+ this._applyLocalSnapGridStyle(
3956
+ layer,
3957
+ styleKind,
3958
+ smallStepPx,
3959
+ majorStepPx,
3960
+ opacity
3961
+ );
4086
3962
 
4087
3963
  this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
4088
3964
  this._lastLocalSnapGridPositionRevision = pointerRevision;
@@ -4101,15 +3977,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4101
3977
  return false;
4102
3978
  }
4103
3979
 
4104
- const shouldRefreshDeferredZoomProjection =
4105
- this.isZooming === true ||
4106
- this._localSnapGridStyleDeferredForZoom === true;
4107
3980
  if (!this._localSnapGridLayer?.isConnected || !this._lastLocalSnapGridKey) {
4108
3981
  const layer = this._ensureLocalSnapGridLayer();
4109
3982
  if (!layer) {
4110
3983
  return false;
4111
3984
  }
4112
- if (shouldRefreshDeferredZoomProjection === true) {
3985
+ if (this.isZooming === true) {
4113
3986
  this._ensureLocalSnapGridBaseStyle(layer);
4114
3987
  } else {
4115
3988
  return this._syncLocalSnapGridLayer(visible);
@@ -4132,20 +4005,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4132
4005
  return false;
4133
4006
  }
4134
4007
  const styleKind = this._getLocalSnapGridStyleKind();
4135
- if (shouldRefreshDeferredZoomProjection === true && styleKind === 'dot') {
4008
+ if (this.isZooming === true) {
4136
4009
  const vfov = (Number(this.camera?.fov || 45) * Math.PI) / 180;
4137
4010
  const pxPerWorld = height / Math.max(1, 2 * Math.tan(vfov / 2) * cameraZ);
4138
4011
  const projection = this._resolveLocalSnapGridWorldStep(pxPerWorld);
4139
4012
  this._applyLocalSnapGridStyle(
4140
4013
  layer, styleKind, projection.smallStepPx, projection.majorStepPx, opacity);
4141
- this._localSnapGridStyleDeferredForZoom = false;
4142
- } else if (shouldRefreshDeferredZoomProjection === true) {
4143
- const vfov = (Number(this.camera?.fov || 45) * Math.PI) / 180;
4144
- const pxPerWorld = height / Math.max(1, 2 * Math.tan(vfov / 2) * cameraZ);
4145
- const projection = this._resolveLocalSnapGridWorldStep(pxPerWorld);
4146
- this._applyLocalSnapGridMotionStyle(
4147
- layer, projection.smallStepPx, projection.majorStepPx, opacity);
4148
- this._localSnapGridStyleDeferredForZoom = true;
4149
4014
  }
4150
4015
  this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
4151
4016
  this._lastLocalSnapGridPositionRevision = pointerRevision;
@@ -6255,11 +6120,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6255
6120
  if (shouldFinalizeMotionThisFrame) {
6256
6121
  this._lastMotionEndAt = frameStart;
6257
6122
  if (zoomEndedThisFrame === true) {
6258
- // The compositor transform already keeps the grid in the
6259
- // canonical world coordinate system. Preserve that exact
6260
- // pose here and let the existing idle cadence refresh the
6261
- // crisp raster once, so physical-wheel notches cannot
6262
- // trigger canvas.toDataURL() on every no-input frame.
6263
6123
  this._localSnapGridPointerWakeDeferredForZoom = false;
6264
6124
  }
6265
6125
  if (cameraEndedThisFrame) {
@@ -7255,17 +7115,12 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
7255
7115
  const localSnapGridPointerRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
7256
7116
  const hasPendingLocalSnapGridPointerMove =
7257
7117
  Number(this._lastLocalSnapGridPositionRevision ?? -1) !== localSnapGridPointerRevision;
7258
- const shouldDeferLocalSnapGridRasterUntilBurstSettle = !!(
7259
- this._localSnapGridStyleDeferredForZoom === true &&
7260
- wheelZoomBurstSettledThisFrame !== true
7261
- );
7262
7118
  const shouldUseLocalSnapGridPositionOnly = !!(
7263
7119
  this._localSnapGridLayer?.isConnected &&
7264
7120
  this._lastLocalSnapGridKey &&
7265
7121
  (
7266
7122
  isCameraNavigationOnlyInteractiveFrame === true ||
7267
- hasPendingLocalSnapGridPointerMove === true ||
7268
- shouldDeferLocalSnapGridRasterUntilBurstSettle === true
7123
+ hasPendingLocalSnapGridPointerMove === true
7269
7124
  )
7270
7125
  );
7271
7126
  syncLocalSnapGridForCameraNavigation(this, shouldUseLocalSnapGridPositionOnly === true);
@@ -8050,7 +7905,6 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
8050
7905
  this._localSnapGridSpotlightLayer.remove();
8051
7906
  this._localSnapGridSpotlightLayer = null;
8052
7907
  }
8053
- this._localSnapGridTileCanvas = null;
8054
7908
  if (this._backgroundGridLayerHost) {
8055
7909
  this._backgroundGridLayerHost.remove();
8056
7910
  this._backgroundGridLayerHost = null;
@@ -1720,6 +1720,17 @@
1720
1720
  _cssImagePreviewHoldUntil = getCssImagePromotionNow() + getPostLoadCssImagePreviewHoldMs(activeModule);
1721
1721
  clearCssImagePromotionQueue();
1722
1722
  _cssImagePromotionProcessing = false;
1723
+ activeModule?.nodeObjectsById?.forEach?.((entry, nodeId) => {
1724
+ if (window.MindMapImagePolicy?.isGeneratedImageNodeModel?.(entry?.model) === true) {
1725
+ enqueueCssImagePromotion(nodeId);
1726
+ }
1727
+ });
1728
+ if (_cssImagePromotionQueue.length > 0) {
1729
+ scheduleCssImagePromotionPump(
1730
+ activeModule,
1731
+ Math.max(16, Math.ceil(_cssImagePreviewHoldUntil - getCssImagePromotionNow()))
1732
+ );
1733
+ }
1723
1734
  }
1724
1735
 
1725
1736
  function getCssMediaMetadata(nodeModel) {
@@ -1783,6 +1794,13 @@
1783
1794
  return responseUrl || originalUrl;
1784
1795
  }
1785
1796
 
1797
+ const generatedOriginalUrl = normalizeCssMediaUrl(
1798
+ window.MindMapImagePolicy?.getGeneratedImageOriginalReference?.(nodeModel, assetUrls) || ''
1799
+ );
1800
+ if (generatedOriginalUrl) {
1801
+ return generatedOriginalUrl;
1802
+ }
1803
+
1786
1804
  return previewUrl || responseUrl || originalUrl;
1787
1805
  }
1788
1806
 
@@ -4182,12 +4200,19 @@
4182
4200
  if (!mediaEl || contentTypeLower !== 'image') return;
4183
4201
  if (options.bypassPreviewHold !== true && shouldPreferCssImagePreviewSource(nodeModel)) return;
4184
4202
  const forceAnimatedGifOriginal = isAnimatedGifCssImageNode(nodeModel);
4185
- if (options.forceOriginal !== true && !forceAnimatedGifOriginal && !shouldPromoteCssImageOriginal(nodeModel)) return;
4186
4203
 
4187
4204
  const assetUrls = window.MindMapNodes?.getNodeImageAssetUrls?.(nodeModel) || null;
4205
+ const generatedOriginalReference = normalizeCssMediaUrl(
4206
+ window.MindMapImagePolicy?.getGeneratedImageOriginalReference?.(nodeModel, assetUrls) || ''
4207
+ );
4208
+ if (options.forceOriginal !== true
4209
+ && !forceAnimatedGifOriginal
4210
+ && !generatedOriginalReference
4211
+ && !shouldPromoteCssImageOriginal(nodeModel)) return;
4188
4212
  const metadata = getCssMediaMetadata(nodeModel);
4189
4213
  const originalUrl = normalizeCssMediaUrl(
4190
- assetUrls?.fullResUrl
4214
+ generatedOriginalReference
4215
+ || assetUrls?.fullResUrl
4191
4216
  || assetUrls?.originalUrl
4192
4217
  || metadata?.OriginalUrl
4193
4218
  || metadata?.originalUrl
@@ -4206,6 +4231,11 @@
4206
4231
  isThumbnailCssMediaUrl(currentSource)
4207
4232
  ) {
4208
4233
  mediaEl.dataset.assetRefreshAttempted = '';
4234
+ if (generatedOriginalReference) {
4235
+ console.info('[MindMapCss3DManager] Promoting generated image preview to original', {
4236
+ nodeId: String(nodeModel?.id ?? nodeModel?.Id ?? '')
4237
+ });
4238
+ }
4209
4239
  void setCssImageElementSource(mediaEl, nodeModel, originalUrl);
4210
4240
  }
4211
4241
  return;
@@ -4223,6 +4253,11 @@
4223
4253
  if (mediaEl.dataset.originalResolveAttempted === '1') return;
4224
4254
 
4225
4255
  mediaEl.dataset.originalResolveAttempted = '1';
4256
+ if (generatedOriginalReference) {
4257
+ console.info('[MindMapCss3DManager] Resolving generated image original after preview', {
4258
+ nodeId: String(nodeModel?.id ?? nodeModel?.Id ?? '')
4259
+ });
4260
+ }
4226
4261
  void tryRefreshCssMediaSource(mediaEl, nodeModel, contentTypeLower);
4227
4262
  }
4228
4263
 
@@ -4362,6 +4397,9 @@
4362
4397
  isCssImagePreviewHoldActive() ||
4363
4398
  isCssImagePromotionInteractionActive(activeModule);
4364
4399
  if (shouldQueuePromotion) {
4400
+ if (window.MindMapImagePolicy?.isGeneratedImageNodeModel?.(entry.model) === true) {
4401
+ enqueueCssImagePromotion(nodeId);
4402
+ }
4365
4403
  return;
4366
4404
  }
4367
4405
 
@@ -0,0 +1,207 @@
1
+ (function () {
2
+ 'use strict';
3
+
4
+ const BUILD_ID = '20260819-image-original-resize-v1';
5
+
6
+ function normalizeContentType(nodeModel) {
7
+ return String(nodeModel?.contentType ?? nodeModel?.ContentType ?? '').trim().toLowerCase();
8
+ }
9
+
10
+ function getMetadata(nodeModel) {
11
+ return nodeModel?.metadata ?? nodeModel?.Metadata ?? {};
12
+ }
13
+
14
+ function getMetadataValue(metadata, ...keys) {
15
+ if (!metadata || typeof metadata !== 'object') return '';
16
+
17
+ for (const key of keys) {
18
+ const value = metadata[key];
19
+ if (value !== undefined && value !== null && String(value).trim()) {
20
+ return String(value).trim();
21
+ }
22
+ }
23
+
24
+ const wanted = new Set(keys.map(key => String(key).toLowerCase()));
25
+ for (const [key, value] of Object.entries(metadata)) {
26
+ if (wanted.has(String(key).toLowerCase())
27
+ && value !== undefined
28
+ && value !== null
29
+ && String(value).trim()) {
30
+ return String(value).trim();
31
+ }
32
+ }
33
+
34
+ return '';
35
+ }
36
+
37
+ function toPositiveNumber(value) {
38
+ const numeric = Number(value);
39
+ return Number.isFinite(numeric) && numeric > 0 ? numeric : 0;
40
+ }
41
+
42
+ function ratioFromPair(width, height) {
43
+ const numericWidth = toPositiveNumber(width);
44
+ const numericHeight = toPositiveNumber(height);
45
+ if (!(numericWidth > 0 && numericHeight > 0)) return 0;
46
+
47
+ const ratio = numericWidth / numericHeight;
48
+ return Number.isFinite(ratio) && ratio >= 0.05 && ratio <= 20 ? ratio : 0;
49
+ }
50
+
51
+ function isGeneratedImageNodeModel(nodeModel) {
52
+ if (!nodeModel || normalizeContentType(nodeModel) !== 'image') return false;
53
+
54
+ const metadata = getMetadata(nodeModel);
55
+ const operation = getMetadataValue(
56
+ metadata,
57
+ 'RequestedMediaOperation',
58
+ 'requestedMediaOperation'
59
+ ).toLowerCase();
60
+
61
+ return !!getMetadataValue(metadata, 'ImageGenerationProvider', 'imageGenerationProvider')
62
+ || !!getMetadataValue(metadata, 'GeneratedImageSourceWidth', 'generatedImageSourceWidth')
63
+ || !!getMetadataValue(metadata, 'GeneratedImageSourceHeight', 'generatedImageSourceHeight')
64
+ || !!getMetadataValue(metadata, 'CodexImageQuality', 'codexImageQuality')
65
+ || !!getMetadataValue(metadata, 'ImageRouterRevisedPrompt', 'imageRouterRevisedPrompt')
66
+ || operation === 'text2image'
67
+ || operation === 'image2image'
68
+ || operation === 'inpaint';
69
+ }
70
+
71
+ function getGeneratedImageOriginalReference(nodeModel, assetUrls = null) {
72
+ if (!isGeneratedImageNodeModel(nodeModel)) return '';
73
+
74
+ const metadata = getMetadata(nodeModel);
75
+ const candidates = [
76
+ assetUrls?.fullResUrl,
77
+ assetUrls?.originalUrl,
78
+ assetUrls?.originalPath,
79
+ getMetadataValue(metadata, 'OriginalUrl', 'originalUrl'),
80
+ getMetadataValue(metadata, 'OriginalPath', 'originalPath')
81
+ ];
82
+
83
+ for (const candidate of candidates) {
84
+ const normalized = String(candidate || '').trim();
85
+ if (normalized) return normalized;
86
+ }
87
+
88
+ return '';
89
+ }
90
+
91
+ function getOriginalAspectRatio(nodeEntry, fallbackWidth = 0, fallbackHeight = 0) {
92
+ const nodeModel = nodeEntry?.model ?? nodeEntry;
93
+ if (!nodeModel || normalizeContentType(nodeModel) !== 'image') return 0;
94
+
95
+ const metadata = getMetadata(nodeModel);
96
+ const metadataPairs = [
97
+ [
98
+ getMetadataValue(metadata, 'GeneratedImageSourceWidth', 'generatedImageSourceWidth'),
99
+ getMetadataValue(metadata, 'GeneratedImageSourceHeight', 'generatedImageSourceHeight')
100
+ ],
101
+ [
102
+ getMetadataValue(metadata, 'ImageIntrinsicWidth', 'imageIntrinsicWidth'),
103
+ getMetadataValue(metadata, 'ImageIntrinsicHeight', 'imageIntrinsicHeight')
104
+ ]
105
+ ];
106
+
107
+ for (const [width, height] of metadataPairs) {
108
+ const ratio = ratioFromPair(width, height);
109
+ if (ratio > 0) return ratio;
110
+ }
111
+
112
+ const imageElement = nodeEntry?.cssObject?.element?.querySelector?.('img') || null;
113
+ const naturalRatio = ratioFromPair(
114
+ imageElement?.naturalWidth || imageElement?.width,
115
+ imageElement?.naturalHeight || imageElement?.height
116
+ );
117
+ if (naturalRatio > 0) return naturalRatio;
118
+
119
+ const generatedDisplayRatio = ratioFromPair(
120
+ getMetadataValue(metadata, 'GeneratedImageDisplayWidth', 'generatedImageDisplayWidth'),
121
+ getMetadataValue(metadata, 'GeneratedImageDisplayHeight', 'generatedImageDisplayHeight')
122
+ );
123
+ if (generatedDisplayRatio > 0) return generatedDisplayRatio;
124
+
125
+ return ratioFromPair(
126
+ fallbackWidth || nodeModel.width || nodeModel.Width,
127
+ fallbackHeight || nodeModel.height || nodeModel.Height
128
+ );
129
+ }
130
+
131
+ function constrainBottomRightDimensions(
132
+ proposedWidth,
133
+ proposedHeight,
134
+ startWidth,
135
+ startHeight,
136
+ aspectRatio,
137
+ limits = {}) {
138
+ const ratio = toPositiveNumber(aspectRatio);
139
+ if (!(ratio > 0)) {
140
+ return {
141
+ width: Number(proposedWidth),
142
+ height: Number(proposedHeight),
143
+ aspectLocked: false
144
+ };
145
+ }
146
+
147
+ const minWidth = Math.max(1, toPositiveNumber(limits.minWidth) || 1);
148
+ const minHeight = Math.max(1, toPositiveNumber(limits.minHeight) || 1);
149
+ const maxWidth = Math.max(minWidth, toPositiveNumber(limits.maxWidth) || Number.MAX_SAFE_INTEGER);
150
+ const maxHeight = Math.max(minHeight, toPositiveNumber(limits.maxHeight) || Number.MAX_SAFE_INTEGER);
151
+ const width = Number(proposedWidth);
152
+ const height = Number(proposedHeight);
153
+ const initialWidth = Number(startWidth);
154
+ const initialHeight = Number(startHeight);
155
+ const widthMotion = Math.abs(width - initialWidth);
156
+ const heightMotionAsWidth = Math.abs(height - initialHeight) * ratio;
157
+ let targetHeight = widthMotion >= heightMotionAsWidth ? width / ratio : height;
158
+
159
+ const minimumLockedHeight = Math.max(minHeight, minWidth / ratio);
160
+ const maximumLockedHeight = Math.min(maxHeight, maxWidth / ratio);
161
+ targetHeight = Math.min(
162
+ Math.max(minimumLockedHeight, targetHeight),
163
+ Math.max(minimumLockedHeight, maximumLockedHeight)
164
+ );
165
+
166
+ return {
167
+ width: targetHeight * ratio,
168
+ height: targetHeight,
169
+ aspectLocked: true
170
+ };
171
+ }
172
+
173
+ function snapAspectLockedDimensions(width, height, aspectRatio, gridSize, limits = {}) {
174
+ const ratio = toPositiveNumber(aspectRatio);
175
+ const grid = toPositiveNumber(gridSize);
176
+ if (!(ratio > 0 && grid > 0)) {
177
+ return constrainBottomRightDimensions(width, height, width, height, ratio, limits);
178
+ }
179
+
180
+ const snappedWidth = Math.max(grid, Math.round(Number(width) / grid) * grid);
181
+ const snappedHeight = Math.max(grid, Math.round(Number(height) / grid) * grid);
182
+ const proposedWidth = ratio >= 1 ? snappedWidth : snappedHeight * ratio;
183
+ const proposedHeight = ratio >= 1 ? snappedWidth / ratio : snappedHeight;
184
+ return constrainBottomRightDimensions(
185
+ proposedWidth,
186
+ proposedHeight,
187
+ proposedWidth,
188
+ proposedHeight,
189
+ ratio,
190
+ limits
191
+ );
192
+ }
193
+
194
+ window.MindMapImagePolicy = {
195
+ build: BUILD_ID,
196
+ isGeneratedImageNodeModel,
197
+ getGeneratedImageOriginalReference,
198
+ getOriginalAspectRatio,
199
+ constrainBottomRightDimensions,
200
+ snapAspectLockedDimensions
201
+ };
202
+
203
+ window.MindCanvasBuildInfo?.registerPart?.('imagePolicy', BUILD_ID, {
204
+ generatedOriginalAfterLoad: true,
205
+ bottomRightAspectLock: true
206
+ });
207
+ })();
@@ -17,6 +17,8 @@
17
17
  const ENABLE_WEBGL_GLOW = false;
18
18
  const DEFAULT_MIN_NODE_WIDTH = 200;
19
19
  const DEFAULT_MIN_NODE_HEIGHT = 100;
20
+ const MAX_NODE_WIDTH = 2000;
21
+ const MAX_NODE_HEIGHT = 4000;
20
22
  const CSV_TABLE_CONTENT_TYPE = 'csv-table';
21
23
  const CSV_TABLE_MIN_WIDTH = 320;
22
24
  const CSV_TABLE_MIN_HEIGHT = 180;
@@ -1102,6 +1104,13 @@
1102
1104
  w: nodeEntry.model.width || 400,
1103
1105
  h: nodeEntry.model.height || 200
1104
1106
  };
1107
+ module.resizeAspectRatio = corner === 'BR' && getNodeContentType(nodeEntry.model) === 'image'
1108
+ ? Number(window.MindMapImagePolicy?.getOriginalAspectRatio?.(
1109
+ nodeEntry,
1110
+ module.resizeStartDimensions.w,
1111
+ module.resizeStartDimensions.h
1112
+ ) || 0)
1113
+ : 0;
1105
1114
  // Store initial position from the active render object (CSS/GL) to avoid
1106
1115
  // image-node jumps when CSS and GL are slightly out of sync.
1107
1116
  const activePos = module.resizeNodeObject?.position
@@ -1147,10 +1156,6 @@
1147
1156
 
1148
1157
  function doResizing(module, currentX, currentY) {
1149
1158
  if (!module.isResizing || !module.resizeNodeObject) return;
1150
- // ▼▼▼ [Changed] Cap max node size: X=2000, Y=4000 ▼▼▼
1151
- const MAX_NODE_WIDTH = 2000;
1152
- const MAX_NODE_HEIGHT = 4000;
1153
- // ▲▲▲ [Changed] ▲▲▲
1154
1159
 
1155
1160
  const vfov = (module.camera.fov * Math.PI) / 180;
1156
1161
  const viewHeight = 2 * Math.tan(vfov / 2) * module.camera.position.z;
@@ -1240,6 +1245,27 @@
1240
1245
  break;
1241
1246
  }
1242
1247
 
1248
+ const imageAspectRatio = corner === 'BR' && getNodeContentType(nodeEntry.model) === 'image'
1249
+ ? Number(module.resizeAspectRatio || 0)
1250
+ : 0;
1251
+ if (imageAspectRatio > 0 && window.MindMapImagePolicy?.constrainBottomRightDimensions) {
1252
+ const lockedSize = window.MindMapImagePolicy.constrainBottomRightDimensions(
1253
+ finalWidth,
1254
+ finalHeight,
1255
+ startW,
1256
+ startH,
1257
+ imageAspectRatio,
1258
+ {
1259
+ minWidth: DEFAULT_MIN_NODE_WIDTH,
1260
+ minHeight: DEFAULT_MIN_NODE_HEIGHT,
1261
+ maxWidth: MAX_NODE_WIDTH,
1262
+ maxHeight: MAX_NODE_HEIGHT
1263
+ }
1264
+ );
1265
+ finalWidth = lockedSize.width;
1266
+ finalHeight = lockedSize.height;
1267
+ }
1268
+
1243
1269
  // Clamp size
1244
1270
  const minClampedSize = clampRemoteFleetResizeDimensions(nodeEntry.model, finalWidth, finalHeight);
1245
1271
  let clampedWidth = Math.min(MAX_NODE_WIDTH, minClampedSize.width);
@@ -1844,13 +1870,34 @@
1844
1870
  const currentPosY = nodeEntry.glObject?.position?.y ?? nodeEntry.cssObject?.position?.y ?? 0;
1845
1871
  let finalPosX = currentPosX;
1846
1872
  let finalPosY = currentPosY;
1873
+ const imageAspectRatio = module.resizeCorner === 'BR'
1874
+ && getNodeContentType(nodeEntry.model) === 'image'
1875
+ ? Number(module.resizeAspectRatio || 0)
1876
+ : 0;
1847
1877
 
1848
1878
  // Respect global snap toggle. Resize itself stays free-form while dragging;
1849
1879
  // snapping is applied only at the end when enabled.
1850
1880
  if (module.gridSnapEnabled !== false) {
1851
1881
  const GRID_SIZE = module.GRID_SIZE || 10;
1852
- nodeEntry.model.width = Math.round(nodeEntry.model.width / GRID_SIZE) * GRID_SIZE;
1853
- nodeEntry.model.height = Math.round(nodeEntry.model.height / GRID_SIZE) * GRID_SIZE;
1882
+ if (imageAspectRatio > 0 && window.MindMapImagePolicy?.snapAspectLockedDimensions) {
1883
+ const snappedSize = window.MindMapImagePolicy.snapAspectLockedDimensions(
1884
+ nodeEntry.model.width,
1885
+ nodeEntry.model.height,
1886
+ imageAspectRatio,
1887
+ GRID_SIZE,
1888
+ {
1889
+ minWidth: DEFAULT_MIN_NODE_WIDTH,
1890
+ minHeight: DEFAULT_MIN_NODE_HEIGHT,
1891
+ maxWidth: MAX_NODE_WIDTH,
1892
+ maxHeight: MAX_NODE_HEIGHT
1893
+ }
1894
+ );
1895
+ nodeEntry.model.width = snappedSize.width;
1896
+ nodeEntry.model.height = snappedSize.height;
1897
+ } else {
1898
+ nodeEntry.model.width = Math.round(nodeEntry.model.width / GRID_SIZE) * GRID_SIZE;
1899
+ nodeEntry.model.height = Math.round(nodeEntry.model.height / GRID_SIZE) * GRID_SIZE;
1900
+ }
1854
1901
  finalPosX = Math.round(currentPosX / GRID_SIZE) * GRID_SIZE;
1855
1902
  finalPosY = Math.round(currentPosY / GRID_SIZE) * GRID_SIZE;
1856
1903
  }
@@ -2206,6 +2253,8 @@
2206
2253
  module.isResizing = false;
2207
2254
  module.resizeNodeObject = null;
2208
2255
  module.resizingNodeId = null; // ▼▼▼ [Changed] clear resizingNodeId ▼▼▼
2256
+ module.resizeAspectRatio = 0;
2257
+ module.resizeCorner = null;
2209
2258
  window.MindMapInteractions?.setBrowserSelectionLock?.(false, 'resize');
2210
2259
  document.body.classList.remove('is-resizing');
2211
2260
 
@@ -2239,4 +2288,3 @@
2239
2288
 
2240
2289
  console.log('? mind-map-pipeline.js loaded');
2241
2290
  })();
2242
-
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-i2ory+UREibapPv0SX0hnBPJ+UaQ5EiOGp2Pwv77bl0=",
4
+ "hash": "sha256-h7qN2ceBe++om9M7c2+vyk4SdA4734SFOq9M6dV1Fc4=",
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.yrfbp4404m.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.qpodwwdiwx.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.8uzx32oujb.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.tx05qckwdp.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.m3ew6te59x.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.9qioesdf9k.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.74t0l3lj50.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.rw3h96cxzb.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.ubxwcs5koc.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.mvn80sbzgp.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.kzbcbkmn27.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.c7qfof7tfg.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.2vmuxhdwb6.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.pkpabtra36.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.ibjgxkahfu.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.q92uq1o4e5.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.l291yoyxds.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.jazcnpkde2.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.f51tf15188.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.3crklrc2je.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.yrfbp4404m.dll": "sha256-nq3r4xX1c1c2Z7xUBMYKC9rt0nTkdm9Y+eTxfxlQaU4=",
280
- "MindExecution.Kernel.qpodwwdiwx.dll": "sha256-olF1qq4bo/XPU7Kbi5/CqHwcXYomi6OIretnVjngi8c=",
281
- "MindExecution.Plugins.Business.tx05qckwdp.dll": "sha256-/yHM2edJdWvBjl9kECWO1NRROSfAmLOMAgvw+6Q7jOI=",
282
- "MindExecution.Plugins.Concept.m3ew6te59x.dll": "sha256-nnbzQPkW3yXRr/45sCYu8VYJVVVnV+2/Wu3kfYB6Rpo=",
283
- "MindExecution.Plugins.PlanMaster.74t0l3lj50.dll": "sha256-Z8R6DLdddz11VeV7sLWnjdZxWyWNNP836HEwxm3VZ1I=",
284
- "MindExecution.Shared.ubxwcs5koc.dll": "sha256-RsMq3/t1Nd+Tdf8CXmwW4fGVHg12525aH1ngTLaAHTw=",
285
- "MindExecution.Web.mvn80sbzgp.dll": "sha256-4orMyt10vcNSu51DuaGyeZFzif8zM8OYy6soyE+7So4="
279
+ "MindExecution.Core.kzbcbkmn27.dll": "sha256-UF3Xy5R1huP/eyBha3NHL7Jw7k5K2fTtlCOoyMosom0=",
280
+ "MindExecution.Kernel.c7qfof7tfg.dll": "sha256-mGnoCyTBpcGcxALgKY0hHHTIwAe80JJCCuDdvFXpUBU=",
281
+ "MindExecution.Plugins.Business.pkpabtra36.dll": "sha256-+U5GUMMd5TUpQDbA7tPbH7Q5l5iPO6dFkUS2Wu9UYZg=",
282
+ "MindExecution.Plugins.Concept.ibjgxkahfu.dll": "sha256-MslBJ8q1DfuaYSvgjasjYvGAEE1kKG+PB/5ac5WWXTI=",
283
+ "MindExecution.Plugins.PlanMaster.l291yoyxds.dll": "sha256-LQabWXDuFB851w/1cMocqTtdjWS3nCjSd/QFzVl7FnU=",
284
+ "MindExecution.Shared.f51tf15188.dll": "sha256-E07hW4FKQ4FwCPQu8lIGSW0XSVzDtV4Xq7jrNR8OCy4=",
285
+ "MindExecution.Web.3crklrc2je.dll": "sha256-nXdLL37Wl2T7flNWmCQeBsjoNwjBiiBvNam7n5HQ37g="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.8uzx32oujb.dll": "sha256-UKGhMbjZpy62abQZQFHZlygg1WDDNZ5772yzNISn+iA=",
289
- "MindExecution.Plugins.Directory.9qioesdf9k.dll": "sha256-Lz07C5H7DBSszx9DH5LMxqX6rG2ONaJK4jGwKAy9r2g=",
290
- "MindExecution.Plugins.YouTube.rw3h96cxzb.dll": "sha256-C698Z1kqGX9giei+qoNuUC3L0sqPac0cNRVUy/Fo7uk="
288
+ "MindExecution.Plugins.Admin.2vmuxhdwb6.dll": "sha256-wrtoSN9v63OxdUy2BGXPEmdW+yUGw77FL0plxVvWiHc=",
289
+ "MindExecution.Plugins.Directory.q92uq1o4e5.dll": "sha256-/uSOM7d4uMRal/2KakaW5S5OHdOLBsCLbbb3hOGAO1g=",
290
+ "MindExecution.Plugins.YouTube.jazcnpkde2.dll": "sha256-Vceyyn7y7b++qiEvwxA9aMBcAuIHp1nb5vGpc6x0bes="
291
291
  }
292
292
  },
293
293
  "cacheBootResources": true,
@@ -614,7 +614,7 @@
614
614
  }
615
615
 
616
616
  const base = '_content/MindExecution.Shared/js/';
617
- const scriptVersion = '20260819-grid-zoom-density-v976';
617
+ const scriptVersion = '20260819-grid-single-css-representation-v978';
618
618
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
619
619
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
620
620
  const criticalScripts = [
@@ -631,6 +631,7 @@
631
631
  'mind-map-video-playback-controls.js',
632
632
  'mind-map-remote-codecs.js',
633
633
  'mind-map-css3d-hotpath.js',
634
+ 'mind-map-image-policy.js',
634
635
  'mind-map-css3d-manager.js',
635
636
  'mind-map-object-manager.js',
636
637
  'mind-map-pipeline.js',
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "JCn6P4Wg",
2
+ "version": "c/J69fru",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -86,7 +86,7 @@ self.assetsManifest = {
86
86
  "url": "_content/MindExecution.Shared/js/mind-map-board-render-ownership.js"
87
87
  },
88
88
  {
89
- "hash": "sha256-HgjmwgtzGozTVfDzhgj9Nr2sjxwY+kL6DzQjGEIOZ8k=",
89
+ "hash": "sha256-kAkXetdqRDypZg9PkOH48rgEbUZG/bkgLWhRLGrSdcc=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
91
91
  },
92
92
  {
@@ -98,7 +98,7 @@ self.assetsManifest = {
98
98
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-hotpath.js"
99
99
  },
100
100
  {
101
- "hash": "sha256-svavkeJ57veuhP04ihx6f+a7Ovek6BTVrBfud2EiCRw=",
101
+ "hash": "sha256-pnzJc5Y0FgyQ8muctsOpK3jh7jpDz/NlicK8UOTimpI=",
102
102
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
103
103
  },
104
104
  {
@@ -117,6 +117,10 @@ self.assetsManifest = {
117
117
  "hash": "sha256-7B7gdxe1oZBi+9GHUXcaf6njTH0c3tg8//wBYGfbBcg=",
118
118
  "url": "_content/MindExecution.Shared/js/mind-map-glow-shader.js"
119
119
  },
120
+ {
121
+ "hash": "sha256-C8A7FBiE5Tab+Qxg8RUiuZatttPo4xCMgRzIzbpLzak=",
122
+ "url": "_content/MindExecution.Shared/js/mind-map-image-policy.js"
123
+ },
120
124
  {
121
125
  "hash": "sha256-5sVcWSPLCHmnvAYLsqBwno201net5gfRYOqtQLUXQZE=",
122
126
  "url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
@@ -166,7 +170,7 @@ self.assetsManifest = {
166
170
  "url": "_content/MindExecution.Shared/js/mind-map-object-manager.js.backup"
167
171
  },
168
172
  {
169
- "hash": "sha256-mrmeBnooipy6W/UnhlDElDQ5snBOD6PP5SKWWcZJUUY=",
173
+ "hash": "sha256-pHqW8QvxjoBSjP4026YppVd9hs3QlUePBbb9UCjFDZs=",
170
174
  "url": "_content/MindExecution.Shared/js/mind-map-pipeline.js"
171
175
  },
172
176
  {
@@ -438,44 +442,44 @@ self.assetsManifest = {
438
442
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
439
443
  },
440
444
  {
441
- "hash": "sha256-nq3r4xX1c1c2Z7xUBMYKC9rt0nTkdm9Y+eTxfxlQaU4=",
442
- "url": "_framework/MindExecution.Core.yrfbp4404m.dll"
445
+ "hash": "sha256-UF3Xy5R1huP/eyBha3NHL7Jw7k5K2fTtlCOoyMosom0=",
446
+ "url": "_framework/MindExecution.Core.kzbcbkmn27.dll"
443
447
  },
444
448
  {
445
- "hash": "sha256-olF1qq4bo/XPU7Kbi5/CqHwcXYomi6OIretnVjngi8c=",
446
- "url": "_framework/MindExecution.Kernel.qpodwwdiwx.dll"
449
+ "hash": "sha256-mGnoCyTBpcGcxALgKY0hHHTIwAe80JJCCuDdvFXpUBU=",
450
+ "url": "_framework/MindExecution.Kernel.c7qfof7tfg.dll"
447
451
  },
448
452
  {
449
- "hash": "sha256-UKGhMbjZpy62abQZQFHZlygg1WDDNZ5772yzNISn+iA=",
450
- "url": "_framework/MindExecution.Plugins.Admin.8uzx32oujb.dll"
453
+ "hash": "sha256-wrtoSN9v63OxdUy2BGXPEmdW+yUGw77FL0plxVvWiHc=",
454
+ "url": "_framework/MindExecution.Plugins.Admin.2vmuxhdwb6.dll"
451
455
  },
452
456
  {
453
- "hash": "sha256-/yHM2edJdWvBjl9kECWO1NRROSfAmLOMAgvw+6Q7jOI=",
454
- "url": "_framework/MindExecution.Plugins.Business.tx05qckwdp.dll"
457
+ "hash": "sha256-+U5GUMMd5TUpQDbA7tPbH7Q5l5iPO6dFkUS2Wu9UYZg=",
458
+ "url": "_framework/MindExecution.Plugins.Business.pkpabtra36.dll"
455
459
  },
456
460
  {
457
- "hash": "sha256-nnbzQPkW3yXRr/45sCYu8VYJVVVnV+2/Wu3kfYB6Rpo=",
458
- "url": "_framework/MindExecution.Plugins.Concept.m3ew6te59x.dll"
461
+ "hash": "sha256-MslBJ8q1DfuaYSvgjasjYvGAEE1kKG+PB/5ac5WWXTI=",
462
+ "url": "_framework/MindExecution.Plugins.Concept.ibjgxkahfu.dll"
459
463
  },
460
464
  {
461
- "hash": "sha256-Lz07C5H7DBSszx9DH5LMxqX6rG2ONaJK4jGwKAy9r2g=",
462
- "url": "_framework/MindExecution.Plugins.Directory.9qioesdf9k.dll"
465
+ "hash": "sha256-/uSOM7d4uMRal/2KakaW5S5OHdOLBsCLbbb3hOGAO1g=",
466
+ "url": "_framework/MindExecution.Plugins.Directory.q92uq1o4e5.dll"
463
467
  },
464
468
  {
465
- "hash": "sha256-Z8R6DLdddz11VeV7sLWnjdZxWyWNNP836HEwxm3VZ1I=",
466
- "url": "_framework/MindExecution.Plugins.PlanMaster.74t0l3lj50.dll"
469
+ "hash": "sha256-LQabWXDuFB851w/1cMocqTtdjWS3nCjSd/QFzVl7FnU=",
470
+ "url": "_framework/MindExecution.Plugins.PlanMaster.l291yoyxds.dll"
467
471
  },
468
472
  {
469
- "hash": "sha256-C698Z1kqGX9giei+qoNuUC3L0sqPac0cNRVUy/Fo7uk=",
470
- "url": "_framework/MindExecution.Plugins.YouTube.rw3h96cxzb.dll"
473
+ "hash": "sha256-Vceyyn7y7b++qiEvwxA9aMBcAuIHp1nb5vGpc6x0bes=",
474
+ "url": "_framework/MindExecution.Plugins.YouTube.jazcnpkde2.dll"
471
475
  },
472
476
  {
473
- "hash": "sha256-RsMq3/t1Nd+Tdf8CXmwW4fGVHg12525aH1ngTLaAHTw=",
474
- "url": "_framework/MindExecution.Shared.ubxwcs5koc.dll"
477
+ "hash": "sha256-E07hW4FKQ4FwCPQu8lIGSW0XSVzDtV4Xq7jrNR8OCy4=",
478
+ "url": "_framework/MindExecution.Shared.f51tf15188.dll"
475
479
  },
476
480
  {
477
- "hash": "sha256-4orMyt10vcNSu51DuaGyeZFzif8zM8OYy6soyE+7So4=",
478
- "url": "_framework/MindExecution.Web.mvn80sbzgp.dll"
481
+ "hash": "sha256-nXdLL37Wl2T7flNWmCQeBsjoNwjBiiBvNam7n5HQ37g=",
482
+ "url": "_framework/MindExecution.Web.3crklrc2je.dll"
479
483
  },
480
484
  {
481
485
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -794,7 +798,7 @@ self.assetsManifest = {
794
798
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
795
799
  },
796
800
  {
797
- "hash": "sha256-Hmlq6LlQsFCZjyCJas5hdlZGxs0pLTELTn3eVSmswyE=",
801
+ "hash": "sha256-jYepqqheHzXwoncdGqH1YtPemsGl5jNJojJxsFr96us=",
798
802
  "url": "_framework/blazor.boot.json"
799
803
  },
800
804
  {
@@ -870,7 +874,7 @@ self.assetsManifest = {
870
874
  "url": "icon-512.png"
871
875
  },
872
876
  {
873
- "hash": "sha256-h74aPUpMz/6U/N5yUj8zrvt8xaw+B/L3ZvrZS7h5EzQ=",
877
+ "hash": "sha256-JD51EiDeq05HKJMT+XHwWPwrolm+b92IT8q+Da+XKMw=",
874
878
  "url": "index.html"
875
879
  },
876
880
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: JCn6P4Wg */
1
+ /* Manifest version: c/J69fru */
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