@mindexec/cli 0.2.466 → 0.2.468

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 (25) hide show
  1. package/README.md +2 -0
  2. package/codex-runtime.js +35 -34
  3. package/package.json +5 -3
  4. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  5. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  6. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  7. package/scripts/codex-runtime-home-smoke.mjs +58 -0
  8. package/scripts/codex-sdk-image-live-smoke.mjs +43 -0
  9. package/scripts/codex-sdk-image-runtime-smoke.mjs +1 -0
  10. package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +39 -11
  11. package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +3 -3
  12. package/wwwroot/_framework/{MindExecution.Core.psrddqi3mi.dll → MindExecution.Core.yrfbp4404m.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Kernel.emus4f6jja.dll → MindExecution.Kernel.qpodwwdiwx.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Plugins.Admin.q3gz9b4wp8.dll → MindExecution.Plugins.Admin.8uzx32oujb.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Plugins.Business.dr4m9mbnc5.dll → MindExecution.Plugins.Business.tx05qckwdp.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Plugins.Concept.xzrzi61p7e.dll → MindExecution.Plugins.Concept.m3ew6te59x.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Plugins.Directory.hcbtf3n8w7.dll → MindExecution.Plugins.Directory.9qioesdf9k.dll} +0 -0
  18. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.1w09epz56f.dll → MindExecution.Plugins.PlanMaster.74t0l3lj50.dll} +0 -0
  19. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.7vjbulgfo8.dll → MindExecution.Plugins.YouTube.rw3h96cxzb.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Shared.zj2n1axexl.dll → MindExecution.Shared.ubxwcs5koc.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Web.z1np8j1qu6.dll → MindExecution.Web.mvn80sbzgp.dll} +0 -0
  22. package/wwwroot/_framework/blazor.boot.json +21 -21
  23. package/wwwroot/index.html +1 -1
  24. package/wwwroot/service-worker-assets.js +25 -25
  25. package/wwwroot/service-worker.js +1 -1
package/README.md CHANGED
@@ -274,6 +274,8 @@ Shell/Codex job ?대깽??
274
274
 
275
275
  The TypeScript SDK runs only inside LocalBridge. Browser/WASM clients should call these bridge endpoints and must not import or execute Codex SDK packages directly.
276
276
 
277
+ By default, LocalBridge reuses the active `CODEX_HOME` (or the standard `~/.codex` home) so SDK calls share the existing Codex login. Set `MINDEXEC_CODEX_HOME` only when a deliberately separate MindExec login is required.
278
+
277
279
  ### Port ownership
278
280
 
279
281
  On startup, LocalBridge checks `BRIDGE_PORT` and stops an existing MindExec/LocalBridge listener on that same port before binding. If the port is owned by an unrelated process, startup fails with a clear message instead of silently killing it. Set `BRIDGE_FORCE_KILL_PORT_OWNER=1` only when the launcher owns that port policy and should terminate any listener.
package/codex-runtime.js CHANGED
@@ -41,11 +41,8 @@ const MAX_IMAGE_REFERENCE_COUNT = 8;
41
41
  const MAX_IMAGE_REFERENCE_BYTES = 40 * 1024 * 1024;
42
42
  const MAX_GENERATED_IMAGE_BYTES = 50 * 1024 * 1024;
43
43
  const TEMP_DIR = '.ai/codex';
44
- const CODEX_SOURCE_HOME = path.join(os.homedir(), '.codex');
45
44
  const CODEX_RUNTIME_HOME_ENV = 'MINDEXEC_CODEX_HOME';
46
- const DEFAULT_CODEX_RUNTIME_HOME = path.join(os.homedir(), '.mindexec', 'codex-runtime');
47
45
  const CODEX_RUNTIME_CONFIG_MARKER = '# Generated by MindExec LocalBridge for isolated AI node runs.';
48
- const CODEX_RUNTIME_AUTH_FILES = ['auth.json'];
49
46
  const CODEX_TARGET_BY_PLATFORM = Object.freeze({
50
47
  'win32:x64': {
51
48
  packageName: '@openai/codex-win32-x64',
@@ -130,40 +127,35 @@ function normalizeProviderKind(value) {
130
127
  return '';
131
128
  }
132
129
 
133
- function resolveCodexRuntimeHome() {
134
- const configured = String(process.env[CODEX_RUNTIME_HOME_ENV] || '').trim();
135
- return path.resolve(configured || DEFAULT_CODEX_RUNTIME_HOME);
130
+ function resolveUserCodexHome() {
131
+ const configured = String(process.env.CODEX_HOME || '').trim();
132
+ return path.resolve(configured || path.join(os.homedir(), '.codex'));
136
133
  }
137
134
 
138
- async function copyCodexRuntimeFileIfPresent(fileName, runtimeHome) {
139
- const source = path.join(CODEX_SOURCE_HOME, fileName);
140
- const target = path.join(runtimeHome, fileName);
141
- try {
142
- const targetStat = await fs.stat(target).catch(() => null);
143
- if (targetStat?.isFile()) {
144
- return false;
145
- }
135
+ export function resolveCodexRuntimeHome() {
136
+ const configured = String(process.env[CODEX_RUNTIME_HOME_ENV] || '').trim();
137
+ return path.resolve(configured || resolveUserCodexHome());
138
+ }
146
139
 
147
- const sourceStat = await fs.stat(source);
148
- if (!sourceStat.isFile()) {
149
- return false;
150
- }
140
+ function usesExplicitIsolatedCodexHome() {
141
+ return String(process.env[CODEX_RUNTIME_HOME_ENV] || '').trim().length > 0;
142
+ }
151
143
 
152
- await fs.copyFile(source, target);
153
- return true;
154
- } catch {
155
- return false;
156
- }
144
+ function buildCodexSdkConfigOverrides(additional = {}) {
145
+ return {
146
+ mcp_servers: {},
147
+ ...additional
148
+ };
157
149
  }
158
150
 
159
- async function ensureCodexRuntimeHome() {
151
+ export async function ensureCodexRuntimeHome() {
160
152
  const runtimeHome = resolveCodexRuntimeHome();
161
153
  await fs.mkdir(runtimeHome, { recursive: true });
162
154
  await fs.mkdir(path.join(runtimeHome, 'sessions'), { recursive: true });
163
155
  await fs.mkdir(path.join(runtimeHome, 'generated_images'), { recursive: true });
164
156
 
165
- for (const fileName of CODEX_RUNTIME_AUTH_FILES) {
166
- await copyCodexRuntimeFileIfPresent(fileName, runtimeHome);
157
+ if (!usesExplicitIsolatedCodexHome()) {
158
+ return runtimeHome;
167
159
  }
168
160
 
169
161
  const configPath = path.join(runtimeHome, 'config.toml');
@@ -186,7 +178,7 @@ async function ensureCodexRuntimeHome() {
186
178
  return runtimeHome;
187
179
  }
188
180
 
189
- function buildCodexChildEnv() {
181
+ export function buildCodexChildEnv() {
190
182
  const env = {};
191
183
  for (const [key, value] of Object.entries(process.env)) {
192
184
  if (value !== undefined) {
@@ -195,7 +187,11 @@ function buildCodexChildEnv() {
195
187
  }
196
188
 
197
189
  env.CODEX_HOME = resolveCodexRuntimeHome();
198
- env.MINDEXEC_CODEX_ISOLATED_HOME = '1';
190
+ if (usesExplicitIsolatedCodexHome()) {
191
+ env.MINDEXEC_CODEX_ISOLATED_HOME = '1';
192
+ } else {
193
+ delete env.MINDEXEC_CODEX_ISOLATED_HOME;
194
+ }
199
195
  return env;
200
196
  }
201
197
 
@@ -1011,7 +1007,8 @@ export function createCodexRuntime(options) {
1011
1007
  const sdk = await sdkLoader();
1012
1008
  await prepareRuntimeHome();
1013
1009
  const codex = new sdk.Codex({
1014
- env: childEnvFactory()
1010
+ env: childEnvFactory(),
1011
+ config: buildCodexSdkConfigOverrides()
1015
1012
  });
1016
1013
  const thread = codex.startThread(threadOptions);
1017
1014
  const localThreadId = `local_${crypto.randomUUID()}`;
@@ -1076,7 +1073,8 @@ export function createCodexRuntime(options) {
1076
1073
  const sdk = await sdkLoader();
1077
1074
  await prepareRuntimeHome();
1078
1075
  const codex = new sdk.Codex({
1079
- env: childEnvFactory()
1076
+ env: childEnvFactory(),
1077
+ config: buildCodexSdkConfigOverrides()
1080
1078
  });
1081
1079
  const officialId = requestedThreadId && !requestedThreadId.startsWith('local_')
1082
1080
  ? requestedThreadId
@@ -1231,7 +1229,9 @@ export function createCodexRuntime(options) {
1231
1229
  '-s',
1232
1230
  threadOptions.sandboxMode,
1233
1231
  '--config',
1234
- `model_reasoning_effort=${threadOptions.modelReasoningEffort}`
1232
+ `model_reasoning_effort=${threadOptions.modelReasoningEffort}`,
1233
+ '--config',
1234
+ 'mcp_servers={}'
1235
1235
  ];
1236
1236
  if (threadOptions.model) {
1237
1237
  args.push('-m', threadOptions.model);
@@ -1397,9 +1397,9 @@ export function createCodexRuntime(options) {
1397
1397
  try {
1398
1398
  const codex = new sdk.Codex({
1399
1399
  env: childEnvFactory(),
1400
- config: {
1400
+ config: buildCodexSdkConfigOverrides({
1401
1401
  features: { image_generation: true }
1402
- }
1402
+ })
1403
1403
  });
1404
1404
  const thread = codex.startThread(threadOptions);
1405
1405
  const input = [
@@ -1508,7 +1508,8 @@ export function createCodexRuntime(options) {
1508
1508
  const sdk = await sdkLoader();
1509
1509
  await prepareRuntimeHome();
1510
1510
  const codex = new sdk.Codex({
1511
- env: childEnvFactory()
1511
+ env: childEnvFactory(),
1512
+ config: buildCodexSdkConfigOverrides()
1512
1513
  });
1513
1514
  const thread = codex.resumeThread(threadId, threadOptions);
1514
1515
  threads.set(threadId, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.466",
3
+ "version": "0.2.468",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -36,10 +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/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",
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
41
  "test:codex-sdk": "node scripts/codex-sdk-runtime-smoke.mjs",
42
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",
43
45
  "test:codex-sdk:live": "node scripts/codex-sdk-runtime-smoke.mjs --live",
44
46
  "test:codex-sdk:live-tools": "node scripts/codex-sdk-runtime-smoke.mjs --live-tools",
45
47
  "test:codex-model-catalog": "node scripts/codex-model-catalog-smoke.mjs",
@@ -0,0 +1,58 @@
1
+ import assert from 'node:assert/strict';
2
+ import { promises as fs } from 'node:fs';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import {
6
+ buildCodexChildEnv,
7
+ ensureCodexRuntimeHome,
8
+ resolveCodexRuntimeHome
9
+ } from '../codex-runtime.js';
10
+
11
+ const previousCodexHome = process.env.CODEX_HOME;
12
+ const previousMindExecCodexHome = process.env.MINDEXEC_CODEX_HOME;
13
+ const sharedHome = await fs.mkdtemp(path.join(os.tmpdir(), 'mindexec-codex-shared-home-'));
14
+ const isolatedHome = await fs.mkdtemp(path.join(os.tmpdir(), 'mindexec-codex-isolated-home-'));
15
+
16
+ try {
17
+ process.env.CODEX_HOME = sharedHome;
18
+ delete process.env.MINDEXEC_CODEX_HOME;
19
+
20
+ assert.equal(resolveCodexRuntimeHome(), path.resolve(sharedHome));
21
+ assert.equal(await ensureCodexRuntimeHome(), path.resolve(sharedHome));
22
+ assert.equal(await fs.stat(path.join(sharedHome, 'sessions')).then(() => true), true);
23
+ assert.equal(await fs.stat(path.join(sharedHome, 'generated_images')).then(() => true), true);
24
+ assert.equal(await fs.stat(path.join(sharedHome, 'config.toml')).then(() => true).catch(() => false), false);
25
+
26
+ const sharedEnv = buildCodexChildEnv();
27
+ assert.equal(sharedEnv.CODEX_HOME, path.resolve(sharedHome));
28
+ assert.equal(sharedEnv.MINDEXEC_CODEX_ISOLATED_HOME, undefined);
29
+
30
+ process.env.MINDEXEC_CODEX_HOME = isolatedHome;
31
+ assert.equal(resolveCodexRuntimeHome(), path.resolve(isolatedHome));
32
+ assert.equal(await ensureCodexRuntimeHome(), path.resolve(isolatedHome));
33
+ const isolatedConfig = await fs.readFile(path.join(isolatedHome, 'config.toml'), 'utf8');
34
+ assert.match(isolatedConfig, /Generated by MindExec LocalBridge for isolated AI node runs/);
35
+
36
+ const isolatedEnv = buildCodexChildEnv();
37
+ assert.equal(isolatedEnv.CODEX_HOME, path.resolve(isolatedHome));
38
+ assert.equal(isolatedEnv.MINDEXEC_CODEX_ISOLATED_HOME, '1');
39
+
40
+ console.log(JSON.stringify({
41
+ ok: true,
42
+ sharedCodexLoginHome: true,
43
+ explicitIsolationOnly: true
44
+ }));
45
+ } finally {
46
+ if (previousCodexHome === undefined) {
47
+ delete process.env.CODEX_HOME;
48
+ } else {
49
+ process.env.CODEX_HOME = previousCodexHome;
50
+ }
51
+ if (previousMindExecCodexHome === undefined) {
52
+ delete process.env.MINDEXEC_CODEX_HOME;
53
+ } else {
54
+ process.env.MINDEXEC_CODEX_HOME = previousMindExecCodexHome;
55
+ }
56
+ await fs.rm(sharedHome, { recursive: true, force: true });
57
+ await fs.rm(isolatedHome, { recursive: true, force: true });
58
+ }
@@ -0,0 +1,43 @@
1
+ import assert from 'node:assert/strict';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { createCodexRuntime, resolveCodexRuntimeHome } from '../codex-runtime.js';
5
+
6
+ if (!process.argv.includes('--live')) {
7
+ console.log(JSON.stringify({ ok: true, liveImage: false }));
8
+ process.exit(0);
9
+ }
10
+
11
+ const scriptDir = path.dirname(fileURLToPath(import.meta.url));
12
+ const packageRoot = path.resolve(scriptDir, '..');
13
+ const workspaceRoot = path.resolve(packageRoot, '..');
14
+ const runtime = createCodexRuntime({
15
+ packageRoot,
16
+ resolveWorkingDirectory: async () => workspaceRoot,
17
+ getCurrentRuntime: () => ({}),
18
+ getModelCatalog: async () => ({ models: [], source: 'live-smoke', updatedAt: new Date().toISOString() }),
19
+ log: () => {}
20
+ });
21
+
22
+ const result = await runtime.runImage({
23
+ prompt: 'Create a clean square test image with one solid blue circle centered on a white background. No text.',
24
+ size: '1024x1024',
25
+ quality: 'low'
26
+ });
27
+
28
+ assert.equal(result.success, true, result.error);
29
+ assert.equal(result.providerKind, 'TypeScriptSdk');
30
+ assert.equal(result.authenticationRequired, false);
31
+ assert.equal(result.loginOpened, false, 'The existing Codex login should be reused without opening sign-in.');
32
+ assert.ok(result.imageBase64.length > 1000, 'The live SDK image result was unexpectedly small.');
33
+ assert.match(result.mimeType, /^image\//);
34
+
35
+ console.log(JSON.stringify({
36
+ ok: true,
37
+ liveImage: true,
38
+ providerKind: result.providerKind,
39
+ sharedCodexHome: resolveCodexRuntimeHome(),
40
+ loginOpened: result.loginOpened,
41
+ mimeType: result.mimeType,
42
+ imageBytesApprox: Math.floor(result.imageBase64.length * 0.75)
43
+ }));
@@ -80,6 +80,7 @@ try {
80
80
  assert.equal(generated.imageBase64, tinyPngBase64);
81
81
  assert.equal(generated.mimeType, 'image/png');
82
82
  assert.equal(captures.codexOptions[0].config.features.image_generation, true);
83
+ assert.deepEqual(captures.codexOptions[0].config.mcp_servers, {});
83
84
  assert.equal(captures.threadOptions[0].sandboxMode, 'read-only');
84
85
  assert.equal(captures.inputs[0][0].type, 'text');
85
86
  assert.equal(captures.inputs[0][1].type, 'local_image');
@@ -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);
@@ -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) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-ZCsr6yMshf12g8H1C7Es4Bcxp7qN8HF/8VqttnLuOao=",
4
+ "hash": "sha256-i2ory+UREibapPv0SX0hnBPJ+UaQ5EiOGp2Pwv77bl0=",
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.psrddqi3mi.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.emus4f6jja.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.q3gz9b4wp8.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.dr4m9mbnc5.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.xzrzi61p7e.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.hcbtf3n8w7.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.1w09epz56f.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.7vjbulgfo8.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.zj2n1axexl.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.z1np8j1qu6.dll": "MindExecution.Web.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",
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.psrddqi3mi.dll": "sha256-B33cTW2KC7j+nxxSkwA1KD3qCGmLk7qH0DvEMA+qPCk=",
280
- "MindExecution.Kernel.emus4f6jja.dll": "sha256-+jWRYJUSZg/+/yuEpHFeoW05bwhQq+1uJ519QRLal6o=",
281
- "MindExecution.Plugins.Business.dr4m9mbnc5.dll": "sha256-mfINIgO0Jb1B9JNJVuBjGebWdT05+X1WusarZ0UhC2E=",
282
- "MindExecution.Plugins.Concept.xzrzi61p7e.dll": "sha256-gw0HIuC4xerbOv3GbS/66kRPU98Hzo5oWVC7BCFig3A=",
283
- "MindExecution.Plugins.PlanMaster.1w09epz56f.dll": "sha256-wa5PyOU/QkpFcW0/wiNbtYjtEIOtkqfuqaQsVeAMXBk=",
284
- "MindExecution.Shared.zj2n1axexl.dll": "sha256-UfqtUG6XriHJTwSc8E0LUD65HYeTJxSedYz4UZl8dg8=",
285
- "MindExecution.Web.z1np8j1qu6.dll": "sha256-9wQB1wuAG+0sMQV1UZOybyqGSWmQyBMyMxJrHwpQFp4="
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="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.q3gz9b4wp8.dll": "sha256-us79gHGdEtfuUIlKqMmJZFbHE9sB+OBzsGgiaOIJCGk=",
289
- "MindExecution.Plugins.Directory.hcbtf3n8w7.dll": "sha256-T1ay20LkWJDPggiQ1ws5h0f6e34xLCmQV3qXVsMZIHc=",
290
- "MindExecution.Plugins.YouTube.7vjbulgfo8.dll": "sha256-rbRIYqL6wVvLLLHmkDp3ct+dVjUGw7mW8bn3c30SvuA="
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="
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-grid-zoom-density-v976';
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": "plldCWxD",
2
+ "version": "JCn6P4Wg",
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
  {
@@ -118,7 +118,7 @@ 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-5sVcWSPLCHmnvAYLsqBwno201net5gfRYOqtQLUXQZE=",
122
122
  "url": "_content/MindExecution.Shared/js/mind-map-interactions.js"
123
123
  },
124
124
  {
@@ -438,44 +438,44 @@ self.assetsManifest = {
438
438
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-B33cTW2KC7j+nxxSkwA1KD3qCGmLk7qH0DvEMA+qPCk=",
442
- "url": "_framework/MindExecution.Core.psrddqi3mi.dll"
441
+ "hash": "sha256-nq3r4xX1c1c2Z7xUBMYKC9rt0nTkdm9Y+eTxfxlQaU4=",
442
+ "url": "_framework/MindExecution.Core.yrfbp4404m.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-+jWRYJUSZg/+/yuEpHFeoW05bwhQq+1uJ519QRLal6o=",
446
- "url": "_framework/MindExecution.Kernel.emus4f6jja.dll"
445
+ "hash": "sha256-olF1qq4bo/XPU7Kbi5/CqHwcXYomi6OIretnVjngi8c=",
446
+ "url": "_framework/MindExecution.Kernel.qpodwwdiwx.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-us79gHGdEtfuUIlKqMmJZFbHE9sB+OBzsGgiaOIJCGk=",
450
- "url": "_framework/MindExecution.Plugins.Admin.q3gz9b4wp8.dll"
449
+ "hash": "sha256-UKGhMbjZpy62abQZQFHZlygg1WDDNZ5772yzNISn+iA=",
450
+ "url": "_framework/MindExecution.Plugins.Admin.8uzx32oujb.dll"
451
451
  },
452
452
  {
453
- "hash": "sha256-mfINIgO0Jb1B9JNJVuBjGebWdT05+X1WusarZ0UhC2E=",
454
- "url": "_framework/MindExecution.Plugins.Business.dr4m9mbnc5.dll"
453
+ "hash": "sha256-/yHM2edJdWvBjl9kECWO1NRROSfAmLOMAgvw+6Q7jOI=",
454
+ "url": "_framework/MindExecution.Plugins.Business.tx05qckwdp.dll"
455
455
  },
456
456
  {
457
- "hash": "sha256-gw0HIuC4xerbOv3GbS/66kRPU98Hzo5oWVC7BCFig3A=",
458
- "url": "_framework/MindExecution.Plugins.Concept.xzrzi61p7e.dll"
457
+ "hash": "sha256-nnbzQPkW3yXRr/45sCYu8VYJVVVnV+2/Wu3kfYB6Rpo=",
458
+ "url": "_framework/MindExecution.Plugins.Concept.m3ew6te59x.dll"
459
459
  },
460
460
  {
461
- "hash": "sha256-T1ay20LkWJDPggiQ1ws5h0f6e34xLCmQV3qXVsMZIHc=",
462
- "url": "_framework/MindExecution.Plugins.Directory.hcbtf3n8w7.dll"
461
+ "hash": "sha256-Lz07C5H7DBSszx9DH5LMxqX6rG2ONaJK4jGwKAy9r2g=",
462
+ "url": "_framework/MindExecution.Plugins.Directory.9qioesdf9k.dll"
463
463
  },
464
464
  {
465
- "hash": "sha256-wa5PyOU/QkpFcW0/wiNbtYjtEIOtkqfuqaQsVeAMXBk=",
466
- "url": "_framework/MindExecution.Plugins.PlanMaster.1w09epz56f.dll"
465
+ "hash": "sha256-Z8R6DLdddz11VeV7sLWnjdZxWyWNNP836HEwxm3VZ1I=",
466
+ "url": "_framework/MindExecution.Plugins.PlanMaster.74t0l3lj50.dll"
467
467
  },
468
468
  {
469
- "hash": "sha256-rbRIYqL6wVvLLLHmkDp3ct+dVjUGw7mW8bn3c30SvuA=",
470
- "url": "_framework/MindExecution.Plugins.YouTube.7vjbulgfo8.dll"
469
+ "hash": "sha256-C698Z1kqGX9giei+qoNuUC3L0sqPac0cNRVUy/Fo7uk=",
470
+ "url": "_framework/MindExecution.Plugins.YouTube.rw3h96cxzb.dll"
471
471
  },
472
472
  {
473
- "hash": "sha256-UfqtUG6XriHJTwSc8E0LUD65HYeTJxSedYz4UZl8dg8=",
474
- "url": "_framework/MindExecution.Shared.zj2n1axexl.dll"
473
+ "hash": "sha256-RsMq3/t1Nd+Tdf8CXmwW4fGVHg12525aH1ngTLaAHTw=",
474
+ "url": "_framework/MindExecution.Shared.ubxwcs5koc.dll"
475
475
  },
476
476
  {
477
- "hash": "sha256-9wQB1wuAG+0sMQV1UZOybyqGSWmQyBMyMxJrHwpQFp4=",
478
- "url": "_framework/MindExecution.Web.z1np8j1qu6.dll"
477
+ "hash": "sha256-4orMyt10vcNSu51DuaGyeZFzif8zM8OYy6soyE+7So4=",
478
+ "url": "_framework/MindExecution.Web.mvn80sbzgp.dll"
479
479
  },
480
480
  {
481
481
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -794,7 +794,7 @@ self.assetsManifest = {
794
794
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
795
795
  },
796
796
  {
797
- "hash": "sha256-yveVWUW29Nw/d1qRdB9Q6r3BjTMpqnEkjEhqwMxzaI4=",
797
+ "hash": "sha256-Hmlq6LlQsFCZjyCJas5hdlZGxs0pLTELTn3eVSmswyE=",
798
798
  "url": "_framework/blazor.boot.json"
799
799
  },
800
800
  {
@@ -870,7 +870,7 @@ self.assetsManifest = {
870
870
  "url": "icon-512.png"
871
871
  },
872
872
  {
873
- "hash": "sha256-9dWOZC5NL0BDx5c/eCMKiBn/zJYlPtkAemjcgPyZeK8=",
873
+ "hash": "sha256-h74aPUpMz/6U/N5yUj8zrvt8xaw+B/L3ZvrZS7h5EzQ=",
874
874
  "url": "index.html"
875
875
  },
876
876
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: plldCWxD */
1
+ /* Manifest version: JCn6P4Wg */
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