@namzu/sandbox 24.0.0 → 25.0.0
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/CHANGELOG.md +274 -0
- package/dist/backends/http-worker-client.d.ts +3 -1
- package/dist/backends/http-worker-client.d.ts.map +1 -1
- package/dist/backends/http-worker-client.js +15 -4
- package/dist/backends/http-worker-client.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/local-virtual-computer/client.d.ts +21 -0
- package/dist/local-virtual-computer/client.d.ts.map +1 -0
- package/dist/local-virtual-computer/client.js +503 -0
- package/dist/local-virtual-computer/client.js.map +1 -0
- package/dist/local-virtual-computer/detached-process.d.ts +15 -0
- package/dist/local-virtual-computer/detached-process.d.ts.map +1 -0
- package/dist/local-virtual-computer/detached-process.js +111 -0
- package/dist/local-virtual-computer/detached-process.js.map +1 -0
- package/dist/local-virtual-computer/detached-worker.d.ts +11 -0
- package/dist/local-virtual-computer/detached-worker.d.ts.map +1 -0
- package/dist/local-virtual-computer/detached-worker.js +97 -0
- package/dist/local-virtual-computer/detached-worker.js.map +1 -0
- package/dist/local-virtual-computer/dialect.d.ts +26 -0
- package/dist/local-virtual-computer/dialect.d.ts.map +1 -0
- package/dist/local-virtual-computer/dialect.js +61 -0
- package/dist/local-virtual-computer/dialect.js.map +1 -0
- package/dist/local-virtual-computer/engine.d.ts +63 -0
- package/dist/local-virtual-computer/engine.d.ts.map +1 -0
- package/dist/local-virtual-computer/engine.js +125 -0
- package/dist/local-virtual-computer/engine.js.map +1 -0
- package/dist/local-virtual-computer/guest-stdio.d.ts +15 -0
- package/dist/local-virtual-computer/guest-stdio.d.ts.map +1 -0
- package/dist/local-virtual-computer/guest-stdio.js +330 -0
- package/dist/local-virtual-computer/guest-stdio.js.map +1 -0
- package/dist/local-virtual-computer/index.d.ts +36 -0
- package/dist/local-virtual-computer/index.d.ts.map +1 -0
- package/dist/local-virtual-computer/index.js +341 -0
- package/dist/local-virtual-computer/index.js.map +1 -0
- package/dist/local-virtual-computer/podman-machine.d.ts +17 -0
- package/dist/local-virtual-computer/podman-machine.d.ts.map +1 -0
- package/dist/local-virtual-computer/podman-machine.js +181 -0
- package/dist/local-virtual-computer/podman-machine.js.map +1 -0
- package/dist/local-virtual-computer/setup/contract.d.ts +360 -0
- package/dist/local-virtual-computer/setup/contract.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/contract.js +3 -0
- package/dist/local-virtual-computer/setup/contract.js.map +1 -0
- package/dist/local-virtual-computer/setup/elevated.d.ts +78 -0
- package/dist/local-virtual-computer/setup/elevated.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/elevated.js +548 -0
- package/dist/local-virtual-computer/setup/elevated.js.map +1 -0
- package/dist/local-virtual-computer/setup/host.d.ts +12 -0
- package/dist/local-virtual-computer/setup/host.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/host.js +93 -0
- package/dist/local-virtual-computer/setup/host.js.map +1 -0
- package/dist/local-virtual-computer/setup/idle.d.ts +18 -0
- package/dist/local-virtual-computer/setup/idle.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/idle.js +38 -0
- package/dist/local-virtual-computer/setup/idle.js.map +1 -0
- package/dist/local-virtual-computer/setup/image.d.ts +7 -0
- package/dist/local-virtual-computer/setup/image.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/image.js +124 -0
- package/dist/local-virtual-computer/setup/image.js.map +1 -0
- package/dist/local-virtual-computer/setup/index.d.ts +17 -0
- package/dist/local-virtual-computer/setup/index.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/index.js +17 -0
- package/dist/local-virtual-computer/setup/index.js.map +1 -0
- package/dist/local-virtual-computer/setup/limits.d.ts +30 -0
- package/dist/local-virtual-computer/setup/limits.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/limits.js +58 -0
- package/dist/local-virtual-computer/setup/limits.js.map +1 -0
- package/dist/local-virtual-computer/setup/plan.d.ts +8 -0
- package/dist/local-virtual-computer/setup/plan.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/plan.js +131 -0
- package/dist/local-virtual-computer/setup/plan.js.map +1 -0
- package/dist/local-virtual-computer/setup/readiness.d.ts +11 -0
- package/dist/local-virtual-computer/setup/readiness.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/readiness.js +320 -0
- package/dist/local-virtual-computer/setup/readiness.js.map +1 -0
- package/dist/local-virtual-computer/setup/registry.d.ts +18 -0
- package/dist/local-virtual-computer/setup/registry.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/registry.js +50 -0
- package/dist/local-virtual-computer/setup/registry.js.map +1 -0
- package/dist/local-virtual-computer/setup/restart.d.ts +8 -0
- package/dist/local-virtual-computer/setup/restart.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/restart.js +60 -0
- package/dist/local-virtual-computer/setup/restart.js.map +1 -0
- package/dist/local-virtual-computer/setup/resume.d.ts +14 -0
- package/dist/local-virtual-computer/setup/resume.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/resume.js +58 -0
- package/dist/local-virtual-computer/setup/resume.js.map +1 -0
- package/dist/local-virtual-computer/setup/run.d.ts +8 -0
- package/dist/local-virtual-computer/setup/run.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/run.js +200 -0
- package/dist/local-virtual-computer/setup/run.js.map +1 -0
- package/dist/local-virtual-computer/setup/windows-folder.d.ts +11 -0
- package/dist/local-virtual-computer/setup/windows-folder.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/windows-folder.js +14 -0
- package/dist/local-virtual-computer/setup/windows-folder.js.map +1 -0
- package/dist/local-virtual-computer/setup/wsl-package.d.ts +19 -0
- package/dist/local-virtual-computer/setup/wsl-package.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/wsl-package.js +242 -0
- package/dist/local-virtual-computer/setup/wsl-package.js.map +1 -0
- package/dist/local-virtual-computer/setup/wslc-shared.d.ts +27 -0
- package/dist/local-virtual-computer/setup/wslc-shared.d.ts.map +1 -0
- package/dist/local-virtual-computer/setup/wslc-shared.js +137 -0
- package/dist/local-virtual-computer/setup/wslc-shared.js.map +1 -0
- package/dist/local-virtual-computer/ssh-forward.d.ts +19 -0
- package/dist/local-virtual-computer/ssh-forward.d.ts.map +1 -0
- package/dist/local-virtual-computer/ssh-forward.js +179 -0
- package/dist/local-virtual-computer/ssh-forward.js.map +1 -0
- package/dist/local-virtual-computer/wslc-engine.d.ts +27 -0
- package/dist/local-virtual-computer/wslc-engine.d.ts.map +1 -0
- package/dist/local-virtual-computer/wslc-engine.js +98 -0
- package/dist/local-virtual-computer/wslc-engine.js.map +1 -0
- package/local-computer/Dockerfile +99 -0
- package/local-computer/app-catalog.cjs +240 -0
- package/local-computer/app-native-host.cjs +144 -0
- package/local-computer/browser-home.cjs +249 -0
- package/local-computer/build-image.mjs +310 -0
- package/local-computer/desktop-worker.cjs +477 -0
- package/local-computer/entrypoint.sh +161 -0
- package/local-computer/home.html +28 -0
- package/local-computer/new-tab/home.css +255 -0
- package/local-computer/new-tab/home.js +65 -0
- package/local-computer/new-tab/manifest.json +12 -0
- package/local-computer/new-tab/wordmark.svg +33 -0
- package/local-computer/openbox-rc.xml +41 -0
- package/local-computer/prepare-home.cjs +121 -0
- package/local-computer/tint2rc +44 -0
- package/package.json +13 -4
- package/src/backends/http-worker-client.ts +31 -3
- package/src/index.ts +13 -0
- package/src/local-virtual-computer/client.ts +573 -0
- package/src/local-virtual-computer/detached-process.ts +133 -0
- package/src/local-virtual-computer/detached-worker.ts +124 -0
- package/src/local-virtual-computer/dialect.ts +83 -0
- package/src/local-virtual-computer/engine.ts +197 -0
- package/src/local-virtual-computer/guest-stdio.ts +332 -0
- package/src/local-virtual-computer/index.ts +447 -0
- package/src/local-virtual-computer/podman-machine.ts +264 -0
- package/src/local-virtual-computer/setup/contract.ts +395 -0
- package/src/local-virtual-computer/setup/elevated.ts +655 -0
- package/src/local-virtual-computer/setup/host.ts +100 -0
- package/src/local-virtual-computer/setup/idle.ts +39 -0
- package/src/local-virtual-computer/setup/image.ts +159 -0
- package/src/local-virtual-computer/setup/index.ts +16 -0
- package/src/local-virtual-computer/setup/limits.ts +68 -0
- package/src/local-virtual-computer/setup/plan.ts +144 -0
- package/src/local-virtual-computer/setup/readiness.ts +386 -0
- package/src/local-virtual-computer/setup/registry.ts +50 -0
- package/src/local-virtual-computer/setup/restart.ts +64 -0
- package/src/local-virtual-computer/setup/resume.ts +65 -0
- package/src/local-virtual-computer/setup/run.ts +225 -0
- package/src/local-virtual-computer/setup/windows-folder.ts +13 -0
- package/src/local-virtual-computer/setup/wsl-package.ts +242 -0
- package/src/local-virtual-computer/setup/wslc-shared.ts +147 -0
- package/src/local-virtual-computer/ssh-forward.ts +195 -0
- package/src/local-virtual-computer/wslc-engine.ts +124 -0
- package/worker/server.js +1499 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { homedir, release } from 'node:os';
|
|
2
|
+
import { join, win32 } from 'node:path';
|
|
3
|
+
import { LocalCommandError, nodeCommandRunner } from '../engine.js';
|
|
4
|
+
import { RESUME_AT_SIGN_IN_KEY } from './contract.js';
|
|
5
|
+
import { PROBE_LIMIT_MS, ProbeTimeoutError, runLimited } from './limits.js';
|
|
6
|
+
import { queryRegistryKey } from './registry.js';
|
|
7
|
+
/** `10.0.19045` becomes 19045; undefined when the release string has no build. */
|
|
8
|
+
function windowsBuildOf(platform) {
|
|
9
|
+
if (platform !== 'win32')
|
|
10
|
+
return undefined;
|
|
11
|
+
const build = Number(release().split('.')[2]);
|
|
12
|
+
return Number.isInteger(build) ? build : undefined;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The processor type of the PC. On Windows a 32-bit process sees its own
|
|
16
|
+
* type in `PROCESSOR_ARCHITECTURE`; the PC's is in `PROCESSOR_ARCHITEW6432`.
|
|
17
|
+
* Neither is `process.arch`, which names the Node build, not the machine.
|
|
18
|
+
*/
|
|
19
|
+
export function windowsArchitectureOf(env) {
|
|
20
|
+
const claimed = (env.PROCESSOR_ARCHITEW6432 ?? env.PROCESSOR_ARCHITECTURE ?? '').toUpperCase();
|
|
21
|
+
if (claimed === 'AMD64')
|
|
22
|
+
return 'x64';
|
|
23
|
+
if (claimed === 'ARM64')
|
|
24
|
+
return 'arm64';
|
|
25
|
+
return claimed === '' ? process.arch : claimed.toLowerCase();
|
|
26
|
+
}
|
|
27
|
+
function defaultStateDirectory(env, platform) {
|
|
28
|
+
if (platform === 'win32') {
|
|
29
|
+
const base = env.LOCALAPPDATA ?? win32.join(homedir(), 'AppData', 'Local');
|
|
30
|
+
return win32.join(base, 'Namzu', 'setup');
|
|
31
|
+
}
|
|
32
|
+
return join(homedir(), '.namzu', 'setup');
|
|
33
|
+
}
|
|
34
|
+
/** `REG_DWORD 0x1f` becomes 31; anything else is undefined. */
|
|
35
|
+
export function parseRegDword(output) {
|
|
36
|
+
const match = /REG_DWORD\s+0x([0-9a-f]+)/i.exec(output);
|
|
37
|
+
return match ? Number.parseInt(match[1], 16) : undefined;
|
|
38
|
+
}
|
|
39
|
+
/** The real Windows host, with `overrides` applied. */
|
|
40
|
+
export const createWslcSetupHost = (overrides = {}) => {
|
|
41
|
+
const platform = overrides.platform ?? process.platform;
|
|
42
|
+
const env = overrides.env ?? process.env;
|
|
43
|
+
const runner = overrides.runner ?? nodeCommandRunner;
|
|
44
|
+
const host = {
|
|
45
|
+
platform,
|
|
46
|
+
arch: platform === 'win32' ? windowsArchitectureOf(env) : process.arch,
|
|
47
|
+
windowsBuild: windowsBuildOf(platform),
|
|
48
|
+
env,
|
|
49
|
+
runner,
|
|
50
|
+
stateDirectory: defaultStateDirectory(env, platform),
|
|
51
|
+
resumeRegistryKey: RESUME_AT_SIGN_IN_KEY,
|
|
52
|
+
now: () => new Date(),
|
|
53
|
+
async readDword(key, name) {
|
|
54
|
+
try {
|
|
55
|
+
return parseRegDword(await runLimited(runner, 'reg.exe', ['query', key, '/v', name], PROBE_LIMIT_MS.command));
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// reg.exe exits 1 for an absent key or value; that is "not set". A
|
|
59
|
+
// check that did not answer in time is not known: it propagates, so a
|
|
60
|
+
// policy read that timed out never reads as "not set" (allowed).
|
|
61
|
+
if (error instanceof LocalCommandError)
|
|
62
|
+
return undefined;
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
async keyExists(key) {
|
|
67
|
+
try {
|
|
68
|
+
const listing = await queryRegistryKey((args) => runLimited(runner, 'reg.exe', args, PROBE_LIMIT_MS.command), key);
|
|
69
|
+
return listing !== undefined;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
// Denied, a failed parent or no answer in time: not known, never "absent".
|
|
73
|
+
if (error instanceof LocalCommandError || error instanceof ProbeTimeoutError)
|
|
74
|
+
return 'unknown';
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
async bootTime() {
|
|
79
|
+
const output = await runLimited(runner, 'powershell.exe', [
|
|
80
|
+
'-NoProfile',
|
|
81
|
+
'-NonInteractive',
|
|
82
|
+
'-Command',
|
|
83
|
+
"(Get-CimInstance Win32_OperatingSystem).LastBootUpTime.ToUniversalTime().ToString('o')",
|
|
84
|
+
], PROBE_LIMIT_MS.powershell);
|
|
85
|
+
const parsed = new Date(output.trim());
|
|
86
|
+
if (Number.isNaN(parsed.getTime()))
|
|
87
|
+
throw new Error('Windows did not report its boot time');
|
|
88
|
+
return parsed;
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
return { ...host, ...overrides };
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { StopIdleWslcSession } from './contract.js';
|
|
2
|
+
/**
|
|
3
|
+
* Whether the default wslc session is running. `wslc system session list`
|
|
4
|
+
* reads the session manager and does not start a session (unlike `list` and
|
|
5
|
+
* `image`, which do). The default session is the one wslc names `wslc-cli-*`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function defaultSessionRunning(listOutput: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Stop the wslc session's virtual machine when nothing runs in it. Answers
|
|
10
|
+
* `busy` and does nothing while any container runs, Namzu's or not, and
|
|
11
|
+
* `not-running` when there is no session to stop.
|
|
12
|
+
*
|
|
13
|
+
* A container could start between the check and the terminate; the window is
|
|
14
|
+
* milliseconds and the caller owns the sessions it starts. If the check itself
|
|
15
|
+
* fails, the error is thrown and the session is left alone.
|
|
16
|
+
*/
|
|
17
|
+
export declare const stopIdleWslcSession: StopIdleWslcSession;
|
|
18
|
+
//# sourceMappingURL=idle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/idle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAOxD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAIjE;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBAWjC,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { createWslcSetupHost } from './host.js';
|
|
2
|
+
import { wslcBinaryOf } from './wslc-shared.js';
|
|
3
|
+
/** A row of `wslc system session list`: id, creator pid, display name. */
|
|
4
|
+
const SESSION_ROW = /^\s*\d+\s+\d+\s+(\S+)/;
|
|
5
|
+
/**
|
|
6
|
+
* Whether the default wslc session is running. `wslc system session list`
|
|
7
|
+
* reads the session manager and does not start a session (unlike `list` and
|
|
8
|
+
* `image`, which do). The default session is the one wslc names `wslc-cli-*`.
|
|
9
|
+
*/
|
|
10
|
+
export function defaultSessionRunning(listOutput) {
|
|
11
|
+
return listOutput
|
|
12
|
+
.split(/\r?\n/)
|
|
13
|
+
.some((line) => (SESSION_ROW.exec(line)?.[1] ?? '').startsWith('wslc-cli'));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Stop the wslc session's virtual machine when nothing runs in it. Answers
|
|
17
|
+
* `busy` and does nothing while any container runs, Namzu's or not, and
|
|
18
|
+
* `not-running` when there is no session to stop.
|
|
19
|
+
*
|
|
20
|
+
* A container could start between the check and the terminate; the window is
|
|
21
|
+
* milliseconds and the caller owns the sessions it starts. If the check itself
|
|
22
|
+
* fails, the error is thrown and the session is left alone.
|
|
23
|
+
*/
|
|
24
|
+
export const stopIdleWslcSession = async (options) => {
|
|
25
|
+
const host = createWslcSetupHost(options.host);
|
|
26
|
+
const binary = wslcBinaryOf(host);
|
|
27
|
+
const { signal } = options;
|
|
28
|
+
const sessions = await host.runner.run(binary, ['system', 'session', 'list'], { signal });
|
|
29
|
+
if (!defaultSessionRunning(sessions))
|
|
30
|
+
return { outcome: 'not-running' };
|
|
31
|
+
// Running containers only: `list` without `--all`.
|
|
32
|
+
const running = await host.runner.run(binary, ['list', '-q'], { signal });
|
|
33
|
+
if (running.trim() !== '')
|
|
34
|
+
return { outcome: 'busy' };
|
|
35
|
+
await host.runner.run(binary, ['system', 'session', 'terminate'], { signal });
|
|
36
|
+
return { outcome: 'stopped' };
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=idle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idle.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/idle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,0EAA0E;AAC1E,MAAM,WAAW,GAAG,uBAAuB,CAAA;AAE3C;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACvD,OAAO,UAAU;SACf,KAAK,CAAC,OAAO,CAAC;SACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;AAC7E,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAwB,KAAK,EAAE,OAAO,EAAE,EAAE;IACzE,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACzF,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;IACvE,mDAAmD;IACnD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACzE,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IACrD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAA;AAC9B,CAAC,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { LoadWslcImage } from './contract.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check the bundled archive against its manifest, load it with `wslc load`,
|
|
4
|
+
* and check what loaded. Nothing is loaded that failed a check.
|
|
5
|
+
*/
|
|
6
|
+
export declare const loadWslcImage: LoadWslcImage;
|
|
7
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/image.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,eAAe,CAAA;AAyDrE;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aA4F3B,CAAA"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { createReadStream } from 'node:fs';
|
|
3
|
+
import { stat } from 'node:fs/promises';
|
|
4
|
+
import { LocalComputerSetupError } from '../engine.js';
|
|
5
|
+
import { mapWslcFailure } from '../wslc-engine.js';
|
|
6
|
+
import { createWslcSetupHost } from './host.js';
|
|
7
|
+
import { ManifestError, archivePathOf, parseImageInspect, readManifest, writeImageRecord, wslcBinaryOf, } from './wslc-shared.js';
|
|
8
|
+
const HASH_CHUNK_BYTES = 4 * 1024 * 1024;
|
|
9
|
+
async function sha256Of(path, total, onProgress, signal) {
|
|
10
|
+
const hash = createHash('sha256');
|
|
11
|
+
let done = 0;
|
|
12
|
+
const stream = createReadStream(path, { highWaterMark: HASH_CHUNK_BYTES, signal });
|
|
13
|
+
for await (const chunk of stream) {
|
|
14
|
+
hash.update(chunk);
|
|
15
|
+
done += chunk.byteLength;
|
|
16
|
+
onProgress?.(Math.min(done, total));
|
|
17
|
+
}
|
|
18
|
+
return hash.digest('hex');
|
|
19
|
+
}
|
|
20
|
+
/** The image the engine reports under `ref`, or undefined when it has none. */
|
|
21
|
+
async function inspectImage(host, ref, signal) {
|
|
22
|
+
try {
|
|
23
|
+
const output = await host.runner.run(wslcBinaryOf(host), ['image', 'inspect', '-f', 'json', ref], { signal });
|
|
24
|
+
const parsed = parseImageInspect(output);
|
|
25
|
+
return parsed ? { kind: 'found', id: parsed.id, protocol: parsed.protocol } : { kind: 'absent' };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
signal?.throwIfAborted();
|
|
29
|
+
const mapped = mapWslcFailure(error);
|
|
30
|
+
if (mapped === undefined)
|
|
31
|
+
return { kind: 'absent' };
|
|
32
|
+
if (mapped.code === 'image-missing')
|
|
33
|
+
return { kind: 'absent' };
|
|
34
|
+
return { kind: 'engine', detail: mapped.message };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check the bundled archive against its manifest, load it with `wslc load`,
|
|
39
|
+
* and check what loaded. Nothing is loaded that failed a check.
|
|
40
|
+
*/
|
|
41
|
+
export const loadWslcImage = async (options) => {
|
|
42
|
+
const host = createWslcSetupHost(options.host);
|
|
43
|
+
const { signal } = options;
|
|
44
|
+
let manifest;
|
|
45
|
+
try {
|
|
46
|
+
manifest = await readManifest(options.manifestPath);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof ManifestError)
|
|
50
|
+
return { outcome: 'failed', code: 'image-corrupt', detail: error.message };
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
const record = async () => {
|
|
54
|
+
await writeImageRecord(host, {
|
|
55
|
+
imageRef: manifest.imageRef,
|
|
56
|
+
imageId: manifest.imageId,
|
|
57
|
+
loadedAt: host.now().toISOString(),
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
const existing = await inspectImage(host, manifest.imageRef, signal);
|
|
61
|
+
if (existing.kind === 'engine')
|
|
62
|
+
return { outcome: 'failed', code: 'image-load-failed', detail: existing.detail };
|
|
63
|
+
if (existing.kind === 'found' && existing.id === manifest.imageId) {
|
|
64
|
+
await record();
|
|
65
|
+
return { outcome: 'already-loaded' };
|
|
66
|
+
}
|
|
67
|
+
const archive = archivePathOf(options.manifestPath, manifest);
|
|
68
|
+
let size;
|
|
69
|
+
try {
|
|
70
|
+
size = (await stat(archive)).size;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return {
|
|
74
|
+
outcome: 'failed',
|
|
75
|
+
code: 'image-corrupt',
|
|
76
|
+
detail: 'The Pal computer image file is missing from this installation.',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (size !== manifest.compressedBytes)
|
|
80
|
+
return {
|
|
81
|
+
outcome: 'failed',
|
|
82
|
+
code: 'image-corrupt',
|
|
83
|
+
detail: 'The Pal computer image file is incomplete or damaged.',
|
|
84
|
+
};
|
|
85
|
+
const digest = await sha256Of(archive, manifest.compressedBytes, (done) => options.onProgress?.({
|
|
86
|
+
step: 'load-image',
|
|
87
|
+
phase: 'progress',
|
|
88
|
+
done,
|
|
89
|
+
total: manifest.compressedBytes,
|
|
90
|
+
unit: 'bytes',
|
|
91
|
+
}), signal);
|
|
92
|
+
if (digest !== manifest.sha256)
|
|
93
|
+
return {
|
|
94
|
+
outcome: 'failed',
|
|
95
|
+
code: 'image-corrupt',
|
|
96
|
+
detail: 'The Pal computer image file is incomplete or damaged.',
|
|
97
|
+
};
|
|
98
|
+
try {
|
|
99
|
+
await host.runner.run(wslcBinaryOf(host), ['load', '-q', '-i', archive], { signal });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
signal?.throwIfAborted();
|
|
103
|
+
const mapped = mapWslcFailure(error);
|
|
104
|
+
return {
|
|
105
|
+
outcome: 'failed',
|
|
106
|
+
code: 'image-load-failed',
|
|
107
|
+
detail: mapped instanceof LocalComputerSetupError
|
|
108
|
+
? mapped.message
|
|
109
|
+
: 'Windows could not load the Pal computer image.',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const loaded = await inspectImage(host, manifest.imageRef, signal);
|
|
113
|
+
if (loaded.kind !== 'found' ||
|
|
114
|
+
loaded.id !== manifest.imageId ||
|
|
115
|
+
loaded.protocol !== manifest.protocol)
|
|
116
|
+
return {
|
|
117
|
+
outcome: 'failed',
|
|
118
|
+
code: 'image-mismatch',
|
|
119
|
+
detail: 'The image that loaded is not the one this version of Namzu expects.',
|
|
120
|
+
};
|
|
121
|
+
await record();
|
|
122
|
+
return { outcome: 'loaded' };
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EACN,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACZ,MAAM,kBAAkB,CAAA;AAEzB,MAAM,gBAAgB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAExC,KAAK,UAAU,QAAQ,CACtB,IAAY,EACZ,KAAa,EACb,UAAgD,EAChD,MAA+B;IAE/B,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjC,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAA;IAClF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,KAAe,CAAC,CAAA;QAC5B,IAAI,IAAK,KAAgB,CAAC,UAAU,CAAA;QACpC,UAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,YAAY,CAC1B,IAA4C,EAC5C,GAAW,EACX,MAA+B;IAM/B,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnC,YAAY,CAAC,IAAI,CAAC,EAClB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EACvC,EAAE,MAAM,EAAE,CACV,CAAA;QACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACxC,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IACjG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;QACpC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QACnD,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;QAC9D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,CAAA;IAClD,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAkB,KAAK,EAAE,OAAO,EAAE,EAAE;IAC7D,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;IAC1B,IAAI,QAA2B,CAAA;IAC/B,IAAI,CAAC;QACJ,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,aAAa;YACjC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAA;QAC3E,MAAM,KAAK,CAAA;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACxC,MAAM,gBAAgB,CAAC,IAAI,EAAE;YAC5B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SAClC,CAAC,CAAA;IACH,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACpE,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ;QAC7B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAA;IACjF,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,OAAO,EAAE,CAAC;QACnE,MAAM,MAAM,EAAE,CAAA;QACd,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAA;IACrC,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;IAC7D,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACJ,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;YACN,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,gEAAgE;SACxE,CAAA;IACF,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,CAAC,eAAe;QACpC,OAAO;YACN,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,uDAAuD;SAC/D,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC5B,OAAO,EACP,QAAQ,CAAC,eAAe,EACxB,CAAC,IAAI,EAAE,EAAE,CACR,OAAO,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,UAAU;QACjB,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,eAAe;QAC/B,IAAI,EAAE,OAAO;KACb,CAAC,EACH,MAAM,CACN,CAAA;IACD,IAAI,MAAM,KAAK,QAAQ,CAAC,MAAM;QAC7B,OAAO;YACN,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,uDAAuD;SAC/D,CAAA;IAEF,IAAI,CAAC;QACJ,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;QACpC,OAAO;YACN,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,mBAAmB;YACzB,MAAM,EACL,MAAM,YAAY,uBAAuB;gBACxC,CAAC,CAAC,MAAM,CAAC,OAAO;gBAChB,CAAC,CAAC,gDAAgD;SACpD,CAAA;IACF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAClE,IACC,MAAM,CAAC,IAAI,KAAK,OAAO;QACvB,MAAM,CAAC,EAAE,KAAK,QAAQ,CAAC,OAAO;QAC9B,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ;QAErC,OAAO;YACN,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,gBAAgB;YACtB,MAAM,EAAE,qEAAqE;SAC7E,CAAA;IACF,MAAM,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AAC7B,CAAC,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows Pal computer setup: inspect the machine, plan, and run the plan
|
|
3
|
+
* after the person agrees. Separate from the provider, which never installs,
|
|
4
|
+
* loads or starts anything.
|
|
5
|
+
*/
|
|
6
|
+
export * from './contract.js';
|
|
7
|
+
export { createWslcSetupHost } from './host.js';
|
|
8
|
+
export { stopIdleWslcSession } from './idle.js';
|
|
9
|
+
export { loadWslcImage } from './image.js';
|
|
10
|
+
export { planWslcSetup } from './plan.js';
|
|
11
|
+
export { inspectWslcReadiness } from './readiness.js';
|
|
12
|
+
export { clearRestartMarker, readRestartMarker, writeRestartMarker } from './restart.js';
|
|
13
|
+
export { clearResumeAtSignIn, registerResumeAtSignIn } from './resume.js';
|
|
14
|
+
export { runWslcSetup } from './run.js';
|
|
15
|
+
export { runElevatedWslcSteps } from './elevated.js';
|
|
16
|
+
export { downloadWslPackage, PINNED_WSL_PACKAGE } from './wsl-package.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACxF,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows Pal computer setup: inspect the machine, plan, and run the plan
|
|
3
|
+
* after the person agrees. Separate from the provider, which never installs,
|
|
4
|
+
* loads or starts anything.
|
|
5
|
+
*/
|
|
6
|
+
export * from './contract.js';
|
|
7
|
+
export { createWslcSetupHost } from './host.js';
|
|
8
|
+
export { stopIdleWslcSession } from './idle.js';
|
|
9
|
+
export { loadWslcImage } from './image.js';
|
|
10
|
+
export { planWslcSetup } from './plan.js';
|
|
11
|
+
export { inspectWslcReadiness } from './readiness.js';
|
|
12
|
+
export { clearRestartMarker, readRestartMarker, writeRestartMarker } from './restart.js';
|
|
13
|
+
export { clearResumeAtSignIn, registerResumeAtSignIn } from './resume.js';
|
|
14
|
+
export { runWslcSetup } from './run.js';
|
|
15
|
+
export { runElevatedWslcSteps } from './elevated.js';
|
|
16
|
+
export { downloadWslPackage, PINNED_WSL_PACKAGE } from './wsl-package.js';
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACxF,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LocalComputerCommandRunner } from '../engine.js';
|
|
2
|
+
/**
|
|
3
|
+
* Every probe command has its own time limit, so a stuck Windows tool degrades
|
|
4
|
+
* one fact to `unknown` instead of hanging the whole inspection.
|
|
5
|
+
*/
|
|
6
|
+
export declare const PROBE_LIMIT_MS: {
|
|
7
|
+
/** reg.exe, sc.exe, wsl.exe, wslc version: local and quick. */
|
|
8
|
+
readonly command: 10000;
|
|
9
|
+
/** PowerShell starts slowly on a cold PC. */
|
|
10
|
+
readonly powershell: 15000;
|
|
11
|
+
/** The command that starts the wslc session (a virtual machine). */
|
|
12
|
+
readonly session: 60000;
|
|
13
|
+
};
|
|
14
|
+
/** A probe command did not answer within its limit. */
|
|
15
|
+
export declare class ProbeTimeoutError extends Error {
|
|
16
|
+
readonly name = "ProbeTimeoutError";
|
|
17
|
+
constructor();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Run one command with its own limit. The limit aborts the runner's signal and
|
|
21
|
+
* also stops waiting, so a runner that ignores the signal cannot hold the
|
|
22
|
+
* caller. The caller's own signal still wins: its abort rejects with its
|
|
23
|
+
* reason, not with a timeout.
|
|
24
|
+
*/
|
|
25
|
+
export declare function runLimited(runner: LocalComputerCommandRunner, binary: string, args: readonly string[], limitMs: number, options?: {
|
|
26
|
+
readonly signal?: AbortSignal;
|
|
27
|
+
readonly env?: NodeJS.ProcessEnv;
|
|
28
|
+
readonly cwd?: string;
|
|
29
|
+
}): Promise<string>;
|
|
30
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/limits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAE9D;;;GAGG;AACH,eAAO,MAAM,cAAc;IAC1B,+DAA+D;;IAE/D,6CAA6C;;IAE7C,oEAAoE;;CAE3D,CAAA;AAEV,uDAAuD;AACvD,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,SAAkB,IAAI,uBAAsB;;CAI5C;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC/B,MAAM,EAAE,0BAA0B,EAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACR,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IAChC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAChB,GACJ,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Every probe command has its own time limit, so a stuck Windows tool degrades
|
|
3
|
+
* one fact to `unknown` instead of hanging the whole inspection.
|
|
4
|
+
*/
|
|
5
|
+
export const PROBE_LIMIT_MS = {
|
|
6
|
+
/** reg.exe, sc.exe, wsl.exe, wslc version: local and quick. */
|
|
7
|
+
command: 10_000,
|
|
8
|
+
/** PowerShell starts slowly on a cold PC. */
|
|
9
|
+
powershell: 15_000,
|
|
10
|
+
/** The command that starts the wslc session (a virtual machine). */
|
|
11
|
+
session: 60_000,
|
|
12
|
+
};
|
|
13
|
+
/** A probe command did not answer within its limit. */
|
|
14
|
+
export class ProbeTimeoutError extends Error {
|
|
15
|
+
name = 'ProbeTimeoutError';
|
|
16
|
+
constructor() {
|
|
17
|
+
super('A Windows check did not answer in time.');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Run one command with its own limit. The limit aborts the runner's signal and
|
|
22
|
+
* also stops waiting, so a runner that ignores the signal cannot hold the
|
|
23
|
+
* caller. The caller's own signal still wins: its abort rejects with its
|
|
24
|
+
* reason, not with a timeout.
|
|
25
|
+
*/
|
|
26
|
+
export async function runLimited(runner, binary, args, limitMs, options = {}) {
|
|
27
|
+
options.signal?.throwIfAborted();
|
|
28
|
+
const controller = new AbortController();
|
|
29
|
+
let timer;
|
|
30
|
+
let onOuterAbort;
|
|
31
|
+
const stop = new Promise((_, reject) => {
|
|
32
|
+
timer = setTimeout(() => {
|
|
33
|
+
// Reject first: aborting makes a well-behaved runner reject at once, and
|
|
34
|
+
// the caller must see the timeout, not that rejection.
|
|
35
|
+
reject(new ProbeTimeoutError());
|
|
36
|
+
controller.abort();
|
|
37
|
+
}, limitMs);
|
|
38
|
+
onOuterAbort = () => {
|
|
39
|
+
reject(options.signal?.reason);
|
|
40
|
+
controller.abort();
|
|
41
|
+
};
|
|
42
|
+
options.signal?.addEventListener('abort', onOuterAbort, { once: true });
|
|
43
|
+
});
|
|
44
|
+
// Whichever side loses the race must not become an unhandled rejection.
|
|
45
|
+
stop.catch(() => undefined);
|
|
46
|
+
try {
|
|
47
|
+
const running = runner.run(binary, args, { ...options, signal: controller.signal });
|
|
48
|
+
running.catch(() => undefined);
|
|
49
|
+
return await Promise.race([running, stop]);
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
if (timer !== undefined)
|
|
53
|
+
clearTimeout(timer);
|
|
54
|
+
if (onOuterAbort)
|
|
55
|
+
options.signal?.removeEventListener('abort', onOuterAbort);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=limits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/limits.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,+DAA+D;IAC/D,OAAO,EAAE,MAAM;IACf,6CAA6C;IAC7C,UAAU,EAAE,MAAM;IAClB,oEAAoE;IACpE,OAAO,EAAE,MAAM;CACN,CAAA;AAEV,uDAAuD;AACvD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACzB,IAAI,GAAG,mBAAmB,CAAA;IAC5C;QACC,KAAK,CAAC,yCAAyC,CAAC,CAAA;IACjD,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,MAAkC,EAClC,MAAc,EACd,IAAuB,EACvB,OAAe,EACf,UAII,EAAE;IAEN,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;IAChC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,IAAI,KAAgD,CAAA;IACpD,IAAI,YAAsC,CAAA;IAC1C,MAAM,IAAI,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC7C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACvB,yEAAyE;YACzE,uDAAuD;YACvD,MAAM,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAA;YAC/B,UAAU,CAAC,KAAK,EAAE,CAAA;QACnB,CAAC,EAAE,OAAO,CAAC,CAAA;QACX,YAAY,GAAG,GAAG,EAAE;YACnB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;YAC9B,UAAU,CAAC,KAAK,EAAE,CAAA;QACnB,CAAC,CAAA;QACD,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IACF,wEAAwE;IACxE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC3B,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACnF,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC9B,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAA;IAC3C,CAAC;YAAS,CAAC;QACV,IAAI,KAAK,KAAK,SAAS;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;QAC5C,IAAI,YAAY;YAAE,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAC7E,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PlanWslcSetup } from './contract.js';
|
|
2
|
+
/**
|
|
3
|
+
* Turn what a readiness inspection found into the steps that fix it. Pure: the
|
|
4
|
+
* same facts give the same plan and the same id. Steps come from the facts, not
|
|
5
|
+
* only from the headline state.
|
|
6
|
+
*/
|
|
7
|
+
export declare const planWslcSetup: PlanWslcSetup;
|
|
8
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/plan.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,aAAa,EAKb,MAAM,eAAe,CAAA;AAiCtB;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,aAkG3B,CAAA"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { wslcAtLeastMinimum } from './readiness.js';
|
|
3
|
+
import { PINNED_WSL_PACKAGE } from './wsl-package.js';
|
|
4
|
+
/** Rough durations for the sentence the person reads; not promises. */
|
|
5
|
+
const ENABLE_FEATURES_SECONDS = 90;
|
|
6
|
+
const INSTALL_WSL_SECONDS = 60;
|
|
7
|
+
const RESTART_SECONDS = 90;
|
|
8
|
+
/** Bytes per second assumed for a download and for loading the image. */
|
|
9
|
+
const DOWNLOAD_BYTES_PER_SECOND = 8_000_000;
|
|
10
|
+
/** Measured on a real PC: 3.2 s for the 323 MB archive, so about 5 s plus 150 MB/s. */
|
|
11
|
+
const LOAD_BYTES_PER_SECOND = 150_000_000;
|
|
12
|
+
const LOAD_FIXED_SECONDS = 5;
|
|
13
|
+
const BLOCKED = {
|
|
14
|
+
unsupported: 'unsupported',
|
|
15
|
+
'blocked-by-policy': 'blocked-by-policy',
|
|
16
|
+
'virtualization-off': 'virtualization-off',
|
|
17
|
+
'sdk-mismatch': 'sdk-mismatch',
|
|
18
|
+
};
|
|
19
|
+
/** JSON with sorted keys, so equal plans digest equally. */
|
|
20
|
+
function canonical(value) {
|
|
21
|
+
if (Array.isArray(value))
|
|
22
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
23
|
+
if (typeof value === 'object' && value !== null) {
|
|
24
|
+
const entries = Object.entries(value)
|
|
25
|
+
.filter(([, v]) => v !== undefined)
|
|
26
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
27
|
+
return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`).join(',')}}`;
|
|
28
|
+
}
|
|
29
|
+
return JSON.stringify(value);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Turn what a readiness inspection found into the steps that fix it. Pure: the
|
|
33
|
+
* same facts give the same plan and the same id. Steps come from the facts, not
|
|
34
|
+
* only from the headline state.
|
|
35
|
+
*/
|
|
36
|
+
export const planWslcSetup = (readiness, options) => {
|
|
37
|
+
const pinned = options.wslPackage ?? PINNED_WSL_PACKAGE;
|
|
38
|
+
const manifest = options.manifest;
|
|
39
|
+
const finish = (steps, blocked) => {
|
|
40
|
+
const id = createHash('sha256')
|
|
41
|
+
.update(canonical({
|
|
42
|
+
state: readiness.state,
|
|
43
|
+
steps,
|
|
44
|
+
blocked,
|
|
45
|
+
wslVersion: pinned.version,
|
|
46
|
+
manifest: manifest?.sha256 ?? null,
|
|
47
|
+
}))
|
|
48
|
+
.digest('hex');
|
|
49
|
+
return {
|
|
50
|
+
id,
|
|
51
|
+
state: readiness.state,
|
|
52
|
+
steps,
|
|
53
|
+
elevationPrompts: steps.some((step) => step.elevated) ? 1 : 0,
|
|
54
|
+
mayRequireRestart: steps.some((step) => step.mayRequireRestart),
|
|
55
|
+
...(blocked ? { blocked } : {}),
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
const blocked = BLOCKED[readiness.state];
|
|
59
|
+
if (blocked)
|
|
60
|
+
return finish([], blocked);
|
|
61
|
+
if (readiness.state === 'ready')
|
|
62
|
+
return finish([]);
|
|
63
|
+
const hasImage = readiness.image.bundled !== undefined || manifest !== undefined;
|
|
64
|
+
const loadImage = () => ({
|
|
65
|
+
kind: 'load-image',
|
|
66
|
+
elevated: false,
|
|
67
|
+
...(manifest ? { diskBytes: manifest.sizeBytes } : {}),
|
|
68
|
+
estimatedSeconds: manifest
|
|
69
|
+
? LOAD_FIXED_SECONDS + Math.ceil(manifest.compressedBytes / LOAD_BYTES_PER_SECOND)
|
|
70
|
+
: 60,
|
|
71
|
+
mayRequireRestart: false,
|
|
72
|
+
});
|
|
73
|
+
const needImage = !readiness.image.loaded;
|
|
74
|
+
if (readiness.state === 'restart-pending') {
|
|
75
|
+
const steps = [
|
|
76
|
+
{
|
|
77
|
+
kind: 'restart',
|
|
78
|
+
elevated: false,
|
|
79
|
+
estimatedSeconds: RESTART_SECONDS,
|
|
80
|
+
mayRequireRestart: true,
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
if (needImage) {
|
|
84
|
+
if (!hasImage)
|
|
85
|
+
return finish([], 'image-unavailable');
|
|
86
|
+
steps.push(loadImage());
|
|
87
|
+
}
|
|
88
|
+
return finish(steps);
|
|
89
|
+
}
|
|
90
|
+
const wslcVersion = readiness.wsl.wslcVersion;
|
|
91
|
+
const needWsl = wslcVersion === undefined || !wslcAtLeastMinimum(wslcVersion);
|
|
92
|
+
const needFeatures = readiness.components.virtualMachinePlatform === false ||
|
|
93
|
+
readiness.components.wslOptionalComponent === false;
|
|
94
|
+
if (needImage && !hasImage)
|
|
95
|
+
return finish([], 'image-unavailable');
|
|
96
|
+
const steps = [];
|
|
97
|
+
if (needWsl)
|
|
98
|
+
steps.push({
|
|
99
|
+
kind: 'download-wsl',
|
|
100
|
+
elevated: false,
|
|
101
|
+
downloadBytes: pinned.sizeBytes,
|
|
102
|
+
diskBytes: pinned.sizeBytes,
|
|
103
|
+
estimatedSeconds: Math.ceil(pinned.sizeBytes / DOWNLOAD_BYTES_PER_SECOND),
|
|
104
|
+
mayRequireRestart: false,
|
|
105
|
+
});
|
|
106
|
+
if (needFeatures)
|
|
107
|
+
steps.push({
|
|
108
|
+
kind: 'enable-windows-features',
|
|
109
|
+
elevated: true,
|
|
110
|
+
estimatedSeconds: ENABLE_FEATURES_SECONDS,
|
|
111
|
+
mayRequireRestart: true,
|
|
112
|
+
});
|
|
113
|
+
if (needWsl)
|
|
114
|
+
steps.push({
|
|
115
|
+
kind: 'install-wsl',
|
|
116
|
+
elevated: true,
|
|
117
|
+
estimatedSeconds: INSTALL_WSL_SECONDS,
|
|
118
|
+
mayRequireRestart: true,
|
|
119
|
+
});
|
|
120
|
+
if (needFeatures)
|
|
121
|
+
steps.push({
|
|
122
|
+
kind: 'restart',
|
|
123
|
+
elevated: false,
|
|
124
|
+
estimatedSeconds: RESTART_SECONDS,
|
|
125
|
+
mayRequireRestart: true,
|
|
126
|
+
});
|
|
127
|
+
if (needImage)
|
|
128
|
+
steps.push(loadImage());
|
|
129
|
+
return finish(steps);
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { InspectWslcReadiness } from './contract.js';
|
|
2
|
+
/** `wsl.exe --version` is UTF-16LE and localised: strip NULs, never read a label. */
|
|
3
|
+
export declare function parseWslVersion(output: string): string | undefined;
|
|
4
|
+
export declare function wslcAtLeastMinimum(version: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Inspect the PC without changing anything. Without `probeSession` no command
|
|
7
|
+
* runs that starts the wslc session (`wslc version` does not; `ps` and `image`
|
|
8
|
+
* do), so opening a panel never starts a virtual machine.
|
|
9
|
+
*/
|
|
10
|
+
export declare const inspectWslcReadiness: InspectWslcReadiness;
|
|
11
|
+
//# sourceMappingURL=readiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/readiness.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACX,oBAAoB,EAKpB,MAAM,eAAe,CAAA;AAqBtB,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIlE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ3D;AA4KD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,oBA+JlC,CAAA"}
|