@mindexec/cli 0.2.467 → 0.2.469

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 (23) hide show
  1. package/package.json +7 -7
  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 +39 -11
  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-interactions.js +3 -3
  9. package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +55 -7
  10. package/wwwroot/_framework/{MindExecution.Core.7oa1zr128r.dll → MindExecution.Core.rmpf5us73b.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Kernel.dqr12udjsr.dll → MindExecution.Kernel.jebho1txjn.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.Admin.6bt51zpdq7.dll → MindExecution.Plugins.Admin.vb2b525l5w.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.Business.e92nh6aw24.dll → MindExecution.Plugins.Business.g9svpf2ngw.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Plugins.Concept.z5rfp7c5gn.dll → MindExecution.Plugins.Concept.3g19y748j3.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Plugins.Directory.6qmfycdkxt.dll → MindExecution.Plugins.Directory.cb2k9u5952.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.lbbov61zg3.dll → MindExecution.Plugins.PlanMaster.vsojs80h20.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.7vjisvqu3j.dll → MindExecution.Plugins.YouTube.luk1dwf932.dll} +0 -0
  18. package/wwwroot/_framework/{MindExecution.Shared.ydgyfah35e.dll → MindExecution.Shared.cjavadsxis.dll} +0 -0
  19. package/wwwroot/_framework/{MindExecution.Web.b68gpm21e3.dll → MindExecution.Web.ratalb86xy.dll} +0 -0
  20. package/wwwroot/_framework/blazor.boot.json +21 -21
  21. package/wwwroot/index.html +2 -1
  22. package/wwwroot/service-worker-assets.js +31 -27
  23. 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.467",
3
+ "version": "0.2.469",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -36,12 +36,12 @@
36
36
  "test:desktop:update": "node --test electron/update-manager-smoke.mjs electron/recurring-update-owner-smoke.mjs scripts/desktop-update-worker-smoke.mjs scripts/desktop-update-publisher-smoke.mjs",
37
37
  "test:desktop": "node electron/source-smoke.mjs && node scripts/desktop-workspace-state-smoke.mjs && npm run test:desktop:update",
38
38
  "test:desktop:win": "node electron/windows-package-smoke.mjs",
39
- "test:syntax": "node --check server.js && node --check remote-hub.js && node --check lzo1x.js && node --check mode4-atlas.js && node --check mode4-atlas-worker.js && node --check codex-runtime.js && node --check codex-model-catalog.js && node --check launch-bridge.cjs && node --check port-guard.cjs && node --check desktop-workspace-state.cjs && node --check electron/main.cjs && node --check electron/preload.cjs && node --check electron/update-manager.cjs && node --check electron/update-feed-resolver.cjs && node --check electron/recurring-update-owner.cjs && node --check electron/source-smoke.mjs && node --check electron/windows-package-smoke.mjs && node --check electron/update-manager-smoke.mjs && node --check electron/recurring-update-owner-smoke.mjs && node --check scripts/desktop-workspace-state-smoke.mjs && node --check scripts/desktop-update-worker-smoke.mjs && node --check scripts/desktop-update-publisher-smoke.mjs && node --check scripts/board-render-ownership-smoke.mjs && node --check ../workers/mindexec-desktop-updates/src/index.mjs && node --check scripts/setup-tree-sitter-grammars.mjs && node --check scripts/npm-fresh-install-smoke.mjs && node --check scripts/auth-session-smoke.mjs && node --check scripts/codex-model-catalog-smoke.mjs && node --check scripts/codex-sdk-runtime-smoke.mjs && node --check scripts/codex-sdk-image-runtime-smoke.mjs && node --check scripts/codex-sdk-image-live-smoke.mjs && node --check scripts/codex-runtime-home-smoke.mjs && node --check scripts/remote-hub-smoke.mjs && node --check scripts/remote-hub-scale-smoke.mjs && node --check scripts/remote-fleet-render-smoke.mjs && node --check scripts/remote-http-smoke.mjs && node --check scripts/remote-frame-ws-smoke.mjs && node --check scripts/remote-input-ws-smoke.mjs && node --check scripts/remote-agent-ws-smoke.mjs && node --check scripts/remote-agent-managed-smoke.mjs && node --check scripts/remote-registry-follower-smoke.mjs && node --check scripts/remote-agent-package-smoke.mjs && node --check scripts/remote-fast-live-rate-smoke.mjs && node --check scripts/remote-fast-mdm-browser-smoke.mjs",
40
- "test:canvas:board-owner": "node scripts/board-render-ownership-smoke.mjs",
41
- "test:codex-sdk": "node scripts/codex-sdk-runtime-smoke.mjs",
42
- "test:codex-sdk:image": "node scripts/codex-sdk-image-runtime-smoke.mjs",
43
- "test:codex-sdk:image:live": "node scripts/codex-sdk-image-live-smoke.mjs --live",
44
- "test:codex-sdk:home": "node scripts/codex-runtime-home-smoke.mjs",
39
+ "test:syntax": "node --check server.js && node --check remote-hub.js && node --check lzo1x.js && node --check mode4-atlas.js && node --check mode4-atlas-worker.js && node --check codex-runtime.js && node --check codex-model-catalog.js && node --check launch-bridge.cjs && node --check port-guard.cjs && node --check desktop-workspace-state.cjs && node --check electron/main.cjs && node --check electron/preload.cjs && node --check electron/update-manager.cjs && node --check electron/update-feed-resolver.cjs && node --check electron/recurring-update-owner.cjs && node --check electron/source-smoke.mjs && node --check electron/windows-package-smoke.mjs && node --check electron/update-manager-smoke.mjs && node --check electron/recurring-update-owner-smoke.mjs && node --check scripts/desktop-workspace-state-smoke.mjs && node --check scripts/desktop-update-worker-smoke.mjs && node --check scripts/desktop-update-publisher-smoke.mjs && node --check scripts/board-render-ownership-smoke.mjs && node --check ../workers/mindexec-desktop-updates/src/index.mjs && node --check scripts/setup-tree-sitter-grammars.mjs && node --check scripts/npm-fresh-install-smoke.mjs && node --check scripts/auth-session-smoke.mjs && node --check scripts/codex-model-catalog-smoke.mjs && node --check scripts/codex-sdk-runtime-smoke.mjs && node --check scripts/codex-sdk-image-runtime-smoke.mjs && node --check scripts/codex-sdk-image-live-smoke.mjs && node --check scripts/codex-runtime-home-smoke.mjs && node --check scripts/remote-hub-smoke.mjs && node --check scripts/remote-hub-scale-smoke.mjs && node --check scripts/remote-fleet-render-smoke.mjs && node --check scripts/remote-http-smoke.mjs && node --check scripts/remote-frame-ws-smoke.mjs && node --check scripts/remote-input-ws-smoke.mjs && node --check scripts/remote-agent-ws-smoke.mjs && node --check scripts/remote-agent-managed-smoke.mjs && node --check scripts/remote-registry-follower-smoke.mjs && node --check scripts/remote-agent-package-smoke.mjs && node --check scripts/remote-fast-live-rate-smoke.mjs && node --check scripts/remote-fast-mdm-browser-smoke.mjs",
40
+ "test:canvas:board-owner": "node scripts/board-render-ownership-smoke.mjs",
41
+ "test:codex-sdk": "node scripts/codex-sdk-runtime-smoke.mjs",
42
+ "test:codex-sdk:image": "node scripts/codex-sdk-image-runtime-smoke.mjs",
43
+ "test:codex-sdk:image:live": "node scripts/codex-sdk-image-live-smoke.mjs --live",
44
+ "test:codex-sdk:home": "node scripts/codex-runtime-home-smoke.mjs",
45
45
  "test:codex-sdk:live": "node scripts/codex-sdk-runtime-smoke.mjs --live",
46
46
  "test:codex-sdk:live-tools": "node scripts/codex-sdk-runtime-smoke.mjs --live-tools",
47
47
  "test:codex-model-catalog": "node scripts/codex-model-catalog-smoke.mjs",
@@ -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 = '20260817-grid-distance-fade-v867';
8
+ const MINDMAP_CORE_BUILD_ID = '20260819-grid-zoom-density-sync-v868';
9
9
  const CanvasPhase = Object.freeze({
10
10
  Booting: 'booting',
11
11
  BoardFileLoading: 'board-file-loading',
@@ -112,6 +112,8 @@
112
112
  const LOCAL_SNAP_GRID_SOLID_RADIUS_PX = LOCAL_SNAP_GRID_RADIUS_PX - LOCAL_SNAP_GRID_FADE_PX;
113
113
  const LOCAL_SNAP_GRID_RASTER_MIN_STEP_PX = 0.5;
114
114
  const LOCAL_SNAP_GRID_RASTER_MAX_PERIOD_PX = 2048;
115
+ const LOCAL_SNAP_GRID_MINOR_DETAIL_FADE_START_PX = 1.25;
116
+ const LOCAL_SNAP_GRID_MINOR_DETAIL_FADE_END_PX = 2.25;
115
117
  const LOCAL_SNAP_GRID_DEFAULT_STEP_PX = 10;
116
118
  const LOCAL_SNAP_GRID_DEFAULT_MAJOR_STEP_PX = 100;
117
119
  const LOCAL_SNAP_GRID_DEFAULT_OPACITY = 0.58;
@@ -3693,6 +3695,18 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3693
3695
  };
3694
3696
  }
3695
3697
 
3698
+ _resolveLocalSnapGridMinorDetailAlpha(smallStepPx) {
3699
+ const projectedStep = Math.max(0, Number(smallStepPx) || 0);
3700
+ const fadeRange = Math.max(
3701
+ Number.EPSILON,
3702
+ LOCAL_SNAP_GRID_MINOR_DETAIL_FADE_END_PX - LOCAL_SNAP_GRID_MINOR_DETAIL_FADE_START_PX
3703
+ );
3704
+ return Math.max(0, Math.min(
3705
+ 1,
3706
+ (projectedStep - LOCAL_SNAP_GRID_MINOR_DETAIL_FADE_START_PX) / fadeRange
3707
+ ));
3708
+ }
3709
+
3696
3710
  _getLocalSnapGridStyleKind() {
3697
3711
  const themeName = String(this.currentThemeName || '').trim();
3698
3712
  return themeName === 'SpatialGrid2D' ? 'dot' : 'line';
@@ -3717,6 +3731,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3717
3731
  )
3718
3732
  );
3719
3733
  const tileSize = Math.max(1, majorStep);
3734
+ const minorDetailAlpha = this._resolveLocalSnapGridMinorDetailAlpha(smallStep);
3720
3735
  const viewportDpr = Math.max(1, Math.min(3, Number(this._lastViewportDpr || window.devicePixelRatio || 1)));
3721
3736
  const bitmapSize = Math.max(1, Math.ceil(tileSize * viewportDpr));
3722
3737
  if (canvas.width !== bitmapSize) {
@@ -3730,8 +3745,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3730
3745
  ctx.clearRect(0, 0, tileSize, tileSize);
3731
3746
 
3732
3747
  if (styleKind === 'dot') {
3733
- if (smallStep >= 2.25) {
3734
- ctx.fillStyle = 'rgba(58, 69, 88, 0.68)';
3748
+ if (minorDetailAlpha > 0.001) {
3749
+ ctx.fillStyle = `rgba(58, 69, 88, ${(0.68 * minorDetailAlpha).toFixed(3)})`;
3735
3750
  const dotRadius = 1.2;
3736
3751
  for (let y = 0; y < tileSize; y += smallStep) {
3737
3752
  for (let x = 0; x < tileSize; x += smallStep) {
@@ -3764,7 +3779,13 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3764
3779
  ctx.stroke();
3765
3780
  };
3766
3781
 
3767
- drawLines(smallStep, 'rgba(51, 65, 85, 0.24)', 1);
3782
+ if (minorDetailAlpha > 0.001) {
3783
+ drawLines(
3784
+ smallStep,
3785
+ `rgba(51, 65, 85, ${(0.24 * minorDetailAlpha).toFixed(3)})`,
3786
+ 1
3787
+ );
3788
+ }
3768
3789
  drawLines(majorStep, 'rgba(15, 23, 42, 0.42)', 1);
3769
3790
  }
3770
3791
  return tileSize;
@@ -3807,7 +3828,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3807
3828
  ].join('|');
3808
3829
  const smallStepValue = safeSmallStep.toFixed(3);
3809
3830
  const majorStepValue = safeMajorStep.toFixed(3);
3810
- const showMinorDots = safeSmallStep >= 2.25;
3831
+ const minorDetailAlpha = this._resolveLocalSnapGridMinorDetailAlpha(safeSmallStep);
3832
+ const showMinorDots = minorDetailAlpha > 0.001;
3811
3833
  const backgroundSizeValue = safeStyleKind === 'dot'
3812
3834
  ? (showMinorDots
3813
3835
  ? `${majorStepValue}px ${majorStepValue}px, ${smallStepValue}px ${smallStepValue}px`
@@ -3829,7 +3851,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3829
3851
  this._lastLocalSnapGridOpacity = opacityValue;
3830
3852
  if (safeStyleKind === 'dot') {
3831
3853
  const majorDot = 'radial-gradient(circle at 0 0, rgba(15, 23, 42, 0.82) 0 1.9px, transparent 2px)';
3832
- const minorDot = 'radial-gradient(circle at 0 0, rgba(58, 69, 88, 0.68) 0 1.2px, transparent 1.3px)';
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)`;
3833
3856
  const backgroundImage = showMinorDots ? `${majorDot}, ${minorDot}` : majorDot;
3834
3857
  this._lastLocalSnapGridKey = localGridKey;
3835
3858
  this._lastLocalSnapGridPatternPeriodPx = safeMajorStep;
@@ -3882,6 +3905,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3882
3905
  const safeOpacity = Math.max(0, Math.min(0.68, Number(opacity) || 0));
3883
3906
  const smallStepValue = safeSmallStep.toFixed(3);
3884
3907
  const majorStepValue = safeMajorStep.toFixed(3);
3908
+ const minorDetailAlpha = this._resolveLocalSnapGridMinorDetailAlpha(safeSmallStep);
3909
+ const minorLineAlphaValue = (0.24 * minorDetailAlpha).toFixed(3);
3885
3910
  const backgroundSizeValue = [
3886
3911
  `${smallStepValue}px ${smallStepValue}px`,
3887
3912
  `${smallStepValue}px ${smallStepValue}px`,
@@ -3889,8 +3914,8 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3889
3914
  `${majorStepValue}px ${majorStepValue}px`
3890
3915
  ].join(', ');
3891
3916
  const backgroundImage = [
3892
- 'linear-gradient(to right, rgba(51, 65, 85, 0.24) 0 1px, transparent 1px)',
3893
- 'linear-gradient(to bottom, rgba(51, 65, 85, 0.24) 0 1px, transparent 1px)',
3917
+ `linear-gradient(to right, rgba(51, 65, 85, ${minorLineAlphaValue}) 0 1px, transparent 1px)`,
3918
+ `linear-gradient(to bottom, rgba(51, 65, 85, ${minorLineAlphaValue}) 0 1px, transparent 1px)`,
3894
3919
  'linear-gradient(to right, rgba(15, 23, 42, 0.42) 0 1px, transparent 1px)',
3895
3920
  'linear-gradient(to bottom, rgba(15, 23, 42, 0.42) 0 1px, transparent 1px)'
3896
3921
  ].join(', ');
@@ -4076,12 +4101,15 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4076
4101
  return false;
4077
4102
  }
4078
4103
 
4104
+ const shouldRefreshDeferredZoomProjection =
4105
+ this.isZooming === true ||
4106
+ this._localSnapGridStyleDeferredForZoom === true;
4079
4107
  if (!this._localSnapGridLayer?.isConnected || !this._lastLocalSnapGridKey) {
4080
4108
  const layer = this._ensureLocalSnapGridLayer();
4081
4109
  if (!layer) {
4082
4110
  return false;
4083
4111
  }
4084
- if (this.isZooming === true) {
4112
+ if (shouldRefreshDeferredZoomProjection === true) {
4085
4113
  this._ensureLocalSnapGridBaseStyle(layer);
4086
4114
  } else {
4087
4115
  return this._syncLocalSnapGridLayer(visible);
@@ -4104,14 +4132,14 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4104
4132
  return false;
4105
4133
  }
4106
4134
  const styleKind = this._getLocalSnapGridStyleKind();
4107
- if (this.isZooming === true && styleKind === 'dot') {
4135
+ if (shouldRefreshDeferredZoomProjection === true && styleKind === 'dot') {
4108
4136
  const vfov = (Number(this.camera?.fov || 45) * Math.PI) / 180;
4109
4137
  const pxPerWorld = height / Math.max(1, 2 * Math.tan(vfov / 2) * cameraZ);
4110
4138
  const projection = this._resolveLocalSnapGridWorldStep(pxPerWorld);
4111
4139
  this._applyLocalSnapGridStyle(
4112
4140
  layer, styleKind, projection.smallStepPx, projection.majorStepPx, opacity);
4113
4141
  this._localSnapGridStyleDeferredForZoom = false;
4114
- } else if (this.isZooming === true) {
4142
+ } else if (shouldRefreshDeferredZoomProjection === true) {
4115
4143
  const vfov = (Number(this.camera?.fov || 45) * Math.PI) / 180;
4116
4144
  const pxPerWorld = height / Math.max(1, 2 * Math.tan(vfov / 2) * cameraZ);
4117
4145
  const projection = this._resolveLocalSnapGridWorldStep(pxPerWorld);
@@ -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
+ })();
@@ -6477,9 +6477,9 @@ window.MindMapInteractions = (function () {
6477
6477
  scheduleMotionWillChangeEnable(module);
6478
6478
  }
6479
6479
  }
6480
- // Keep wheel zoom in the cheap active-zoom local grid branch when the
6481
- // pointer has not moved. Exact grid style is reconciled on the first
6482
- // following canonical frame that has no wheel input.
6480
+ // Keep wheel zoom in the cheap projection-only local grid branch when
6481
+ // the pointer has not moved. Exact CSS periods remain current through
6482
+ // the no-input gap; only the crisp line raster waits for idle settle.
6483
6483
  if (module._isLocalSnapGridThemeEnabled?.() === true ||
6484
6484
  module._localSnapGridVisible === true ||
6485
6485
  module._localSnapGridLayer?.isConnected === true) {
@@ -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-pm9gUyCN7xLw9EaSc1lL5kN8jJ23nv5LAeniQeW0HHY=",
4
+ "hash": "sha256-fgUfmB92eXnfCyKAVfkOCtGsUJUH3nDK+lE9oPLU4Wc=",
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.7oa1zr128r.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.dqr12udjsr.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.6bt51zpdq7.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.e92nh6aw24.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.z5rfp7c5gn.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.6qmfycdkxt.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.lbbov61zg3.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.7vjisvqu3j.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.ydgyfah35e.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.b68gpm21e3.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.rmpf5us73b.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.jebho1txjn.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.vb2b525l5w.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.g9svpf2ngw.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.3g19y748j3.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.cb2k9u5952.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.vsojs80h20.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.luk1dwf932.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.cjavadsxis.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.ratalb86xy.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.7oa1zr128r.dll": "sha256-uTTfp+Iu3C7jgsyLauWGcGYcFQsEcPHA1FGCKQXrTGk=",
280
- "MindExecution.Kernel.dqr12udjsr.dll": "sha256-pUxuISA8V4Ro0H+636QoXiU5+VF3BW7L27zas6ovW0U=",
281
- "MindExecution.Plugins.Business.e92nh6aw24.dll": "sha256-MpREZ+eukJRDg6mQ7ZOEAe6yHl9UtocC07LTTmFxI5E=",
282
- "MindExecution.Plugins.Concept.z5rfp7c5gn.dll": "sha256-R2ye/oFIO0haYP3I01gV/4gpQBd1scfEusjPznFWbvg=",
283
- "MindExecution.Plugins.PlanMaster.lbbov61zg3.dll": "sha256-UXaJeM7BqhQCv3DY1zkiXGJRNxquudkBYgmchgxnx00=",
284
- "MindExecution.Shared.ydgyfah35e.dll": "sha256-di5LlqqDZKM+3+CBUxQUQ/rFwOF5laSkr1PCjz2pgdk=",
285
- "MindExecution.Web.b68gpm21e3.dll": "sha256-nUEDIUiOGqD37D3xgqqysvvUQneVI5rxGZ6aBRZUI8U="
279
+ "MindExecution.Core.rmpf5us73b.dll": "sha256-gwxzUOyvnr1Q2UXzdu1H4SUeq3bbm3lXYe7/bd9860Y=",
280
+ "MindExecution.Kernel.jebho1txjn.dll": "sha256-+x+obc3kMnclHhP6m/z4jzqd+zXDZ+jhgLEVKKDs67Q=",
281
+ "MindExecution.Plugins.Business.g9svpf2ngw.dll": "sha256-1NUsUHFCUNBTMBFXIMbt6MAMqxzkl0AqrI4GPfqeer0=",
282
+ "MindExecution.Plugins.Concept.3g19y748j3.dll": "sha256-k42ltXSBo5RwkBrzyOgAHPemVl8Xw91c+gYrBRPrJyc=",
283
+ "MindExecution.Plugins.PlanMaster.vsojs80h20.dll": "sha256-TwC1ItzVv+J+5C905NOpLwCpJWohnmSIDhjbolLlHZc=",
284
+ "MindExecution.Shared.cjavadsxis.dll": "sha256-6BpxPPUmZVP/7Z2pCoBmAWA4azB1q6IXSnLs8X5+gsQ=",
285
+ "MindExecution.Web.ratalb86xy.dll": "sha256-0/ONjTN+Xx81nLs1yo2GRhtcTFFY1Ulm/keJQNfdDVU="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.6bt51zpdq7.dll": "sha256-ogBaZoZztkITRjNx0LAIr0vZH2phNsJlQE5iRw6Ws+c=",
289
- "MindExecution.Plugins.Directory.6qmfycdkxt.dll": "sha256-Mv2nGkAFk5n8CH/OVWfSL4vrEwNXBmZ8ULHFjeluERs=",
290
- "MindExecution.Plugins.YouTube.7vjisvqu3j.dll": "sha256-7TKJ3SFwKH+iO+CRm3QxBuRIyNZGOcBp822L3KrEE1k="
288
+ "MindExecution.Plugins.Admin.vb2b525l5w.dll": "sha256-dSJHWimUTP/gn9qMwXWaZ7XXAkZFhezPGKIr7lags0o=",
289
+ "MindExecution.Plugins.Directory.cb2k9u5952.dll": "sha256-uLmsvR6Sg/EDXME2PWFTWw9l0b427MyIK0YydWybGDc=",
290
+ "MindExecution.Plugins.YouTube.luk1dwf932.dll": "sha256-zfyvtryHEQ8fLlaRPto9s9Y2vozH1qjOXhFy4CqFOx4="
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-board-owner-grid-v975';
617
+ const scriptVersion = '20260819-image-original-resize-v977';
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": "c6MTEECG",
2
+ "version": "/TO/XqZ0",
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-+YNEfvac1szWmQjPUmzKmTUVCS5qHcXNn6k2W2mlFQ8=",
89
+ "hash": "sha256-HgjmwgtzGozTVfDzhgj9Nr2sjxwY+kL6DzQjGEIOZ8k=",
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
  {
@@ -118,7 +118,11 @@ self.assetsManifest = {
118
118
  "url": "_content/MindExecution.Shared/js/mind-map-glow-shader.js"
119
119
  },
120
120
  {
121
- "hash": "sha256-pYVpVRydZqCz9WaH9q93+QGYwKs17nSB2s0RvWy0ABQ=",
121
+ "hash": "sha256-C8A7FBiE5Tab+Qxg8RUiuZatttPo4xCMgRzIzbpLzak=",
122
+ "url": "_content/MindExecution.Shared/js/mind-map-image-policy.js"
123
+ },
124
+ {
125
+ "hash": "sha256-5sVcWSPLCHmnvAYLsqBwno201net5gfRYOqtQLUXQZE=",
122
126
  "url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
123
127
  },
124
128
  {
@@ -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-uTTfp+Iu3C7jgsyLauWGcGYcFQsEcPHA1FGCKQXrTGk=",
442
- "url": "_framework/MindExecution.Core.7oa1zr128r.dll"
445
+ "hash": "sha256-gwxzUOyvnr1Q2UXzdu1H4SUeq3bbm3lXYe7/bd9860Y=",
446
+ "url": "_framework/MindExecution.Core.rmpf5us73b.dll"
443
447
  },
444
448
  {
445
- "hash": "sha256-pUxuISA8V4Ro0H+636QoXiU5+VF3BW7L27zas6ovW0U=",
446
- "url": "_framework/MindExecution.Kernel.dqr12udjsr.dll"
449
+ "hash": "sha256-+x+obc3kMnclHhP6m/z4jzqd+zXDZ+jhgLEVKKDs67Q=",
450
+ "url": "_framework/MindExecution.Kernel.jebho1txjn.dll"
447
451
  },
448
452
  {
449
- "hash": "sha256-ogBaZoZztkITRjNx0LAIr0vZH2phNsJlQE5iRw6Ws+c=",
450
- "url": "_framework/MindExecution.Plugins.Admin.6bt51zpdq7.dll"
453
+ "hash": "sha256-dSJHWimUTP/gn9qMwXWaZ7XXAkZFhezPGKIr7lags0o=",
454
+ "url": "_framework/MindExecution.Plugins.Admin.vb2b525l5w.dll"
451
455
  },
452
456
  {
453
- "hash": "sha256-MpREZ+eukJRDg6mQ7ZOEAe6yHl9UtocC07LTTmFxI5E=",
454
- "url": "_framework/MindExecution.Plugins.Business.e92nh6aw24.dll"
457
+ "hash": "sha256-1NUsUHFCUNBTMBFXIMbt6MAMqxzkl0AqrI4GPfqeer0=",
458
+ "url": "_framework/MindExecution.Plugins.Business.g9svpf2ngw.dll"
455
459
  },
456
460
  {
457
- "hash": "sha256-R2ye/oFIO0haYP3I01gV/4gpQBd1scfEusjPznFWbvg=",
458
- "url": "_framework/MindExecution.Plugins.Concept.z5rfp7c5gn.dll"
461
+ "hash": "sha256-k42ltXSBo5RwkBrzyOgAHPemVl8Xw91c+gYrBRPrJyc=",
462
+ "url": "_framework/MindExecution.Plugins.Concept.3g19y748j3.dll"
459
463
  },
460
464
  {
461
- "hash": "sha256-Mv2nGkAFk5n8CH/OVWfSL4vrEwNXBmZ8ULHFjeluERs=",
462
- "url": "_framework/MindExecution.Plugins.Directory.6qmfycdkxt.dll"
465
+ "hash": "sha256-uLmsvR6Sg/EDXME2PWFTWw9l0b427MyIK0YydWybGDc=",
466
+ "url": "_framework/MindExecution.Plugins.Directory.cb2k9u5952.dll"
463
467
  },
464
468
  {
465
- "hash": "sha256-UXaJeM7BqhQCv3DY1zkiXGJRNxquudkBYgmchgxnx00=",
466
- "url": "_framework/MindExecution.Plugins.PlanMaster.lbbov61zg3.dll"
469
+ "hash": "sha256-TwC1ItzVv+J+5C905NOpLwCpJWohnmSIDhjbolLlHZc=",
470
+ "url": "_framework/MindExecution.Plugins.PlanMaster.vsojs80h20.dll"
467
471
  },
468
472
  {
469
- "hash": "sha256-7TKJ3SFwKH+iO+CRm3QxBuRIyNZGOcBp822L3KrEE1k=",
470
- "url": "_framework/MindExecution.Plugins.YouTube.7vjisvqu3j.dll"
473
+ "hash": "sha256-zfyvtryHEQ8fLlaRPto9s9Y2vozH1qjOXhFy4CqFOx4=",
474
+ "url": "_framework/MindExecution.Plugins.YouTube.luk1dwf932.dll"
471
475
  },
472
476
  {
473
- "hash": "sha256-di5LlqqDZKM+3+CBUxQUQ/rFwOF5laSkr1PCjz2pgdk=",
474
- "url": "_framework/MindExecution.Shared.ydgyfah35e.dll"
477
+ "hash": "sha256-6BpxPPUmZVP/7Z2pCoBmAWA4azB1q6IXSnLs8X5+gsQ=",
478
+ "url": "_framework/MindExecution.Shared.cjavadsxis.dll"
475
479
  },
476
480
  {
477
- "hash": "sha256-nUEDIUiOGqD37D3xgqqysvvUQneVI5rxGZ6aBRZUI8U=",
478
- "url": "_framework/MindExecution.Web.b68gpm21e3.dll"
481
+ "hash": "sha256-0/ONjTN+Xx81nLs1yo2GRhtcTFFY1Ulm/keJQNfdDVU=",
482
+ "url": "_framework/MindExecution.Web.ratalb86xy.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-8w2+rpH82kqP3ROeFCRsVPI79rYq7JtRXjv5ZoRYfjk=",
801
+ "hash": "sha256-OEzJUvajm6kUJUiSCb/eJl8DxcM5DS8gddgkufF6Y8A=",
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-9dWOZC5NL0BDx5c/eCMKiBn/zJYlPtkAemjcgPyZeK8=",
877
+ "hash": "sha256-42TjUxNh5O46JfoJIZXaZGb6w4b1+sYj0i+HCK5v3Zc=",
874
878
  "url": "index.html"
875
879
  },
876
880
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: c6MTEECG */
1
+ /* Manifest version: /TO/XqZ0 */
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