@mindexec/cli 0.2.459 → 0.2.461

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 (32) hide show
  1. package/electron/main.cjs +147 -3
  2. package/electron/preload.cjs +17 -0
  3. package/electron/recurring-update-owner-smoke.mjs +38 -0
  4. package/electron/recurring-update-owner.cjs +93 -0
  5. package/electron/source-smoke.mjs +32 -0
  6. package/electron/update-feed-resolver.cjs +79 -0
  7. package/electron/update-feed.json +10 -0
  8. package/electron/update-manager-smoke.mjs +146 -0
  9. package/electron/update-manager.cjs +297 -0
  10. package/electron/windows-package-smoke.mjs +3 -0
  11. package/package.json +26 -15
  12. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  13. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  14. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  15. package/scripts/desktop-update-publisher-smoke.mjs +89 -0
  16. package/scripts/desktop-update-worker-smoke.mjs +72 -0
  17. package/scripts/publish-mindexec-desktop-updates.mjs +224 -0
  18. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +49 -7
  19. package/wwwroot/_framework/{MindExecution.Core.b973f5f64y.dll → MindExecution.Core.0b8jdcyhj8.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Kernel.k4h9fvi9wb.dll → MindExecution.Kernel.hm6hmoblm6.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Plugins.Admin.u2emae8cb5.dll → MindExecution.Plugins.Admin.oztzw186ns.dll} +0 -0
  22. package/wwwroot/_framework/{MindExecution.Plugins.Business.cysw4qtyke.dll → MindExecution.Plugins.Business.a1e73rkgjv.dll} +0 -0
  23. package/wwwroot/_framework/{MindExecution.Plugins.Concept.8iehgvzjio.dll → MindExecution.Plugins.Concept.rgwn0b8m2o.dll} +0 -0
  24. package/wwwroot/_framework/{MindExecution.Plugins.Directory.t621fsxq2i.dll → MindExecution.Plugins.Directory.2qeqqundtn.dll} +0 -0
  25. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.ft631uc7ki.dll → MindExecution.Plugins.PlanMaster.mlf2c4st5u.dll} +0 -0
  26. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.arivgu92h1.dll → MindExecution.Plugins.YouTube.acobc6tmxc.dll} +0 -0
  27. package/wwwroot/_framework/{MindExecution.Shared.wm997st9eb.dll → MindExecution.Shared.6lbogo6eek.dll} +0 -0
  28. package/wwwroot/_framework/{MindExecution.Web.osdbdrue4h.dll → MindExecution.Web.y97l6vu05i.dll} +0 -0
  29. package/wwwroot/_framework/blazor.boot.json +21 -21
  30. package/wwwroot/index.html +1 -1
  31. package/wwwroot/service-worker-assets.js +24 -24
  32. package/wwwroot/service-worker.js +1 -1
@@ -0,0 +1,224 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
3
+ import { basename, isAbsolute, join, resolve, sep } from 'node:path';
4
+ import { pathToFileURL } from 'node:url';
5
+ import { spawnSync } from 'node:child_process';
6
+ import { createRequire } from 'node:module';
7
+
8
+ const BUCKET = 'mindexec-desktop-updates';
9
+ const PUBLIC_BASE_URL = 'https://mindexec.lovecrdm.workers.dev';
10
+ const ALLOWED_CHANNELS = new Set(['stable', 'dev']);
11
+ const PLATFORM_CONFIG = {
12
+ 'windows-x64': { path: 'windows/x64', manifest: 'latest.yml' }
13
+ };
14
+ const packageRoot = resolve(import.meta.dirname, '..');
15
+ const repositoryRoot = resolve(packageRoot, '..');
16
+ const require = createRequire(import.meta.url);
17
+
18
+ function resolveWranglerEntry() {
19
+ const explicit = String(process.env.MINDEXEC_WRANGLER_ENTRY || '').trim();
20
+ if (explicit) return resolve(explicit);
21
+ return require.resolve('wrangler', { paths: [resolve(repositoryRoot, 'r2-auth-proxy')] });
22
+ }
23
+
24
+ function unquote(value) {
25
+ const text = String(value || '').trim();
26
+ if ((text.startsWith('"') && text.endsWith('"')) || (text.startsWith("'") && text.endsWith("'"))) {
27
+ return text.slice(1, -1);
28
+ }
29
+ return text;
30
+ }
31
+
32
+ export function parseUpdateManifest(source) {
33
+ const version = String(source).match(/^version:\s*([^\r\n]+)$/m)?.[1]?.trim() || '';
34
+ const files = [];
35
+ const pattern = /^\s*-\s+url:\s*([^\r\n]+)\r?\n\s+sha512:\s*([^\s#]+)(?:\r?\n\s+size:\s*(\d+))?/gm;
36
+ for (const match of String(source).matchAll(pattern)) {
37
+ files.push({
38
+ name: unquote(match[1]),
39
+ sha512: unquote(match[2]),
40
+ size: Number(match[3] || 0)
41
+ });
42
+ }
43
+ if (!version || files.length === 0) throw new Error('desktop-update-manifest-invalid');
44
+ return { version: unquote(version), files };
45
+ }
46
+
47
+ function sha512Base64(filePath) {
48
+ return createHash('sha512').update(readFileSync(filePath)).digest('base64');
49
+ }
50
+
51
+ function contentType(fileName) {
52
+ if (/\.ya?ml$/i.test(fileName)) return 'text/yaml; charset=utf-8';
53
+ if (/\.json$/i.test(fileName)) return 'application/json; charset=utf-8';
54
+ return 'application/octet-stream';
55
+ }
56
+
57
+ function isReleaseArtifact(fileName, version, channel) {
58
+ const prefix = channel === 'dev'
59
+ ? `MindExec-${version}-dev-`
60
+ : `MindExec-Setup-${version}-`;
61
+ return fileName.startsWith(prefix) && /(?:\.exe|\.exe\.blockmap)$/i.test(fileName);
62
+ }
63
+
64
+ export function readReleasePlan({
65
+ platform,
66
+ directory,
67
+ packageVersion,
68
+ channel = 'dev',
69
+ allowUnsigned = false
70
+ }) {
71
+ const target = PLATFORM_CONFIG[platform];
72
+ if (!target) throw new Error(`desktop-update-platform-invalid:${platform}`);
73
+ const normalizedChannel = String(channel || '').trim().toLowerCase();
74
+ if (!ALLOWED_CHANNELS.has(normalizedChannel)) throw new Error(`desktop-update-channel-invalid:${channel}`);
75
+ if (normalizedChannel === 'dev' && !allowUnsigned) throw new Error('desktop-update-dev-unsigned-ack-required');
76
+ if (normalizedChannel === 'stable' && allowUnsigned) throw new Error('desktop-update-stable-unsigned-forbidden');
77
+
78
+ const releaseDir = resolve(directory);
79
+ if (!existsSync(releaseDir) || !statSync(releaseDir).isDirectory()) {
80
+ throw new Error(`desktop-update-directory-missing:${releaseDir}`);
81
+ }
82
+ const manifestPath = join(releaseDir, target.manifest);
83
+ if (!existsSync(manifestPath)) throw new Error(`desktop-update-manifest-missing:${manifestPath}`);
84
+ const manifest = parseUpdateManifest(readFileSync(manifestPath, 'utf8'));
85
+ if (manifest.version !== packageVersion) {
86
+ throw new Error(`desktop-update-version-mismatch:package=${packageVersion}:manifest=${manifest.version}`);
87
+ }
88
+
89
+ for (const item of manifest.files) {
90
+ if (!item.name || basename(item.name) !== item.name) {
91
+ throw new Error(`desktop-update-artifact-name-invalid:${item.name}`);
92
+ }
93
+ const filePath = resolve(releaseDir, item.name);
94
+ if (!filePath.startsWith(`${releaseDir}${sep}`) || !existsSync(filePath)) {
95
+ throw new Error(`desktop-update-artifact-missing:${item.name}`);
96
+ }
97
+ if (item.size && statSync(filePath).size !== item.size) {
98
+ throw new Error(`desktop-update-artifact-size-mismatch:${item.name}`);
99
+ }
100
+ if (sha512Base64(filePath) !== item.sha512) {
101
+ throw new Error(`desktop-update-artifact-hash-mismatch:${item.name}`);
102
+ }
103
+ }
104
+
105
+ const artifacts = readdirSync(releaseDir)
106
+ .filter(fileName => isReleaseArtifact(fileName, packageVersion, normalizedChannel))
107
+ .sort()
108
+ .map(fileName => ({ fileName, filePath: join(releaseDir, fileName) }));
109
+ if (artifacts.length === 0) throw new Error('desktop-update-artifacts-missing');
110
+ for (const item of manifest.files) {
111
+ if (!artifacts.some(artifact => artifact.fileName === item.name)) {
112
+ throw new Error(`desktop-update-manifest-artifact-not-publishable:${item.name}`);
113
+ }
114
+ }
115
+
116
+ return {
117
+ platform,
118
+ channel: normalizedChannel,
119
+ version: packageVersion,
120
+ prefix: `${normalizedChannel}/${target.path}`,
121
+ manifest: { ...manifest, fileName: target.manifest, filePath: manifestPath },
122
+ artifacts
123
+ };
124
+ }
125
+
126
+ function readArgument(name) {
127
+ const index = process.argv.indexOf(name);
128
+ if (index >= 0) return process.argv[index + 1] || '';
129
+ return String(process.env[`npm_config_${name.slice(2).replaceAll('-', '_')}`] || '');
130
+ }
131
+
132
+ function hasFlag(name) {
133
+ if (process.argv.includes(name)) return true;
134
+ return String(process.env[`npm_config_${name.slice(2).replaceAll('-', '_')}`] || '').toLowerCase() === 'true';
135
+ }
136
+
137
+ export function createWranglerPutCommand({ key, filePath, immutable }) {
138
+ const args = [
139
+ resolveWranglerEntry(),
140
+ 'r2', 'object', 'put', `${BUCKET}/${key}`,
141
+ `--file=${filePath}`,
142
+ `--content-type=${contentType(filePath)}`,
143
+ `--cache-control=${immutable ? 'public, max-age=31536000, immutable' : 'no-store, max-age=0'}`,
144
+ '--remote'
145
+ ];
146
+ return { executable: process.execPath, args };
147
+ }
148
+
149
+ function runWranglerPut(options) {
150
+ const { executable, args } = createWranglerPutCommand(options);
151
+ const result = spawnSync(executable, args, { cwd: repositoryRoot, stdio: 'inherit' });
152
+ if (result.status !== 0) {
153
+ throw new Error(`desktop-update-upload-failed:${options.key}:${result.error?.code || result.status || 'unknown'}`);
154
+ }
155
+ }
156
+
157
+ async function verifyPublished(plan) {
158
+ const manifestUrl = `${PUBLIC_BASE_URL}/${plan.prefix}/${plan.manifest.fileName}`;
159
+ const response = await fetch(manifestUrl, { cache: 'no-store' });
160
+ if (!response.ok) throw new Error(`desktop-update-public-verify-http-${response.status}`);
161
+ const published = parseUpdateManifest(await response.text());
162
+ if (published.version !== plan.version) throw new Error('desktop-update-public-version-mismatch');
163
+ if (JSON.stringify(published.files) !== JSON.stringify(plan.manifest.files)) {
164
+ throw new Error('desktop-update-public-manifest-mismatch');
165
+ }
166
+
167
+ for (const item of plan.manifest.files) {
168
+ const artifactResponse = await fetch(`${PUBLIC_BASE_URL}/${plan.prefix}/${encodeURIComponent(item.name)}`, {
169
+ method: 'HEAD',
170
+ cache: 'no-store'
171
+ });
172
+ if (!artifactResponse.ok) throw new Error(`desktop-update-public-artifact-http-${artifactResponse.status}:${item.name}`);
173
+ const expectedSize = item.size || statSync(resolve(plan.manifest.filePath, '..', item.name)).size;
174
+ if (Number(artifactResponse.headers.get('content-length') || 0) !== expectedSize) {
175
+ throw new Error(`desktop-update-public-artifact-size-mismatch:${item.name}`);
176
+ }
177
+ }
178
+ }
179
+
180
+ async function main() {
181
+ const positional = process.argv.slice(2).filter(argument =>
182
+ argument !== '--publish' && argument !== '--allow-unsigned' && !argument.startsWith('--'));
183
+ const platform = readArgument('--platform') || positional[0] || '';
184
+ const directory = readArgument('--dir') || positional[1] || '';
185
+ const channel = readArgument('--channel') || 'dev';
186
+ const allowUnsigned = hasFlag('--allow-unsigned');
187
+ if (!platform || !directory || isAbsolute(platform)) {
188
+ throw new Error(
189
+ 'usage: --channel dev|stable --platform windows-x64 --dir <electron-builder-output> [--allow-unsigned] [--publish]'
190
+ );
191
+ }
192
+
193
+ const packageInfo = JSON.parse(readFileSync(join(packageRoot, 'package.json'), 'utf8'));
194
+ const plan = readReleasePlan({ platform, directory, packageVersion: packageInfo.version, channel, allowUnsigned });
195
+ const publish = hasFlag('--publish');
196
+ console.log(JSON.stringify({
197
+ platform: plan.platform,
198
+ channel: plan.channel,
199
+ version: plan.version,
200
+ prefix: plan.prefix,
201
+ manifest: plan.manifest.fileName,
202
+ artifacts: plan.artifacts.map(item => item.fileName),
203
+ publish
204
+ }, null, 2));
205
+ if (!publish) return;
206
+
207
+ for (const artifact of plan.artifacts) {
208
+ runWranglerPut({ key: `${plan.prefix}/${artifact.fileName}`, filePath: artifact.filePath, immutable: true });
209
+ }
210
+ runWranglerPut({
211
+ key: `${plan.prefix}/${plan.manifest.fileName}`,
212
+ filePath: plan.manifest.filePath,
213
+ immutable: false
214
+ });
215
+ await verifyPublished(plan);
216
+ console.log(`Published and verified ${plan.platform} ${plan.version} on the ${plan.channel} channel.`);
217
+ }
218
+
219
+ if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
220
+ main().catch(error => {
221
+ console.error(error?.stack || error);
222
+ process.exitCode = 1;
223
+ });
224
+ }
@@ -3797,13 +3797,21 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3797
3797
  Math.round(safeMajorStep * 100),
3798
3798
  Math.round(safeOpacity * 100)
3799
3799
  ].join('|');
3800
- const backgroundSizeKey = safeMajorStep.toFixed(3);
3800
+ const smallStepValue = safeSmallStep.toFixed(3);
3801
+ const majorStepValue = safeMajorStep.toFixed(3);
3802
+ const showMinorDots = safeSmallStep >= 2.25;
3803
+ const backgroundSizeValue = safeStyleKind === 'dot'
3804
+ ? (showMinorDots
3805
+ ? `${majorStepValue}px ${majorStepValue}px, ${smallStepValue}px ${smallStepValue}px`
3806
+ : `${majorStepValue}px ${majorStepValue}px`)
3807
+ : `${majorStepValue}px ${majorStepValue}px`;
3808
+ const backgroundSizeKey = backgroundSizeValue;
3801
3809
 
3802
3810
  if (localGridKey === this._lastLocalSnapGridKey) {
3803
3811
  this._localSnapGridRasterPeriodPx = safeMajorStep;
3804
3812
  if (backgroundSizeKey !== this._lastLocalSnapGridBackgroundSizeKey) {
3805
3813
  this._lastLocalSnapGridBackgroundSizeKey = backgroundSizeKey;
3806
- layer.style.backgroundSize = `${backgroundSizeKey}px ${backgroundSizeKey}px`;
3814
+ layer.style.backgroundSize = backgroundSizeValue;
3807
3815
  this._lastLocalSnapGridTransformKey = '';
3808
3816
  }
3809
3817
  return false;
@@ -3811,6 +3819,20 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3811
3819
 
3812
3820
  const opacityValue = safeOpacity.toFixed(3);
3813
3821
  this._lastLocalSnapGridOpacity = opacityValue;
3822
+ if (safeStyleKind === 'dot') {
3823
+ const majorDot = 'radial-gradient(circle at 0 0, rgba(15, 23, 42, 0.82) 0 1.9px, transparent 2px)';
3824
+ const minorDot = 'radial-gradient(circle at 0 0, rgba(58, 69, 88, 0.68) 0 1.2px, transparent 1.3px)';
3825
+ const backgroundImage = showMinorDots ? `${majorDot}, ${minorDot}` : majorDot;
3826
+ this._lastLocalSnapGridKey = localGridKey;
3827
+ this._lastLocalSnapGridPatternPeriodPx = safeMajorStep;
3828
+ this._localSnapGridRasterPeriodPx = safeMajorStep;
3829
+ this._lastLocalSnapGridTransformKey = '';
3830
+ if (layer.style.backgroundImage !== backgroundImage) layer.style.backgroundImage = backgroundImage;
3831
+ this._lastLocalSnapGridBackgroundSizeKey = backgroundSizeKey;
3832
+ if (layer.style.backgroundSize !== backgroundSizeValue) layer.style.backgroundSize = backgroundSizeValue;
3833
+ if (layer.style.opacity !== opacityValue) layer.style.opacity = opacityValue;
3834
+ return true;
3835
+ }
3814
3836
  const tileCanvas = this._localSnapGridTileCanvas || document.createElement('canvas');
3815
3837
  this._localSnapGridTileCanvas = tileCanvas;
3816
3838
  const tileSize = this._drawLocalSnapGridTile(
@@ -3828,7 +3850,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3828
3850
  this._lastLocalSnapGridTransformKey = '';
3829
3851
  layer.style.backgroundImage = `url("${tileCanvas.toDataURL('image/png')}")`;
3830
3852
  this._lastLocalSnapGridBackgroundSizeKey = backgroundSizeKey;
3831
- layer.style.backgroundSize = `${backgroundSizeKey}px ${backgroundSizeKey}px`;
3853
+ layer.style.backgroundSize = backgroundSizeValue;
3832
3854
  if (layer.style.opacity !== opacityValue) {
3833
3855
  layer.style.opacity = opacityValue;
3834
3856
  }
@@ -3936,7 +3958,9 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3936
3958
  const top = Number(viewportMetrics.top || 0);
3937
3959
  const pointerRevision = Math.max(0, Number(this._localSnapGridPointerRevision || 0));
3938
3960
 
3939
- if (this.isZooming === true && !!this._lastLocalSnapGridKey) {
3961
+ if (this.isZooming === true &&
3962
+ !!this._lastLocalSnapGridKey &&
3963
+ this._getLocalSnapGridStyleKind() !== 'dot') {
3940
3964
  this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
3941
3965
  this._lastLocalSnapGridPositionRevision = pointerRevision;
3942
3966
  this._localSnapGridStyleDeferredForZoom = true;
@@ -3962,6 +3986,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
3962
3986
  );
3963
3987
  const shouldDeferLocalGridStyleForZoom =
3964
3988
  this.isZooming === true &&
3989
+ styleKind !== 'dot' &&
3965
3990
  !!this._lastLocalSnapGridKey;
3966
3991
 
3967
3992
  if (shouldDeferLocalGridStyleForZoom !== true) {
@@ -4013,10 +4038,24 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
4013
4038
  const height = Math.max(1, Number(viewportMetrics.height || 0));
4014
4039
  const left = Number(viewportMetrics.left || 0);
4015
4040
  const top = Number(viewportMetrics.top || 0);
4041
+ const styleKind = this._getLocalSnapGridStyleKind();
4042
+ if (this.isZooming === true && styleKind === 'dot') {
4043
+ const cameraZ = Math.max(1, Number(this.camera?.position?.z || 1));
4044
+ const vfov = (Number(this.camera?.fov || 45) * Math.PI) / 180;
4045
+ const pxPerWorld = height / Math.max(1, 2 * Math.tan(vfov / 2) * cameraZ);
4046
+ const projection = this._resolveLocalSnapGridWorldStep(pxPerWorld);
4047
+ const rawOpacity = Math.max(0.38, Math.min(0.64,
4048
+ cameraZ <= 1800 ? 0.60 : 0.60 - ((cameraZ - 1800) / 36000)));
4049
+ const opacity = Math.max(0.38, Math.min(0.64,
4050
+ Math.round(rawOpacity / LOCAL_SNAP_GRID_OPACITY_BUCKET) * LOCAL_SNAP_GRID_OPACITY_BUCKET));
4051
+ this._applyLocalSnapGridStyle(
4052
+ layer, styleKind, projection.smallStepPx, projection.majorStepPx, opacity);
4053
+ this._localSnapGridStyleDeferredForZoom = false;
4054
+ }
4016
4055
  this._syncLocalSnapGridSpotlightPosition(width, height, left, top);
4017
4056
  this._lastLocalSnapGridPositionRevision = pointerRevision;
4018
4057
 
4019
- if (this.isZooming === true) {
4058
+ if (this.isZooming === true && styleKind !== 'dot') {
4020
4059
  this._localSnapGridStyleDeferredForZoom = true;
4021
4060
  }
4022
4061
  this._setLocalSnapGridVisible(true, this._lastLocalSnapGridOpacity || null);
@@ -6196,7 +6235,10 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6196
6235
  this.lodRenderer?.hasPendingNearCssWarmup?.(this) === true;
6197
6236
  const isResidentMidFarLodFrame = this.useLODRendering &&
6198
6237
  this.lodRenderer?.usesResidentMidFarInstances?.(this.camera) === true;
6199
- const isFullResMode = this.lodRenderer?.isInLODMode !== true;
6238
+ // The current camera band owns the boundary frame. isInLODMode
6239
+ // still describes the prior frame until updateLOD applies the
6240
+ // resident/full-res handoff.
6241
+ const isFullResMode = isResidentMidFarLodFrame !== true;
6200
6242
 
6201
6243
  // Event-driven viewport sync handles the common case. Keep the
6202
6244
  // fallback poll slow, and skip it entirely while resident MID/FAR
@@ -6232,7 +6274,7 @@ ${summaryLines.map(line => `<div>${escapeNodeFrameDebugHtml(line)}</div>`).join(
6232
6274
  const isLodModeActive = this.lodRenderer?.isInLODMode === true;
6233
6275
  const residentDirty = isResidentMidFarLodFrame &&
6234
6276
  this.lodRenderer?.hasResidentDirtyWork?.(this.camera, this) === true;
6235
- const residentBandChanging = isResidentMidFarLodFrame &&
6277
+ const residentBandChanging = this.useLODRendering === true &&
6236
6278
  this.lodRenderer?.willLodBandChange?.(this.camera) === true;
6237
6279
  let canDeferResidentDirtyIdleFrame = false;
6238
6280
  let canDeferResidentDirtyMotionFrame = false;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-k2itmZGSZI4/oLV1PZkSvmP5G7hZ+KnYz6N+kaFBt1I=",
4
+ "hash": "sha256-IzBqQA6QksjQYpCU66ODIAsRnDLECTqGe8SZNRGujiI=",
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.b973f5f64y.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.k4h9fvi9wb.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.u2emae8cb5.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.cysw4qtyke.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.8iehgvzjio.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.t621fsxq2i.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.ft631uc7ki.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.arivgu92h1.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.wm997st9eb.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.osdbdrue4h.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.0b8jdcyhj8.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.hm6hmoblm6.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.oztzw186ns.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.a1e73rkgjv.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.rgwn0b8m2o.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.2qeqqundtn.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.mlf2c4st5u.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.acobc6tmxc.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.6lbogo6eek.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.y97l6vu05i.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.b973f5f64y.dll": "sha256-gaWEYZie3oGBsJ7KNcinPxikQw7nSHgJSBllq4YEZ38=",
280
- "MindExecution.Kernel.k4h9fvi9wb.dll": "sha256-DJajefF5YNuFQ7hh7Y8750yzg5kXpdE91GuofhBtiIg=",
281
- "MindExecution.Plugins.Business.cysw4qtyke.dll": "sha256-bCkYY5nsWdSGvLFYVjeMGh/SLIrhErscom7vq4WW1e8=",
282
- "MindExecution.Plugins.Concept.8iehgvzjio.dll": "sha256-sD9g99bCcgFnUnIivPfe19mEYg7scZKgwdHuh5fT3wM=",
283
- "MindExecution.Plugins.PlanMaster.ft631uc7ki.dll": "sha256-Q54/SRbdbUoRNPbJrN9ngcsNdAN2uqHK0Or2GVU7Vx8=",
284
- "MindExecution.Shared.wm997st9eb.dll": "sha256-CABTI+PIZ9ZrDZ2VoLANJ5qvthYPX32AoKv2/qdpp0E=",
285
- "MindExecution.Web.osdbdrue4h.dll": "sha256-mPMX7zmQgrN1cg8qclbhRZlRm5N45je5DzrRQrunlCw="
279
+ "MindExecution.Core.0b8jdcyhj8.dll": "sha256-zO2Pf5hEeQIy3+8Hkn1MYGQEFR3sG1ov/sz5rBoblVA=",
280
+ "MindExecution.Kernel.hm6hmoblm6.dll": "sha256-N55xbLNkHU2zPdjUCg8+b7POfJXwOO7FbMbtBf8DMVQ=",
281
+ "MindExecution.Plugins.Business.a1e73rkgjv.dll": "sha256-zrGB3UOmX+dKr9qloUjwZtgs3ks+iz6tbs+GUGTDdm0=",
282
+ "MindExecution.Plugins.Concept.rgwn0b8m2o.dll": "sha256-5e/Ff46+w0CUJcED62+TYIgbZpHEmmdOko1iOZ6KrW4=",
283
+ "MindExecution.Plugins.PlanMaster.mlf2c4st5u.dll": "sha256-etePo6A8j9ISSi6STcmts7S/6rUoygzDBXtK/XR92Wo=",
284
+ "MindExecution.Shared.6lbogo6eek.dll": "sha256-qqB6SQV8z9YX7gMmkGYbveLoLojb30rR/L4CdY8DXec=",
285
+ "MindExecution.Web.y97l6vu05i.dll": "sha256-6mXMnhlTEHLT5Eztde7zRWxEYt1b5s9de7EJfQ2InBs="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.u2emae8cb5.dll": "sha256-xrK3EFbor2pEuhuKt/MXQSBJmTt22JYH68udxQLbEi4=",
289
- "MindExecution.Plugins.Directory.t621fsxq2i.dll": "sha256-q0/3D7+gLKCW1xhY+wgOFGWCSh6AhKWfyZ0GwzanC14=",
290
- "MindExecution.Plugins.YouTube.arivgu92h1.dll": "sha256-Sje33rNG7OWB8dP5QngdiqI2qWjCIfhQx7b+v8Y7AIU="
288
+ "MindExecution.Plugins.Admin.oztzw186ns.dll": "sha256-bLmSJjmhatetPRQsf8svMc9vSh0lzmKRm3OWdcywf2w=",
289
+ "MindExecution.Plugins.Directory.2qeqqundtn.dll": "sha256-9vAmxvlOa9K+6bE9k30Z80hSXxU6BBnvjid7p/q+css=",
290
+ "MindExecution.Plugins.YouTube.acobc6tmxc.dll": "sha256-+gObV6v2xJ8tUczx3Q64bLEnXxBecFyGPRrofjTW9JI="
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 = '20260815-canvas-coordinate-v972';
617
+ const scriptVersion = '20260815-lod-grid-live-v973';
618
618
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
619
619
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
620
620
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "VDB/by92",
2
+ "version": "pPdHB1um",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -82,7 +82,7 @@ self.assetsManifest = {
82
82
  "url": "_content/MindExecution.Shared/js/mind-map-animated-image-preview.js"
83
83
  },
84
84
  {
85
- "hash": "sha256-1QyMzFKxEdNA25eyKGClEsxQuLewG72H9qy2nzD19JU=",
85
+ "hash": "sha256-bKZK/OA/kLveWaNcyQGsjwhZsK+VG8zxKY1FyGBHp7o=",
86
86
  "url": "_content/MindExecution.Shared/js/mind-map-core.js"
87
87
  },
88
88
  {
@@ -434,44 +434,44 @@ self.assetsManifest = {
434
434
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-gaWEYZie3oGBsJ7KNcinPxikQw7nSHgJSBllq4YEZ38=",
438
- "url": "_framework/MindExecution.Core.b973f5f64y.dll"
437
+ "hash": "sha256-zO2Pf5hEeQIy3+8Hkn1MYGQEFR3sG1ov/sz5rBoblVA=",
438
+ "url": "_framework/MindExecution.Core.0b8jdcyhj8.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-DJajefF5YNuFQ7hh7Y8750yzg5kXpdE91GuofhBtiIg=",
442
- "url": "_framework/MindExecution.Kernel.k4h9fvi9wb.dll"
441
+ "hash": "sha256-N55xbLNkHU2zPdjUCg8+b7POfJXwOO7FbMbtBf8DMVQ=",
442
+ "url": "_framework/MindExecution.Kernel.hm6hmoblm6.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-xrK3EFbor2pEuhuKt/MXQSBJmTt22JYH68udxQLbEi4=",
446
- "url": "_framework/MindExecution.Plugins.Admin.u2emae8cb5.dll"
445
+ "hash": "sha256-bLmSJjmhatetPRQsf8svMc9vSh0lzmKRm3OWdcywf2w=",
446
+ "url": "_framework/MindExecution.Plugins.Admin.oztzw186ns.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-bCkYY5nsWdSGvLFYVjeMGh/SLIrhErscom7vq4WW1e8=",
450
- "url": "_framework/MindExecution.Plugins.Business.cysw4qtyke.dll"
449
+ "hash": "sha256-zrGB3UOmX+dKr9qloUjwZtgs3ks+iz6tbs+GUGTDdm0=",
450
+ "url": "_framework/MindExecution.Plugins.Business.a1e73rkgjv.dll"
451
451
  },
452
452
  {
453
- "hash": "sha256-sD9g99bCcgFnUnIivPfe19mEYg7scZKgwdHuh5fT3wM=",
454
- "url": "_framework/MindExecution.Plugins.Concept.8iehgvzjio.dll"
453
+ "hash": "sha256-5e/Ff46+w0CUJcED62+TYIgbZpHEmmdOko1iOZ6KrW4=",
454
+ "url": "_framework/MindExecution.Plugins.Concept.rgwn0b8m2o.dll"
455
455
  },
456
456
  {
457
- "hash": "sha256-q0/3D7+gLKCW1xhY+wgOFGWCSh6AhKWfyZ0GwzanC14=",
458
- "url": "_framework/MindExecution.Plugins.Directory.t621fsxq2i.dll"
457
+ "hash": "sha256-9vAmxvlOa9K+6bE9k30Z80hSXxU6BBnvjid7p/q+css=",
458
+ "url": "_framework/MindExecution.Plugins.Directory.2qeqqundtn.dll"
459
459
  },
460
460
  {
461
- "hash": "sha256-Q54/SRbdbUoRNPbJrN9ngcsNdAN2uqHK0Or2GVU7Vx8=",
462
- "url": "_framework/MindExecution.Plugins.PlanMaster.ft631uc7ki.dll"
461
+ "hash": "sha256-etePo6A8j9ISSi6STcmts7S/6rUoygzDBXtK/XR92Wo=",
462
+ "url": "_framework/MindExecution.Plugins.PlanMaster.mlf2c4st5u.dll"
463
463
  },
464
464
  {
465
- "hash": "sha256-Sje33rNG7OWB8dP5QngdiqI2qWjCIfhQx7b+v8Y7AIU=",
466
- "url": "_framework/MindExecution.Plugins.YouTube.arivgu92h1.dll"
465
+ "hash": "sha256-+gObV6v2xJ8tUczx3Q64bLEnXxBecFyGPRrofjTW9JI=",
466
+ "url": "_framework/MindExecution.Plugins.YouTube.acobc6tmxc.dll"
467
467
  },
468
468
  {
469
- "hash": "sha256-CABTI+PIZ9ZrDZ2VoLANJ5qvthYPX32AoKv2/qdpp0E=",
470
- "url": "_framework/MindExecution.Shared.wm997st9eb.dll"
469
+ "hash": "sha256-qqB6SQV8z9YX7gMmkGYbveLoLojb30rR/L4CdY8DXec=",
470
+ "url": "_framework/MindExecution.Shared.6lbogo6eek.dll"
471
471
  },
472
472
  {
473
- "hash": "sha256-mPMX7zmQgrN1cg8qclbhRZlRm5N45je5DzrRQrunlCw=",
474
- "url": "_framework/MindExecution.Web.osdbdrue4h.dll"
473
+ "hash": "sha256-6mXMnhlTEHLT5Eztde7zRWxEYt1b5s9de7EJfQ2InBs=",
474
+ "url": "_framework/MindExecution.Web.y97l6vu05i.dll"
475
475
  },
476
476
  {
477
477
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -790,7 +790,7 @@ self.assetsManifest = {
790
790
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
791
791
  },
792
792
  {
793
- "hash": "sha256-ieTEudjBcaAZw6eP0zjgJBVMb9fHLteyu+dp3ZgHJ8Y=",
793
+ "hash": "sha256-Gc/yjpKYI4iA4dz/l+0OJ2h42y6wjfcPqgm3MClrO4U=",
794
794
  "url": "_framework/blazor.boot.json"
795
795
  },
796
796
  {
@@ -866,7 +866,7 @@ self.assetsManifest = {
866
866
  "url": "icon-512.png"
867
867
  },
868
868
  {
869
- "hash": "sha256-7dz8Xq6a5L1oPHRuHfilLej5rvG+C0k1u46WWILzSOo=",
869
+ "hash": "sha256-09pACZREKNjnfet+hL8kX0iFNjHKgdjnCO4JMu/we94=",
870
870
  "url": "index.html"
871
871
  },
872
872
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: VDB/by92 */
1
+ /* Manifest version: pPdHB1um */
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