@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.
- package/electron/main.cjs +13 -1
- package/electron/source-smoke.mjs +12 -1
- package/electron/update-manager-smoke.mjs +14 -2
- package/electron/update-manager.cjs +31 -3
- package/electron/windows-package-smoke.mjs +2 -0
- package/package.json +6 -5
- package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
- package/scripts/desktop-update-publisher-smoke.mjs +12 -1
- package/scripts/desktop-update-worker-smoke.mjs +95 -0
- package/scripts/publish-mindexec-desktop-updates.mjs +13 -5
- package/wwwroot/_framework/{MindExecution.Core.gnj3fo0pr7.dll → MindExecution.Core.l639gk1bj0.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Kernel.1qygzf8o02.dll → MindExecution.Kernel.dhkjql36qa.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Admin.n3uxh144wo.dll → MindExecution.Plugins.Admin.sdnqjd3bhw.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Business.vl5dximn25.dll → MindExecution.Plugins.Business.dntgcr4fyr.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Concept.rutru9qeoi.dll → MindExecution.Plugins.Concept.jiz294lahg.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Directory.fqbmq85het.dll → MindExecution.Plugins.Directory.v0qvphgk63.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.ko11cc9pll.dll → MindExecution.Plugins.PlanMaster.mvfl14g6r9.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.YouTube.mt39q0to2j.dll → MindExecution.Plugins.YouTube.e5ui1py8ia.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Shared.umgls362or.dll → MindExecution.Shared.4pev6youhl.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Web.1dwoarj2hg.dll → MindExecution.Web.vzu3nwlp2r.dll} +0 -0
- package/wwwroot/_framework/blazor.boot.json +21 -21
- package/wwwroot/service-worker-assets.js +22 -22
- 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:
|
|
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, /
|
|
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', {
|
|
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, {
|
|
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)
|
|
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({
|
|
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({
|
|
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.
|
|
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
|
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
|
168
|
-
const artifactResponse = await fetch(`${PUBLIC_BASE_URL}/${plan.prefix}/${encodeURIComponent(
|
|
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)
|
|
173
|
-
|
|
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:${
|
|
183
|
+
throw new Error(`desktop-update-public-artifact-size-mismatch:${artifact.fileName}`);
|
|
176
184
|
}
|
|
177
185
|
}
|
|
178
186
|
}
|
package/wwwroot/_framework/{MindExecution.Core.gnj3fo0pr7.dll → MindExecution.Core.l639gk1bj0.dll}
RENAMED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/wwwroot/_framework/{MindExecution.Web.1dwoarj2hg.dll → MindExecution.Web.vzu3nwlp2r.dll}
RENAMED
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mainAssemblyName": "MindExecution.Web",
|
|
3
3
|
"resources": {
|
|
4
|
-
"hash": "sha256-
|
|
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.
|
|
126
|
-
"MindExecution.Kernel.
|
|
127
|
-
"MindExecution.Plugins.Admin.
|
|
128
|
-
"MindExecution.Plugins.Business.
|
|
129
|
-
"MindExecution.Plugins.Concept.
|
|
130
|
-
"MindExecution.Plugins.Directory.
|
|
131
|
-
"MindExecution.Plugins.PlanMaster.
|
|
132
|
-
"MindExecution.Plugins.YouTube.
|
|
133
|
-
"MindExecution.Shared.
|
|
134
|
-
"MindExecution.Web.
|
|
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.
|
|
280
|
-
"MindExecution.Kernel.
|
|
281
|
-
"MindExecution.Plugins.Business.
|
|
282
|
-
"MindExecution.Plugins.Concept.
|
|
283
|
-
"MindExecution.Plugins.PlanMaster.
|
|
284
|
-
"MindExecution.Shared.
|
|
285
|
-
"MindExecution.Web.
|
|
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.
|
|
289
|
-
"MindExecution.Plugins.Directory.
|
|
290
|
-
"MindExecution.Plugins.YouTube.
|
|
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": "
|
|
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-
|
|
450
|
-
"url": "_framework/MindExecution.Core.
|
|
449
|
+
"hash": "sha256-o9dLvKGmstXiu50XUmRpwwsv/y81aA/NGRnKJy/1mks=",
|
|
450
|
+
"url": "_framework/MindExecution.Core.l639gk1bj0.dll"
|
|
451
451
|
},
|
|
452
452
|
{
|
|
453
|
-
"hash": "sha256-
|
|
454
|
-
"url": "_framework/MindExecution.Kernel.
|
|
453
|
+
"hash": "sha256-cWxc5rwjR4RYwAhGrlp5vxEiT7qneX2jrUTLWjL37CY=",
|
|
454
|
+
"url": "_framework/MindExecution.Kernel.dhkjql36qa.dll"
|
|
455
455
|
},
|
|
456
456
|
{
|
|
457
|
-
"hash": "sha256-
|
|
458
|
-
"url": "_framework/MindExecution.Plugins.Admin.
|
|
457
|
+
"hash": "sha256-4C8f3TLtj/VLuY9CpNvtPkWw5VtZl5ZnDe+Xq4d9LTU=",
|
|
458
|
+
"url": "_framework/MindExecution.Plugins.Admin.sdnqjd3bhw.dll"
|
|
459
459
|
},
|
|
460
460
|
{
|
|
461
|
-
"hash": "sha256-
|
|
462
|
-
"url": "_framework/MindExecution.Plugins.Business.
|
|
461
|
+
"hash": "sha256-GdIOYT2OuYdKorFOcfSWztPr8NIXddBdSj2kDJGORQw=",
|
|
462
|
+
"url": "_framework/MindExecution.Plugins.Business.dntgcr4fyr.dll"
|
|
463
463
|
},
|
|
464
464
|
{
|
|
465
|
-
"hash": "sha256-
|
|
466
|
-
"url": "_framework/MindExecution.Plugins.Concept.
|
|
465
|
+
"hash": "sha256-SymfLnM0iJss9UJY7xGZXwfVzzl2NvfpKrrIVhmpW2I=",
|
|
466
|
+
"url": "_framework/MindExecution.Plugins.Concept.jiz294lahg.dll"
|
|
467
467
|
},
|
|
468
468
|
{
|
|
469
|
-
"hash": "sha256-
|
|
470
|
-
"url": "_framework/MindExecution.Plugins.Directory.
|
|
469
|
+
"hash": "sha256-fzKMUnP4AFBBYkFh1IuhGyl7KMMkmCGKqlnPu4QBWUs=",
|
|
470
|
+
"url": "_framework/MindExecution.Plugins.Directory.v0qvphgk63.dll"
|
|
471
471
|
},
|
|
472
472
|
{
|
|
473
|
-
"hash": "sha256-
|
|
474
|
-
"url": "_framework/MindExecution.Plugins.PlanMaster.
|
|
473
|
+
"hash": "sha256-ovRoi3461C9eaSGfnBsDjS4EZKOZVhw3fLC7RELZUPU=",
|
|
474
|
+
"url": "_framework/MindExecution.Plugins.PlanMaster.mvfl14g6r9.dll"
|
|
475
475
|
},
|
|
476
476
|
{
|
|
477
|
-
"hash": "sha256-
|
|
478
|
-
"url": "_framework/MindExecution.Plugins.YouTube.
|
|
477
|
+
"hash": "sha256-Ii4ds8rpDHBAXVQKrb3AATbtF0MfTw51Iqu44nzVBx0=",
|
|
478
|
+
"url": "_framework/MindExecution.Plugins.YouTube.e5ui1py8ia.dll"
|
|
479
479
|
},
|
|
480
480
|
{
|
|
481
|
-
"hash": "sha256-
|
|
482
|
-
"url": "_framework/MindExecution.Shared.
|
|
481
|
+
"hash": "sha256-KOoTEe4T+zZNRFKjb8sO4/v/Q0X/ZQ8riPIs+8Nomak=",
|
|
482
|
+
"url": "_framework/MindExecution.Shared.4pev6youhl.dll"
|
|
483
483
|
},
|
|
484
484
|
{
|
|
485
|
-
"hash": "sha256-
|
|
486
|
-
"url": "_framework/MindExecution.Web.
|
|
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-
|
|
805
|
+
"hash": "sha256-00g6lZAcB0GYDBhxl4x36IRIi/jFnPu33Z7RB0uqomA=",
|
|
806
806
|
"url": "_framework/blazor.boot.json"
|
|
807
807
|
},
|
|
808
808
|
{
|