@mindexec/cli 0.2.480 → 0.2.482

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/electron/main.cjs +13 -1
  2. package/electron/source-smoke.mjs +12 -1
  3. package/electron/update-manager-smoke.mjs +14 -2
  4. package/electron/update-manager.cjs +31 -3
  5. package/electron/windows-package-smoke.mjs +2 -0
  6. package/package.json +6 -5
  7. package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
  8. package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
  9. package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
  10. package/scripts/desktop-update-publisher-smoke.mjs +12 -1
  11. package/scripts/desktop-update-worker-smoke.mjs +95 -0
  12. package/scripts/publish-mindexec-desktop-updates.mjs +13 -5
  13. package/wwwroot/_framework/{MindExecution.Core.gnj3fo0pr7.dll → MindExecution.Core.l639gk1bj0.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Kernel.1qygzf8o02.dll → MindExecution.Kernel.dhkjql36qa.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Plugins.Admin.n3uxh144wo.dll → MindExecution.Plugins.Admin.sdnqjd3bhw.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Plugins.Business.vl5dximn25.dll → MindExecution.Plugins.Business.dntgcr4fyr.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Plugins.Concept.rutru9qeoi.dll → MindExecution.Plugins.Concept.jiz294lahg.dll} +0 -0
  18. package/wwwroot/_framework/{MindExecution.Plugins.Directory.fqbmq85het.dll → MindExecution.Plugins.Directory.v0qvphgk63.dll} +0 -0
  19. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.ko11cc9pll.dll → MindExecution.Plugins.PlanMaster.mvfl14g6r9.dll} +0 -0
  20. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.mt39q0to2j.dll → MindExecution.Plugins.YouTube.e5ui1py8ia.dll} +0 -0
  21. package/wwwroot/_framework/{MindExecution.Shared.umgls362or.dll → MindExecution.Shared.4pev6youhl.dll} +0 -0
  22. package/wwwroot/_framework/{MindExecution.Web.1dwoarj2hg.dll → MindExecution.Web.vzu3nwlp2r.dll} +0 -0
  23. package/wwwroot/_framework/blazor.boot.json +21 -21
  24. package/wwwroot/service-worker-assets.js +22 -22
  25. package/wwwroot/service-worker.js +1 -1
package/electron/main.cjs CHANGED
@@ -252,6 +252,8 @@ function sendUpdateStatus(status) {
252
252
  appendDesktopLog(
253
253
  `[update] state=${status.state} current=${status.currentVersion || ''} ` +
254
254
  `available=${status.availableVersion || ''} progress=${Math.round(status.progress || 0)} ` +
255
+ `bytes=${Math.round(status.downloadTransferredBytes || 0)}/${Math.round(status.downloadTotalBytes || 0)} ` +
256
+ `speed=${Math.round(status.downloadBytesPerSecond || 0)} ` +
255
257
  `kind=${status.installKind || ''}${status.error ? ` error=${status.error}` : ''}`
256
258
  );
257
259
  if (mainWindow && !mainWindow.isDestroyed() && !mainWindow.webContents.isDestroyed()) {
@@ -304,6 +306,10 @@ function initializeProductUpdates() {
304
306
  });
305
307
  }
306
308
 
309
+ function getDesktopWindowTitle() {
310
+ return `MindExec ${app.getVersion()}`;
311
+ }
312
+
307
313
  function createMainWindow() {
308
314
  const hiddenSmokeMode = process.env.MINDEXEC_DESKTOP_SMOKE === '1';
309
315
  const window = new BrowserWindow({
@@ -314,7 +320,7 @@ function createMainWindow() {
314
320
  show: !hiddenSmokeMode,
315
321
  autoHideMenuBar: true,
316
322
  backgroundColor: '#f8fafc',
317
- title: 'MindExec',
323
+ title: getDesktopWindowTitle(),
318
324
  icon: resolveDesktopIconPath(),
319
325
  webPreferences: {
320
326
  preload: path.join(__dirname, 'preload.cjs'),
@@ -325,6 +331,11 @@ function createMainWindow() {
325
331
  }
326
332
  });
327
333
 
334
+ window.on('page-title-updated', (event) => {
335
+ event.preventDefault();
336
+ window.setTitle(getDesktopWindowTitle());
337
+ });
338
+
328
339
  window.webContents.setWindowOpenHandler(() => ({
329
340
  action: 'allow',
330
341
  overrideBrowserWindowOptions: {
@@ -446,6 +457,7 @@ async function launchDesktop() {
446
457
  appVersion: app.getVersion(),
447
458
  bridgeVersion: status.version || null,
448
459
  runtimeMode: 'bundled',
460
+ windowTitle: window.getTitle(),
449
461
  bridgePort: activeBridgePort,
450
462
  remoteHubPort: activeRemoteHubPort,
451
463
  workspace: activeWorkspace,
@@ -15,7 +15,14 @@ const serverSource = fs.readFileSync(path.join(packageRoot, 'server.js'), 'utf8'
15
15
 
16
16
  assert.equal(packageJson.build?.appId, 'com.mindexec.desktop', 'Stable desktop appId is required.');
17
17
  assert.equal(packageJson.build?.productName, 'MindExec', 'Desktop product name changed unexpectedly.');
18
- assert.match(mainSource, /title:\s*'MindExec'/, 'The Electron window title must use the MindExec app brand.');
18
+ assert.match(mainSource, /function getDesktopWindowTitle\(\)/,
19
+ 'The Electron window title must derive from one version-aware helper.');
20
+ assert.match(mainSource, /`MindExec \$\{app\.getVersion\(\)\}`/,
21
+ 'The Electron window title must show the packaged app version.');
22
+ assert.match(mainSource, /title:\s*getDesktopWindowTitle\(\)/,
23
+ 'The initial Electron window title must use the version-aware title.');
24
+ assert.match(mainSource, /page-title-updated[\s\S]{0,220}preventDefault\(\)[\s\S]{0,220}setTitle\(getDesktopWindowTitle\(\)\)/,
25
+ 'Blazor page titles must not replace the version-aware desktop title.');
19
26
  assert.equal(packageJson.build?.extraMetadata?.main, 'electron/main.cjs', 'Packaged Electron entry point is missing.');
20
27
  assert.equal(packageJson.build?.asar, false, 'Bundled runtime executables require an unpacked app directory.');
21
28
  assert.ok(packageJson.files?.includes('electron/'), 'The npm package must include the Electron source contract.');
@@ -27,6 +34,8 @@ assert.match(packageJson.scripts?.['desktop:publish:update:dev'] || '', /--chann
27
34
  assert.equal(packageJson.dependencies?.['electron-updater'], '^6.8.9', 'The packaged updater dependency is missing.');
28
35
  assert.equal(packageJson.build?.extraMetadata?.desktopUpdateChannel, 'dev', 'Development installers must stay on the dev feed.');
29
36
  assert.equal(packageJson.build?.publish?.provider, 'generic', 'Desktop updates must use the generic R2-backed provider.');
37
+ assert.equal(packageJson.build?.publish?.useMultipleRangeRequest, false,
38
+ 'Packaged differential downloads must use one byte range per request.');
30
39
  assert.equal(
31
40
  packageJson.build?.publish?.url,
32
41
  'https://mindexec.lovecrdm.workers.dev/dev/windows/x64',
@@ -91,6 +100,8 @@ assert.match(preloadSource, /mindExecDesktop/, 'The updater preload namespace ch
91
100
  assert.match(preloadSource, /updates:\s*\{/, 'The updater preload API is missing.');
92
101
  assert.match(updateManagerSource, /autoDownload\s*=\s*false/, 'Updates must not download through an unowned implicit path.');
93
102
  assert.match(updateManagerSource, /autoInstallOnAppQuit\s*=\s*false/, 'Updates must not restart without the explicit prompt path.');
103
+ assert.match(updateManagerSource, /useMultipleRangeRequest:\s*false/,
104
+ 'Differential downloads must use Worker-compatible single byte ranges.');
94
105
  assert.match(updateManagerSource, /quitAndInstall\(true, true\)/, 'Downloaded updates must relaunch silently after approval.');
95
106
  assert.match(updateManagerSource, /desktop-updates-require-installed-windows-app/,
96
107
  'Portable and unpacked builds must fail closed instead of replacing themselves.');
@@ -31,7 +31,12 @@ class FakeUpdater extends EventEmitter {
31
31
 
32
32
  async downloadUpdate() {
33
33
  this.downloadCalls += 1;
34
- this.emit('download-progress', { percent: 42 });
34
+ this.emit('download-progress', {
35
+ percent: 42,
36
+ total: 2_737_300,
37
+ transferred: 1_149_666,
38
+ bytesPerSecond: 5_000_000
39
+ });
35
40
  await new Promise(resolve => setTimeout(resolve, 5));
36
41
  this.emit('update-downloaded', { version: '1.1.0' });
37
42
  }
@@ -79,7 +84,14 @@ test('concurrent checks share one version request and one download', async () =>
79
84
  assert.equal(second.state, 'downloaded');
80
85
  assert.equal(updater.checkCalls, 1);
81
86
  assert.equal(updater.downloadCalls, 1);
82
- assert.deepEqual(updater.feed, { provider: 'generic', url: 'https://updates.example/dev/windows/x64' });
87
+ assert.deepEqual(updater.feed, {
88
+ provider: 'generic',
89
+ url: 'https://updates.example/dev/windows/x64',
90
+ useMultipleRangeRequest: false
91
+ });
92
+ assert.equal(first.downloadTotalBytes, 2_737_300);
93
+ assert.equal(first.downloadTransferredBytes, 1_149_666);
94
+ assert.equal(first.downloadBytesPerSecond, 5_000_000);
83
95
  });
84
96
 
85
97
  test('portable and unpacked executables never call electron-updater', async () => {
@@ -49,6 +49,9 @@ function createProductUpdateManager({
49
49
  availableVersion: '',
50
50
  downloaded: false,
51
51
  progress: 0,
52
+ downloadTotalBytes: 0,
53
+ downloadTransferredBytes: 0,
54
+ downloadBytesPerSecond: 0,
52
55
  error: '',
53
56
  configured: feed.configured,
54
57
  feedUrl: feed.url,
@@ -89,7 +92,13 @@ function createProductUpdateManager({
89
92
 
90
93
  updater.autoDownload = false;
91
94
  updater.autoInstallOnAppQuit = false;
92
- if (feed.url) updater.setFeedURL({ provider: 'generic', url: feed.url });
95
+ if (feed.url) {
96
+ updater.setFeedURL({
97
+ provider: 'generic',
98
+ url: feed.url,
99
+ useMultipleRangeRequest: false
100
+ });
101
+ }
93
102
 
94
103
  updater.on('checking-for-update', () => {
95
104
  checkOutcome = 'checking';
@@ -102,15 +111,34 @@ function createProductUpdateManager({
102
111
  availableVersion: String(info?.version || ''),
103
112
  downloaded: false,
104
113
  progress: 0,
114
+ downloadTotalBytes: 0,
115
+ downloadTransferredBytes: 0,
116
+ downloadBytesPerSecond: 0,
105
117
  error: ''
106
118
  });
107
119
  });
108
120
  updater.on('update-not-available', () => {
109
121
  checkOutcome = 'current';
110
- publish({ state: 'current', availableVersion: '', downloaded: false, progress: 0, error: '' });
122
+ publish({
123
+ state: 'current',
124
+ availableVersion: '',
125
+ downloaded: false,
126
+ progress: 0,
127
+ downloadTotalBytes: 0,
128
+ downloadTransferredBytes: 0,
129
+ downloadBytesPerSecond: 0,
130
+ error: ''
131
+ });
111
132
  });
112
133
  updater.on('download-progress', progress => {
113
- publish({ state: 'downloading', progress: Number(progress?.percent || 0), error: '' });
134
+ publish({
135
+ state: 'downloading',
136
+ progress: Number(progress?.percent || 0),
137
+ downloadTotalBytes: Number(progress?.total || 0),
138
+ downloadTransferredBytes: Number(progress?.transferred || 0),
139
+ downloadBytesPerSecond: Number(progress?.bytesPerSecond || 0),
140
+ error: ''
141
+ });
114
142
  });
115
143
  updater.on('update-downloaded', info => {
116
144
  publish({
@@ -126,6 +126,8 @@ try {
126
126
  assert.equal(result.appVersion, packageJson.version, 'Electron app version does not match the npm package version.');
127
127
  assert.equal(result.bridgeVersion, packageJson.version, 'Bundled LocalBridge version does not match Electron.');
128
128
  assert.equal(result.runtimeMode, 'bundled', 'Electron did not use its bundled runtime.');
129
+ assert.equal(result.windowTitle, `MindExec ${packageJson.version}`,
130
+ 'Packaged Electron did not keep the version visible in the title bar.');
129
131
  assert.equal(result.bridgePort, bridgePort, 'Packaged shell did not use the requested Bridge port.');
130
132
  assert.equal(result.remoteHubPort, remoteHubPort, 'Packaged shell did not use the requested RemoteHub port.');
131
133
  assert.equal(path.resolve(result.workspace), path.resolve(workspace), 'Packaged Electron did not restore the saved workspace.');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.480",
3
+ "version": "0.2.482",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -160,9 +160,10 @@
160
160
  "portable": {
161
161
  "artifactName": "MindExec-Portable-${version}-${arch}.${ext}"
162
162
  },
163
- "publish": {
164
- "provider": "generic",
165
- "url": "https://mindexec.lovecrdm.workers.dev/dev/windows/x64"
166
- }
163
+ "publish": {
164
+ "provider": "generic",
165
+ "url": "https://mindexec.lovecrdm.workers.dev/dev/windows/x64",
166
+ "useMultipleRangeRequest": false
167
+ }
167
168
  }
168
169
  }
@@ -54,6 +54,17 @@ test('publisher validates version, size, and SHA-512 before upload', async () =>
54
54
  }),
55
55
  /desktop-update-dev-unsigned-ack-required/
56
56
  );
57
+ assert.throws(
58
+ () => readReleasePlan({
59
+ platform: 'windows-x64',
60
+ directory,
61
+ packageVersion: '1.2.3',
62
+ channel: 'dev',
63
+ allowUnsigned: true
64
+ }),
65
+ /desktop-update-blockmap-missing/
66
+ );
67
+ await writeFile(join(directory, `${artifact}.blockmap`), Buffer.from('blockmap'));
57
68
  const plan = readReleasePlan({
58
69
  platform: 'windows-x64',
59
70
  directory,
@@ -62,7 +73,7 @@ test('publisher validates version, size, and SHA-512 before upload', async () =>
62
73
  allowUnsigned: true
63
74
  });
64
75
  assert.equal(plan.prefix, 'dev/windows/x64');
65
- assert.deepEqual(plan.artifacts.map(item => item.fileName), [artifact]);
76
+ assert.deepEqual(plan.artifacts.map(item => item.fileName), [artifact, `${artifact}.blockmap`]);
66
77
  assert.throws(
67
78
  () => readReleasePlan({
68
79
  platform: 'windows-x64',
@@ -70,3 +70,98 @@ test('worker preserves resumable byte-range responses for large installers', asy
70
70
  assert.equal(response.headers.get('content-range'), 'bytes 8-11/20');
71
71
  assert.equal(response.headers.get('content-length'), '4');
72
72
  });
73
+
74
+ test('worker serves electron-updater multi-range requests as multipart without returning the full installer', async () => {
75
+ const source = new TextEncoder().encode('0123456789abcdefghij');
76
+ const calls = [];
77
+ const env = {
78
+ UPDATE_BUCKET: {
79
+ head: async () => ({
80
+ size: source.byteLength,
81
+ httpEtag: '"release-etag"',
82
+ writeHttpMetadata(headers) { headers.set('content-type', 'application/octet-stream'); }
83
+ }),
84
+ get: async (_key, options) => {
85
+ calls.push(options.range);
86
+ const { offset, length } = options.range;
87
+ const bytes = source.slice(offset, offset + length);
88
+ return {
89
+ body: new ReadableStream({ start(controller) { controller.enqueue(bytes); controller.close(); } }),
90
+ size: source.byteLength,
91
+ range: { offset, length },
92
+ httpEtag: '"release-etag"',
93
+ writeHttpMetadata(headers) { headers.set('content-type', 'application/octet-stream'); }
94
+ };
95
+ }
96
+ }
97
+ };
98
+
99
+ const response = await worker.fetch(new Request(
100
+ 'https://updates.example/dev/windows/x64/MindExec-0.2.461-dev-x64.exe',
101
+ { headers: { range: 'bytes=0-3,10-13' } }
102
+ ), env);
103
+ const body = await response.text();
104
+
105
+ assert.equal(response.status, 206);
106
+ assert.match(response.headers.get('content-type') || '', /^multipart\/byteranges; boundary=/i);
107
+ assert.equal(response.headers.has('content-range'), false);
108
+ assert.deepEqual(calls, [{ offset: 0, length: 4 }, { offset: 10, length: 4 }]);
109
+ assert.match(body, /Content-Range: bytes 0-3\/20\r\n\r\n0123/);
110
+ assert.match(body, /Content-Range: bytes 10-13\/20\r\n\r\nabcd/);
111
+ assert.equal(new TextEncoder().encode(body).byteLength, Number(response.headers.get('content-length')));
112
+ assert.ok(Number(response.headers.get('content-length')) < source.byteLength * 20,
113
+ 'multi-range response must contain only requested parts, not the full installer');
114
+ });
115
+
116
+ test('worker rejects oversized or overlapping multi-range requests before reading R2', async () => {
117
+ let getCount = 0;
118
+ const metadata = {
119
+ size: 100_000_000,
120
+ httpEtag: '"release-etag"',
121
+ writeHttpMetadata(headers) { headers.set('content-type', 'application/octet-stream'); }
122
+ };
123
+ const env = {
124
+ UPDATE_BUCKET: {
125
+ head: async () => metadata,
126
+ get: async () => { getCount += 1; return null; }
127
+ }
128
+ };
129
+
130
+ const oversized = await worker.fetch(new Request(
131
+ 'https://updates.example/dev/windows/x64/MindExec-0.2.461-dev-x64.exe',
132
+ { headers: { range: 'bytes=0-33554431,33554432-67108864' } }
133
+ ), env);
134
+ assert.equal(oversized.status, 416);
135
+
136
+ const overlapping = await worker.fetch(new Request(
137
+ 'https://updates.example/dev/windows/x64/MindExec-0.2.461-dev-x64.exe',
138
+ { headers: { range: 'bytes=0-10,10-20' } }
139
+ ), env);
140
+ assert.equal(overlapping.status, 416);
141
+ assert.equal(getCount, 0);
142
+ });
143
+
144
+ test('worker fails closed when R2 does not honor an explicit multipart range', async () => {
145
+ const source = new TextEncoder().encode('0123456789abcdefghij');
146
+ const metadata = {
147
+ size: source.byteLength,
148
+ httpEtag: '"release-etag"',
149
+ writeHttpMetadata(headers) { headers.set('content-type', 'application/octet-stream'); }
150
+ };
151
+ const env = {
152
+ UPDATE_BUCKET: {
153
+ head: async () => metadata,
154
+ get: async () => ({
155
+ ...metadata,
156
+ range: { offset: 0, length: source.byteLength },
157
+ body: new ReadableStream({ start(controller) { controller.enqueue(source); controller.close(); } })
158
+ })
159
+ }
160
+ };
161
+
162
+ const response = await worker.fetch(new Request(
163
+ 'https://updates.example/dev/windows/x64/MindExec-0.2.461-dev-x64.exe',
164
+ { headers: { range: 'bytes=0-3,10-13' } }
165
+ ), env);
166
+ await assert.rejects(response.arrayBuffer(), /desktop-update-range-mismatch:0-3/);
167
+ });
@@ -100,6 +100,12 @@ export function readReleasePlan({
100
100
  if (sha512Base64(filePath) !== item.sha512) {
101
101
  throw new Error(`desktop-update-artifact-hash-mismatch:${item.name}`);
102
102
  }
103
+ if (/\.exe$/i.test(item.name)) {
104
+ const blockmapName = `${item.name}.blockmap`;
105
+ if (!existsSync(resolve(releaseDir, blockmapName))) {
106
+ throw new Error(`desktop-update-blockmap-missing:${blockmapName}`);
107
+ }
108
+ }
103
109
  }
104
110
 
105
111
  const artifacts = readdirSync(releaseDir)
@@ -164,15 +170,17 @@ async function verifyPublished(plan) {
164
170
  throw new Error('desktop-update-public-manifest-mismatch');
165
171
  }
166
172
 
167
- for (const item of plan.manifest.files) {
168
- const artifactResponse = await fetch(`${PUBLIC_BASE_URL}/${plan.prefix}/${encodeURIComponent(item.name)}`, {
173
+ for (const artifact of plan.artifacts) {
174
+ const artifactResponse = await fetch(`${PUBLIC_BASE_URL}/${plan.prefix}/${encodeURIComponent(artifact.fileName)}`, {
169
175
  method: 'HEAD',
170
176
  cache: 'no-store'
171
177
  });
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;
178
+ if (!artifactResponse.ok) {
179
+ throw new Error(`desktop-update-public-artifact-http-${artifactResponse.status}:${artifact.fileName}`);
180
+ }
181
+ const expectedSize = statSync(artifact.filePath).size;
174
182
  if (Number(artifactResponse.headers.get('content-length') || 0) !== expectedSize) {
175
- throw new Error(`desktop-update-public-artifact-size-mismatch:${item.name}`);
183
+ throw new Error(`desktop-update-public-artifact-size-mismatch:${artifact.fileName}`);
176
184
  }
177
185
  }
178
186
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-jT43NukKzDoxPR0xiGKnPjhtM25bVYBByoVgcizn6mE=",
4
+ "hash": "sha256-G3h1Bw32VT2isfx70lg1F1v94ewdn/kwAWOD4zpsU0U=",
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.wflwsce1yq.dll": "System.Private.CoreLib.dll",
125
- "MindExecution.Core.gnj3fo0pr7.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.1qygzf8o02.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.n3uxh144wo.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.vl5dximn25.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.rutru9qeoi.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.fqbmq85het.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.ko11cc9pll.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.mt39q0to2j.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.umgls362or.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.1dwoarj2hg.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.l639gk1bj0.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.dhkjql36qa.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.sdnqjd3bhw.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.dntgcr4fyr.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.jiz294lahg.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.v0qvphgk63.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.mvfl14g6r9.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.e5ui1py8ia.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.4pev6youhl.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.vzu3nwlp2r.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.gnj3fo0pr7.dll": "sha256-PJWd6kWngV5ePF8lxsb40O0lfO2YodlKC3EJ0k8mpQk=",
280
- "MindExecution.Kernel.1qygzf8o02.dll": "sha256-N818Vn+nKC7+a8YwYy15b9JomNxC4biKSktO4Oj/z/Q=",
281
- "MindExecution.Plugins.Business.vl5dximn25.dll": "sha256-o8YvDTE40NViW+DLVdSSE9z1VHEI3swdFp7tVSba6e8=",
282
- "MindExecution.Plugins.Concept.rutru9qeoi.dll": "sha256-45HTazw8VflosL3GP1CmV/SMftV6I38C3AKvlqbraDQ=",
283
- "MindExecution.Plugins.PlanMaster.ko11cc9pll.dll": "sha256-PDWnqf6LQECXx9n9dizUP7NrCUxQJZF4QKFvEV5+GrM=",
284
- "MindExecution.Shared.umgls362or.dll": "sha256-ilA4JsOjKGWl4LEcTNpZJessvEhE7qrdgqiaeh7wUWU=",
285
- "MindExecution.Web.1dwoarj2hg.dll": "sha256-1f+8amDPhJ8WeAGfC1YyLLAGzNAdegx1MNs+g3z0Mrc="
279
+ "MindExecution.Core.l639gk1bj0.dll": "sha256-o9dLvKGmstXiu50XUmRpwwsv/y81aA/NGRnKJy/1mks=",
280
+ "MindExecution.Kernel.dhkjql36qa.dll": "sha256-cWxc5rwjR4RYwAhGrlp5vxEiT7qneX2jrUTLWjL37CY=",
281
+ "MindExecution.Plugins.Business.dntgcr4fyr.dll": "sha256-GdIOYT2OuYdKorFOcfSWztPr8NIXddBdSj2kDJGORQw=",
282
+ "MindExecution.Plugins.Concept.jiz294lahg.dll": "sha256-SymfLnM0iJss9UJY7xGZXwfVzzl2NvfpKrrIVhmpW2I=",
283
+ "MindExecution.Plugins.PlanMaster.mvfl14g6r9.dll": "sha256-ovRoi3461C9eaSGfnBsDjS4EZKOZVhw3fLC7RELZUPU=",
284
+ "MindExecution.Shared.4pev6youhl.dll": "sha256-KOoTEe4T+zZNRFKjb8sO4/v/Q0X/ZQ8riPIs+8Nomak=",
285
+ "MindExecution.Web.vzu3nwlp2r.dll": "sha256-VblMDl0VAUvXDfnNtQPlWo00If/P1WCx7Bo7y2+prrQ="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.n3uxh144wo.dll": "sha256-o6sbCeok9vUsq2sBF5BOyXX7Cu1bU+VqmVgdp6QeKUA=",
289
- "MindExecution.Plugins.Directory.fqbmq85het.dll": "sha256-GRERnRnH2uqlPlZRgPGq32Kh/fXEV8AfxUcIzqrk658=",
290
- "MindExecution.Plugins.YouTube.mt39q0to2j.dll": "sha256-Zlq2mr9Ovi3zfKlt0Yyk4YAsOAOtXWNv2CJnHR0+YN4="
288
+ "MindExecution.Plugins.Admin.sdnqjd3bhw.dll": "sha256-4C8f3TLtj/VLuY9CpNvtPkWw5VtZl5ZnDe+Xq4d9LTU=",
289
+ "MindExecution.Plugins.Directory.v0qvphgk63.dll": "sha256-fzKMUnP4AFBBYkFh1IuhGyl7KMMkmCGKqlnPu4QBWUs=",
290
+ "MindExecution.Plugins.YouTube.e5ui1py8ia.dll": "sha256-Ii4ds8rpDHBAXVQKrb3AATbtF0MfTw51Iqu44nzVBx0="
291
291
  }
292
292
  },
293
293
  "cacheBootResources": true,
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "PGNukwfc",
2
+ "version": "tcfcurmf",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -446,44 +446,44 @@ self.assetsManifest = {
446
446
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-PJWd6kWngV5ePF8lxsb40O0lfO2YodlKC3EJ0k8mpQk=",
450
- "url": "_framework/MindExecution.Core.gnj3fo0pr7.dll"
449
+ "hash": "sha256-o9dLvKGmstXiu50XUmRpwwsv/y81aA/NGRnKJy/1mks=",
450
+ "url": "_framework/MindExecution.Core.l639gk1bj0.dll"
451
451
  },
452
452
  {
453
- "hash": "sha256-N818Vn+nKC7+a8YwYy15b9JomNxC4biKSktO4Oj/z/Q=",
454
- "url": "_framework/MindExecution.Kernel.1qygzf8o02.dll"
453
+ "hash": "sha256-cWxc5rwjR4RYwAhGrlp5vxEiT7qneX2jrUTLWjL37CY=",
454
+ "url": "_framework/MindExecution.Kernel.dhkjql36qa.dll"
455
455
  },
456
456
  {
457
- "hash": "sha256-o6sbCeok9vUsq2sBF5BOyXX7Cu1bU+VqmVgdp6QeKUA=",
458
- "url": "_framework/MindExecution.Plugins.Admin.n3uxh144wo.dll"
457
+ "hash": "sha256-4C8f3TLtj/VLuY9CpNvtPkWw5VtZl5ZnDe+Xq4d9LTU=",
458
+ "url": "_framework/MindExecution.Plugins.Admin.sdnqjd3bhw.dll"
459
459
  },
460
460
  {
461
- "hash": "sha256-o8YvDTE40NViW+DLVdSSE9z1VHEI3swdFp7tVSba6e8=",
462
- "url": "_framework/MindExecution.Plugins.Business.vl5dximn25.dll"
461
+ "hash": "sha256-GdIOYT2OuYdKorFOcfSWztPr8NIXddBdSj2kDJGORQw=",
462
+ "url": "_framework/MindExecution.Plugins.Business.dntgcr4fyr.dll"
463
463
  },
464
464
  {
465
- "hash": "sha256-45HTazw8VflosL3GP1CmV/SMftV6I38C3AKvlqbraDQ=",
466
- "url": "_framework/MindExecution.Plugins.Concept.rutru9qeoi.dll"
465
+ "hash": "sha256-SymfLnM0iJss9UJY7xGZXwfVzzl2NvfpKrrIVhmpW2I=",
466
+ "url": "_framework/MindExecution.Plugins.Concept.jiz294lahg.dll"
467
467
  },
468
468
  {
469
- "hash": "sha256-GRERnRnH2uqlPlZRgPGq32Kh/fXEV8AfxUcIzqrk658=",
470
- "url": "_framework/MindExecution.Plugins.Directory.fqbmq85het.dll"
469
+ "hash": "sha256-fzKMUnP4AFBBYkFh1IuhGyl7KMMkmCGKqlnPu4QBWUs=",
470
+ "url": "_framework/MindExecution.Plugins.Directory.v0qvphgk63.dll"
471
471
  },
472
472
  {
473
- "hash": "sha256-PDWnqf6LQECXx9n9dizUP7NrCUxQJZF4QKFvEV5+GrM=",
474
- "url": "_framework/MindExecution.Plugins.PlanMaster.ko11cc9pll.dll"
473
+ "hash": "sha256-ovRoi3461C9eaSGfnBsDjS4EZKOZVhw3fLC7RELZUPU=",
474
+ "url": "_framework/MindExecution.Plugins.PlanMaster.mvfl14g6r9.dll"
475
475
  },
476
476
  {
477
- "hash": "sha256-Zlq2mr9Ovi3zfKlt0Yyk4YAsOAOtXWNv2CJnHR0+YN4=",
478
- "url": "_framework/MindExecution.Plugins.YouTube.mt39q0to2j.dll"
477
+ "hash": "sha256-Ii4ds8rpDHBAXVQKrb3AATbtF0MfTw51Iqu44nzVBx0=",
478
+ "url": "_framework/MindExecution.Plugins.YouTube.e5ui1py8ia.dll"
479
479
  },
480
480
  {
481
- "hash": "sha256-ilA4JsOjKGWl4LEcTNpZJessvEhE7qrdgqiaeh7wUWU=",
482
- "url": "_framework/MindExecution.Shared.umgls362or.dll"
481
+ "hash": "sha256-KOoTEe4T+zZNRFKjb8sO4/v/Q0X/ZQ8riPIs+8Nomak=",
482
+ "url": "_framework/MindExecution.Shared.4pev6youhl.dll"
483
483
  },
484
484
  {
485
- "hash": "sha256-1f+8amDPhJ8WeAGfC1YyLLAGzNAdegx1MNs+g3z0Mrc=",
486
- "url": "_framework/MindExecution.Web.1dwoarj2hg.dll"
485
+ "hash": "sha256-VblMDl0VAUvXDfnNtQPlWo00If/P1WCx7Bo7y2+prrQ=",
486
+ "url": "_framework/MindExecution.Web.vzu3nwlp2r.dll"
487
487
  },
488
488
  {
489
489
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -802,7 +802,7 @@ self.assetsManifest = {
802
802
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
803
803
  },
804
804
  {
805
- "hash": "sha256-NjZb6e2bY9Xxv1DCI8Jd7uu4z96vjBBux8Cd1jo95JA=",
805
+ "hash": "sha256-00g6lZAcB0GYDBhxl4x36IRIi/jFnPu33Z7RB0uqomA=",
806
806
  "url": "_framework/blazor.boot.json"
807
807
  },
808
808
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: PGNukwfc */
1
+ /* Manifest version: tcfcurmf */
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