@mindexec/cli 0.2.468 → 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 (21) 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-css3d-manager.js +40 -2
  6. package/wwwroot/_content/MindExecution.Shared/js/mind-map-image-policy.js +207 -0
  7. package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +55 -7
  8. package/wwwroot/_framework/{MindExecution.Core.yrfbp4404m.dll → MindExecution.Core.rmpf5us73b.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Kernel.qpodwwdiwx.dll → MindExecution.Kernel.jebho1txjn.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Admin.8uzx32oujb.dll → MindExecution.Plugins.Admin.vb2b525l5w.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.Business.tx05qckwdp.dll → MindExecution.Plugins.Business.g9svpf2ngw.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.Concept.m3ew6te59x.dll → MindExecution.Plugins.Concept.3g19y748j3.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.Directory.9qioesdf9k.dll → MindExecution.Plugins.Directory.cb2k9u5952.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.74t0l3lj50.dll → MindExecution.Plugins.PlanMaster.vsojs80h20.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.rw3h96cxzb.dll → MindExecution.Plugins.YouTube.luk1dwf932.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Shared.ubxwcs5koc.dll → MindExecution.Shared.cjavadsxis.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Web.mvn80sbzgp.dll → MindExecution.Web.ratalb86xy.dll} +0 -0
  18. package/wwwroot/_framework/blazor.boot.json +21 -21
  19. package/wwwroot/index.html +2 -1
  20. package/wwwroot/service-worker-assets.js +29 -25
  21. 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.469",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -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-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.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.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.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.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.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.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-grid-zoom-density-v976';
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": "JCn6P4Wg",
2
+ "version": "/TO/XqZ0",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -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-gwxzUOyvnr1Q2UXzdu1H4SUeq3bbm3lXYe7/bd9860Y=",
446
+ "url": "_framework/MindExecution.Core.rmpf5us73b.dll"
443
447
  },
444
448
  {
445
- "hash": "sha256-olF1qq4bo/XPU7Kbi5/CqHwcXYomi6OIretnVjngi8c=",
446
- "url": "_framework/MindExecution.Kernel.qpodwwdiwx.dll"
449
+ "hash": "sha256-+x+obc3kMnclHhP6m/z4jzqd+zXDZ+jhgLEVKKDs67Q=",
450
+ "url": "_framework/MindExecution.Kernel.jebho1txjn.dll"
447
451
  },
448
452
  {
449
- "hash": "sha256-UKGhMbjZpy62abQZQFHZlygg1WDDNZ5772yzNISn+iA=",
450
- "url": "_framework/MindExecution.Plugins.Admin.8uzx32oujb.dll"
453
+ "hash": "sha256-dSJHWimUTP/gn9qMwXWaZ7XXAkZFhezPGKIr7lags0o=",
454
+ "url": "_framework/MindExecution.Plugins.Admin.vb2b525l5w.dll"
451
455
  },
452
456
  {
453
- "hash": "sha256-/yHM2edJdWvBjl9kECWO1NRROSfAmLOMAgvw+6Q7jOI=",
454
- "url": "_framework/MindExecution.Plugins.Business.tx05qckwdp.dll"
457
+ "hash": "sha256-1NUsUHFCUNBTMBFXIMbt6MAMqxzkl0AqrI4GPfqeer0=",
458
+ "url": "_framework/MindExecution.Plugins.Business.g9svpf2ngw.dll"
455
459
  },
456
460
  {
457
- "hash": "sha256-nnbzQPkW3yXRr/45sCYu8VYJVVVnV+2/Wu3kfYB6Rpo=",
458
- "url": "_framework/MindExecution.Plugins.Concept.m3ew6te59x.dll"
461
+ "hash": "sha256-k42ltXSBo5RwkBrzyOgAHPemVl8Xw91c+gYrBRPrJyc=",
462
+ "url": "_framework/MindExecution.Plugins.Concept.3g19y748j3.dll"
459
463
  },
460
464
  {
461
- "hash": "sha256-Lz07C5H7DBSszx9DH5LMxqX6rG2ONaJK4jGwKAy9r2g=",
462
- "url": "_framework/MindExecution.Plugins.Directory.9qioesdf9k.dll"
465
+ "hash": "sha256-uLmsvR6Sg/EDXME2PWFTWw9l0b427MyIK0YydWybGDc=",
466
+ "url": "_framework/MindExecution.Plugins.Directory.cb2k9u5952.dll"
463
467
  },
464
468
  {
465
- "hash": "sha256-Z8R6DLdddz11VeV7sLWnjdZxWyWNNP836HEwxm3VZ1I=",
466
- "url": "_framework/MindExecution.Plugins.PlanMaster.74t0l3lj50.dll"
469
+ "hash": "sha256-TwC1ItzVv+J+5C905NOpLwCpJWohnmSIDhjbolLlHZc=",
470
+ "url": "_framework/MindExecution.Plugins.PlanMaster.vsojs80h20.dll"
467
471
  },
468
472
  {
469
- "hash": "sha256-C698Z1kqGX9giei+qoNuUC3L0sqPac0cNRVUy/Fo7uk=",
470
- "url": "_framework/MindExecution.Plugins.YouTube.rw3h96cxzb.dll"
473
+ "hash": "sha256-zfyvtryHEQ8fLlaRPto9s9Y2vozH1qjOXhFy4CqFOx4=",
474
+ "url": "_framework/MindExecution.Plugins.YouTube.luk1dwf932.dll"
471
475
  },
472
476
  {
473
- "hash": "sha256-RsMq3/t1Nd+Tdf8CXmwW4fGVHg12525aH1ngTLaAHTw=",
474
- "url": "_framework/MindExecution.Shared.ubxwcs5koc.dll"
477
+ "hash": "sha256-6BpxPPUmZVP/7Z2pCoBmAWA4azB1q6IXSnLs8X5+gsQ=",
478
+ "url": "_framework/MindExecution.Shared.cjavadsxis.dll"
475
479
  },
476
480
  {
477
- "hash": "sha256-4orMyt10vcNSu51DuaGyeZFzif8zM8OYy6soyE+7So4=",
478
- "url": "_framework/MindExecution.Web.mvn80sbzgp.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-Hmlq6LlQsFCZjyCJas5hdlZGxs0pLTELTn3eVSmswyE=",
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-h74aPUpMz/6U/N5yUj8zrvt8xaw+B/L3ZvrZS7h5EzQ=",
877
+ "hash": "sha256-42TjUxNh5O46JfoJIZXaZGb6w4b1+sYj0i+HCK5v3Zc=",
874
878
  "url": "index.html"
875
879
  },
876
880
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: JCn6P4Wg */
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