@namzu/sandbox 23.0.1 → 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.
Files changed (158) hide show
  1. package/CHANGELOG.md +290 -0
  2. package/dist/backends/http-worker-client.d.ts +3 -1
  3. package/dist/backends/http-worker-client.d.ts.map +1 -1
  4. package/dist/backends/http-worker-client.js +15 -4
  5. package/dist/backends/http-worker-client.js.map +1 -1
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/local-virtual-computer/client.d.ts +21 -0
  11. package/dist/local-virtual-computer/client.d.ts.map +1 -0
  12. package/dist/local-virtual-computer/client.js +503 -0
  13. package/dist/local-virtual-computer/client.js.map +1 -0
  14. package/dist/local-virtual-computer/detached-process.d.ts +15 -0
  15. package/dist/local-virtual-computer/detached-process.d.ts.map +1 -0
  16. package/dist/local-virtual-computer/detached-process.js +111 -0
  17. package/dist/local-virtual-computer/detached-process.js.map +1 -0
  18. package/dist/local-virtual-computer/detached-worker.d.ts +11 -0
  19. package/dist/local-virtual-computer/detached-worker.d.ts.map +1 -0
  20. package/dist/local-virtual-computer/detached-worker.js +97 -0
  21. package/dist/local-virtual-computer/detached-worker.js.map +1 -0
  22. package/dist/local-virtual-computer/dialect.d.ts +26 -0
  23. package/dist/local-virtual-computer/dialect.d.ts.map +1 -0
  24. package/dist/local-virtual-computer/dialect.js +61 -0
  25. package/dist/local-virtual-computer/dialect.js.map +1 -0
  26. package/dist/local-virtual-computer/engine.d.ts +63 -0
  27. package/dist/local-virtual-computer/engine.d.ts.map +1 -0
  28. package/dist/local-virtual-computer/engine.js +125 -0
  29. package/dist/local-virtual-computer/engine.js.map +1 -0
  30. package/dist/local-virtual-computer/guest-stdio.d.ts +15 -0
  31. package/dist/local-virtual-computer/guest-stdio.d.ts.map +1 -0
  32. package/dist/local-virtual-computer/guest-stdio.js +330 -0
  33. package/dist/local-virtual-computer/guest-stdio.js.map +1 -0
  34. package/dist/local-virtual-computer/index.d.ts +36 -0
  35. package/dist/local-virtual-computer/index.d.ts.map +1 -0
  36. package/dist/local-virtual-computer/index.js +341 -0
  37. package/dist/local-virtual-computer/index.js.map +1 -0
  38. package/dist/local-virtual-computer/podman-machine.d.ts +17 -0
  39. package/dist/local-virtual-computer/podman-machine.d.ts.map +1 -0
  40. package/dist/local-virtual-computer/podman-machine.js +181 -0
  41. package/dist/local-virtual-computer/podman-machine.js.map +1 -0
  42. package/dist/local-virtual-computer/setup/contract.d.ts +360 -0
  43. package/dist/local-virtual-computer/setup/contract.d.ts.map +1 -0
  44. package/dist/local-virtual-computer/setup/contract.js +3 -0
  45. package/dist/local-virtual-computer/setup/contract.js.map +1 -0
  46. package/dist/local-virtual-computer/setup/elevated.d.ts +78 -0
  47. package/dist/local-virtual-computer/setup/elevated.d.ts.map +1 -0
  48. package/dist/local-virtual-computer/setup/elevated.js +548 -0
  49. package/dist/local-virtual-computer/setup/elevated.js.map +1 -0
  50. package/dist/local-virtual-computer/setup/host.d.ts +12 -0
  51. package/dist/local-virtual-computer/setup/host.d.ts.map +1 -0
  52. package/dist/local-virtual-computer/setup/host.js +93 -0
  53. package/dist/local-virtual-computer/setup/host.js.map +1 -0
  54. package/dist/local-virtual-computer/setup/idle.d.ts +18 -0
  55. package/dist/local-virtual-computer/setup/idle.d.ts.map +1 -0
  56. package/dist/local-virtual-computer/setup/idle.js +38 -0
  57. package/dist/local-virtual-computer/setup/idle.js.map +1 -0
  58. package/dist/local-virtual-computer/setup/image.d.ts +7 -0
  59. package/dist/local-virtual-computer/setup/image.d.ts.map +1 -0
  60. package/dist/local-virtual-computer/setup/image.js +124 -0
  61. package/dist/local-virtual-computer/setup/image.js.map +1 -0
  62. package/dist/local-virtual-computer/setup/index.d.ts +17 -0
  63. package/dist/local-virtual-computer/setup/index.d.ts.map +1 -0
  64. package/dist/local-virtual-computer/setup/index.js +17 -0
  65. package/dist/local-virtual-computer/setup/index.js.map +1 -0
  66. package/dist/local-virtual-computer/setup/limits.d.ts +30 -0
  67. package/dist/local-virtual-computer/setup/limits.d.ts.map +1 -0
  68. package/dist/local-virtual-computer/setup/limits.js +58 -0
  69. package/dist/local-virtual-computer/setup/limits.js.map +1 -0
  70. package/dist/local-virtual-computer/setup/plan.d.ts +8 -0
  71. package/dist/local-virtual-computer/setup/plan.d.ts.map +1 -0
  72. package/dist/local-virtual-computer/setup/plan.js +131 -0
  73. package/dist/local-virtual-computer/setup/plan.js.map +1 -0
  74. package/dist/local-virtual-computer/setup/readiness.d.ts +11 -0
  75. package/dist/local-virtual-computer/setup/readiness.d.ts.map +1 -0
  76. package/dist/local-virtual-computer/setup/readiness.js +320 -0
  77. package/dist/local-virtual-computer/setup/readiness.js.map +1 -0
  78. package/dist/local-virtual-computer/setup/registry.d.ts +18 -0
  79. package/dist/local-virtual-computer/setup/registry.d.ts.map +1 -0
  80. package/dist/local-virtual-computer/setup/registry.js +50 -0
  81. package/dist/local-virtual-computer/setup/registry.js.map +1 -0
  82. package/dist/local-virtual-computer/setup/restart.d.ts +8 -0
  83. package/dist/local-virtual-computer/setup/restart.d.ts.map +1 -0
  84. package/dist/local-virtual-computer/setup/restart.js +60 -0
  85. package/dist/local-virtual-computer/setup/restart.js.map +1 -0
  86. package/dist/local-virtual-computer/setup/resume.d.ts +14 -0
  87. package/dist/local-virtual-computer/setup/resume.d.ts.map +1 -0
  88. package/dist/local-virtual-computer/setup/resume.js +58 -0
  89. package/dist/local-virtual-computer/setup/resume.js.map +1 -0
  90. package/dist/local-virtual-computer/setup/run.d.ts +8 -0
  91. package/dist/local-virtual-computer/setup/run.d.ts.map +1 -0
  92. package/dist/local-virtual-computer/setup/run.js +200 -0
  93. package/dist/local-virtual-computer/setup/run.js.map +1 -0
  94. package/dist/local-virtual-computer/setup/windows-folder.d.ts +11 -0
  95. package/dist/local-virtual-computer/setup/windows-folder.d.ts.map +1 -0
  96. package/dist/local-virtual-computer/setup/windows-folder.js +14 -0
  97. package/dist/local-virtual-computer/setup/windows-folder.js.map +1 -0
  98. package/dist/local-virtual-computer/setup/wsl-package.d.ts +19 -0
  99. package/dist/local-virtual-computer/setup/wsl-package.d.ts.map +1 -0
  100. package/dist/local-virtual-computer/setup/wsl-package.js +242 -0
  101. package/dist/local-virtual-computer/setup/wsl-package.js.map +1 -0
  102. package/dist/local-virtual-computer/setup/wslc-shared.d.ts +27 -0
  103. package/dist/local-virtual-computer/setup/wslc-shared.d.ts.map +1 -0
  104. package/dist/local-virtual-computer/setup/wslc-shared.js +137 -0
  105. package/dist/local-virtual-computer/setup/wslc-shared.js.map +1 -0
  106. package/dist/local-virtual-computer/ssh-forward.d.ts +19 -0
  107. package/dist/local-virtual-computer/ssh-forward.d.ts.map +1 -0
  108. package/dist/local-virtual-computer/ssh-forward.js +179 -0
  109. package/dist/local-virtual-computer/ssh-forward.js.map +1 -0
  110. package/dist/local-virtual-computer/wslc-engine.d.ts +27 -0
  111. package/dist/local-virtual-computer/wslc-engine.d.ts.map +1 -0
  112. package/dist/local-virtual-computer/wslc-engine.js +98 -0
  113. package/dist/local-virtual-computer/wslc-engine.js.map +1 -0
  114. package/local-computer/Dockerfile +99 -0
  115. package/local-computer/app-catalog.cjs +240 -0
  116. package/local-computer/app-native-host.cjs +144 -0
  117. package/local-computer/browser-home.cjs +249 -0
  118. package/local-computer/build-image.mjs +310 -0
  119. package/local-computer/desktop-worker.cjs +477 -0
  120. package/local-computer/entrypoint.sh +161 -0
  121. package/local-computer/home.html +28 -0
  122. package/local-computer/new-tab/home.css +255 -0
  123. package/local-computer/new-tab/home.js +65 -0
  124. package/local-computer/new-tab/manifest.json +12 -0
  125. package/local-computer/new-tab/wordmark.svg +33 -0
  126. package/local-computer/openbox-rc.xml +41 -0
  127. package/local-computer/prepare-home.cjs +121 -0
  128. package/local-computer/tint2rc +44 -0
  129. package/package.json +13 -4
  130. package/src/backends/http-worker-client.ts +31 -3
  131. package/src/index.ts +13 -0
  132. package/src/local-virtual-computer/client.ts +573 -0
  133. package/src/local-virtual-computer/detached-process.ts +133 -0
  134. package/src/local-virtual-computer/detached-worker.ts +124 -0
  135. package/src/local-virtual-computer/dialect.ts +83 -0
  136. package/src/local-virtual-computer/engine.ts +197 -0
  137. package/src/local-virtual-computer/guest-stdio.ts +332 -0
  138. package/src/local-virtual-computer/index.ts +447 -0
  139. package/src/local-virtual-computer/podman-machine.ts +264 -0
  140. package/src/local-virtual-computer/setup/contract.ts +395 -0
  141. package/src/local-virtual-computer/setup/elevated.ts +655 -0
  142. package/src/local-virtual-computer/setup/host.ts +100 -0
  143. package/src/local-virtual-computer/setup/idle.ts +39 -0
  144. package/src/local-virtual-computer/setup/image.ts +159 -0
  145. package/src/local-virtual-computer/setup/index.ts +16 -0
  146. package/src/local-virtual-computer/setup/limits.ts +68 -0
  147. package/src/local-virtual-computer/setup/plan.ts +144 -0
  148. package/src/local-virtual-computer/setup/readiness.ts +386 -0
  149. package/src/local-virtual-computer/setup/registry.ts +50 -0
  150. package/src/local-virtual-computer/setup/restart.ts +64 -0
  151. package/src/local-virtual-computer/setup/resume.ts +65 -0
  152. package/src/local-virtual-computer/setup/run.ts +225 -0
  153. package/src/local-virtual-computer/setup/windows-folder.ts +13 -0
  154. package/src/local-virtual-computer/setup/wsl-package.ts +242 -0
  155. package/src/local-virtual-computer/setup/wslc-shared.ts +147 -0
  156. package/src/local-virtual-computer/ssh-forward.ts +195 -0
  157. package/src/local-virtual-computer/wslc-engine.ts +124 -0
  158. package/worker/server.js +1499 -0
@@ -0,0 +1,320 @@
1
+ import { stat } from 'node:fs/promises';
2
+ import { LocalCommandError, LocalComputerSetupError, } from '../engine.js';
3
+ import { WSLC_MINIMUM_VERSION, mapWslcFailure, parseWslcVersion } from '../wslc-engine.js';
4
+ import { createWslcSetupHost } from './host.js';
5
+ import { PROBE_LIMIT_MS, ProbeTimeoutError, runLimited } from './limits.js';
6
+ import { clearRestartMarker, markerPath, readRestartMarker } from './restart.js';
7
+ import { archivePathOf, parseImageInspect, readImageRecord, readManifest, wslcBinaryOf, } from './wslc-shared.js';
8
+ const POLICY_KEY = 'HKLM\\Software\\Policies\\WSL';
9
+ /** Windows' own pending-restart markers; both can be read without administrator rights. */
10
+ const PENDING_RESTART_KEYS = [
11
+ 'HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Component Based Servicing\\RebootPending',
12
+ 'HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\WindowsUpdate\\Auto Update\\RebootRequired',
13
+ ];
14
+ const MINIMUM_BUILD = 19041;
15
+ const WINDOWS_11_BUILD = 22000;
16
+ /** `wsl.exe --version` is UTF-16LE and localised: strip NULs, never read a label. */
17
+ export function parseWslVersion(output) {
18
+ const text = output.replace(/\0/g, '').replace(/^/, '');
19
+ const firstLine = text.split(/\r?\n/).find((line) => line.trim() !== '') ?? '';
20
+ return /\d+\.\d+\.\d+\.\d+/.exec(firstLine)?.[0];
21
+ }
22
+ export function wslcAtLeastMinimum(version) {
23
+ const parts = version.split('.').map(Number);
24
+ for (let i = 0; i < WSLC_MINIMUM_VERSION.length; i++) {
25
+ const found = parts[i] ?? 0;
26
+ const floor = WSLC_MINIMUM_VERSION[i] ?? 0;
27
+ if (found !== floor)
28
+ return found > floor;
29
+ }
30
+ return true;
31
+ }
32
+ /** 1060 is "service does not exist"; any other failure leaves it unknown. */
33
+ async function serviceExists(runner, name, signal) {
34
+ try {
35
+ await runLimited(runner, 'sc.exe', ['query', name], PROBE_LIMIT_MS.command, { signal });
36
+ return true;
37
+ }
38
+ catch (error) {
39
+ signal?.throwIfAborted();
40
+ if (error instanceof LocalCommandError && /\(1060\)/.test(error.message))
41
+ return false;
42
+ return 'unknown';
43
+ }
44
+ }
45
+ async function hypervisorPresent(runner, signal) {
46
+ try {
47
+ const output = await runLimited(runner, 'powershell.exe', [
48
+ '-NoProfile',
49
+ '-NonInteractive',
50
+ '-Command',
51
+ '(Get-CimInstance Win32_ComputerSystem).HypervisorPresent',
52
+ ], PROBE_LIMIT_MS.powershell, { signal });
53
+ const answer = output.trim().toLowerCase();
54
+ if (answer === 'true')
55
+ return true;
56
+ if (answer === 'false')
57
+ return false;
58
+ return 'unknown';
59
+ }
60
+ catch {
61
+ signal?.throwIfAborted();
62
+ return 'unknown';
63
+ }
64
+ }
65
+ async function wslVersionOf(runner, signal) {
66
+ try {
67
+ return parseWslVersion(await runLimited(runner, 'wsl.exe', ['--version'], PROBE_LIMIT_MS.command, { signal }));
68
+ }
69
+ catch {
70
+ signal?.throwIfAborted();
71
+ return undefined;
72
+ }
73
+ }
74
+ async function wslcVersionOf(runner, binary, signal) {
75
+ try {
76
+ const parsed = parseWslcVersion(await runLimited(runner, binary, ['version'], PROBE_LIMIT_MS.command, { signal }));
77
+ return parsed?.join('.');
78
+ }
79
+ catch (error) {
80
+ signal?.throwIfAborted();
81
+ // Without an answer there is no telling "not installed" from "slow": the
82
+ // state cannot be decided, so say so rather than plan an install.
83
+ if (error instanceof ProbeTimeoutError)
84
+ throw couldNotCheck(error);
85
+ return undefined;
86
+ }
87
+ }
88
+ /** A policy value; a read that did not answer in time cannot be taken as "not set". */
89
+ async function readPolicy(host, name) {
90
+ try {
91
+ return await host.readDword(POLICY_KEY, name);
92
+ }
93
+ catch (error) {
94
+ if (error instanceof ProbeTimeoutError)
95
+ throw couldNotCheck(error);
96
+ throw error;
97
+ }
98
+ }
99
+ /** The state cannot be decided: a plain message the CLI and Desktop show with Details. */
100
+ function couldNotCheck(cause) {
101
+ return new LocalComputerSetupError('Linux container support did not answer, so Namzu could not check this PC. Try again in a moment.', undefined, { cause });
102
+ }
103
+ /**
104
+ * Windows' own markers that a restart is pending. A marker that cannot be
105
+ * read is neither set nor clear: say so, because guessing "clear" would send a
106
+ * PC that only needs a restart to the firmware settings.
107
+ */
108
+ async function windowsWantsRestart(host) {
109
+ let unknown = false;
110
+ for (const key of PENDING_RESTART_KEYS) {
111
+ const set = await host.keyExists(key);
112
+ if (set === true)
113
+ return true;
114
+ if (set === 'unknown')
115
+ unknown = true;
116
+ }
117
+ return unknown ? 'unknown' : false;
118
+ }
119
+ async function bundledOf(manifestPath) {
120
+ if (manifestPath === undefined)
121
+ return undefined;
122
+ try {
123
+ const manifest = await readManifest(manifestPath);
124
+ const archivePath = archivePathOf(manifestPath, manifest);
125
+ await stat(archivePath);
126
+ return { manifestPath, archivePath, imageId: manifest.imageId };
127
+ }
128
+ catch {
129
+ return undefined;
130
+ }
131
+ }
132
+ /** Start the session (wslc image inspect does) and see what answers. */
133
+ async function probeImage(host, binary, ref, expectedId, signal) {
134
+ try {
135
+ const output = await runLimited(host.runner, binary, ['image', 'inspect', '-f', 'json', ref], PROBE_LIMIT_MS.session, { signal });
136
+ const found = parseImageInspect(output);
137
+ if (found === undefined)
138
+ return { kind: 'absent' };
139
+ return expectedId === undefined || found.id === expectedId
140
+ ? { kind: 'loaded' }
141
+ : { kind: 'absent' };
142
+ }
143
+ catch (error) {
144
+ signal?.throwIfAborted();
145
+ const mapped = mapWslcFailure(error);
146
+ if (mapped?.code === 'virtualization-off')
147
+ return { kind: 'state', state: 'virtualization-off' };
148
+ if (mapped?.code === 'blocked-by-policy')
149
+ return { kind: 'state', state: 'blocked-by-policy' };
150
+ if (mapped?.code === 'sdk-mismatch')
151
+ return { kind: 'state', state: 'sdk-mismatch' };
152
+ if (mapped?.code === 'image-missing')
153
+ return { kind: 'absent' };
154
+ // A missing image makes the command exit non-zero with the not-found code
155
+ // or with a bare exit status 1 and no code (observed on wslc 3.0.1, where the PC answers
156
+ // "not found" and nothing else). A command that ran and failed with any
157
+ // other code, or did not start, is the engine failing.
158
+ if (error instanceof LocalCommandError &&
159
+ (error.errorCodes.includes('WSLC_E_IMAGE_NOT_FOUND') ||
160
+ (error.errorCodes.length === 0 && error.exitCode === 1)))
161
+ return { kind: 'absent' };
162
+ throw couldNotCheck(error);
163
+ }
164
+ }
165
+ /**
166
+ * Inspect the PC without changing anything. Without `probeSession` no command
167
+ * runs that starts the wslc session (`wslc version` does not; `ps` and `image`
168
+ * do), so opening a panel never starts a virtual machine.
169
+ */
170
+ export const inspectWslcReadiness = async (options) => {
171
+ const host = createWslcSetupHost(options.host);
172
+ const { signal } = options;
173
+ const checkedAt = host.now().toISOString();
174
+ const bundled = await bundledOf(options.bundledManifestPath);
175
+ const bundledPaths = bundled
176
+ ? { manifestPath: bundled.manifestPath, archivePath: bundled.archivePath }
177
+ : undefined;
178
+ const base = {
179
+ policy: { allowWsl: true, allowWslContainer: true },
180
+ components: {
181
+ virtualMachinePlatform: 'unknown',
182
+ wslOptionalComponent: 'unknown',
183
+ hypervisorPresent: 'unknown',
184
+ },
185
+ wsl: {},
186
+ image: {
187
+ ref: options.imageRef,
188
+ loaded: false,
189
+ ...(bundledPaths ? { bundled: bundledPaths } : {}),
190
+ },
191
+ checkedAt,
192
+ };
193
+ let unsupported;
194
+ if (host.platform !== 'win32')
195
+ unsupported = 'platform';
196
+ else if (host.arch !== 'x64')
197
+ unsupported = 'architecture';
198
+ else if (host.windowsBuild === undefined || host.windowsBuild < MINIMUM_BUILD)
199
+ unsupported = 'windows-build';
200
+ if (unsupported !== undefined || host.windowsBuild === undefined) {
201
+ return {
202
+ state: 'unsupported',
203
+ unsupportedReason: unsupported ?? 'windows-build',
204
+ ...base,
205
+ };
206
+ }
207
+ const build = host.windowsBuild;
208
+ const isWindows11 = build >= WINDOWS_11_BUILD;
209
+ const binary = wslcBinaryOf(host);
210
+ const { runner } = host;
211
+ const [allowWsl, allowContainer, markerRead, hns, vmcompute, lxss, hypervisor, wslVersion, wslcVersion,] = await Promise.all([
212
+ readPolicy(host, 'AllowWSL'),
213
+ readPolicy(host, 'AllowWSLContainer'),
214
+ readRestartMarker(host).then((marker) => ({ marker }), () => ({ marker: undefined, unreadable: true })),
215
+ serviceExists(runner, 'HNS', signal),
216
+ serviceExists(runner, 'vmcompute', signal),
217
+ isWindows11
218
+ ? Promise.resolve('not-needed')
219
+ : serviceExists(runner, 'LxssManager', signal),
220
+ hypervisorPresent(runner, signal),
221
+ wslVersionOf(runner, signal),
222
+ wslcVersionOf(runner, binary, signal),
223
+ ]);
224
+ const policy = { allowWsl: allowWsl !== 0, allowWslContainer: allowContainer !== 0 };
225
+ const vmp = hns === false || vmcompute === false
226
+ ? false
227
+ : hns === true && vmcompute === true
228
+ ? true
229
+ : 'unknown';
230
+ const components = {
231
+ virtualMachinePlatform: vmp,
232
+ wslOptionalComponent: lxss,
233
+ hypervisorPresent: hypervisor,
234
+ };
235
+ let restart;
236
+ let restartUnrecorded = false;
237
+ const { marker } = markerRead;
238
+ let recordedAt = marker?.recordedAt;
239
+ if ('unreadable' in markerRead) {
240
+ // A marker that cannot be read still has a file date, and a restart since
241
+ // then ends it like any other. With no date either, the state cannot be
242
+ // decided: it reads as restart-pending with no record to compare against
243
+ // and no remaining steps, rather than failing the inspection.
244
+ try {
245
+ recordedAt = (await stat(markerPath(host.stateDirectory))).mtime.toISOString();
246
+ }
247
+ catch {
248
+ restartUnrecorded = true;
249
+ }
250
+ }
251
+ if (recordedAt !== undefined) {
252
+ let boot;
253
+ try {
254
+ boot = await host.bootTime();
255
+ }
256
+ catch {
257
+ signal?.throwIfAborted();
258
+ }
259
+ if (boot === undefined)
260
+ restart = { recordedAt };
261
+ else if (boot.getTime() > Date.parse(recordedAt)) {
262
+ try {
263
+ await clearRestartMarker(host);
264
+ }
265
+ catch {
266
+ // A marker that stays is checked again next time; the PC has restarted.
267
+ }
268
+ }
269
+ else
270
+ restart = { recordedAt, bootTime: boot.toISOString() };
271
+ }
272
+ const wsl = {
273
+ ...(wslVersion ? { version: wslVersion } : {}),
274
+ ...(wslcVersion ? { wslcBinary: binary, wslcVersion } : {}),
275
+ };
276
+ const wslcUsable = wslcVersion !== undefined && wslcAtLeastMinimum(wslcVersion);
277
+ let loaded = false;
278
+ if (options.probeSession !== true) {
279
+ const record = await readImageRecord(host);
280
+ loaded =
281
+ record !== undefined &&
282
+ record.imageRef === options.imageRef &&
283
+ (bundled === undefined || record.imageId === bundled.imageId);
284
+ }
285
+ const result = (state, imageLoaded = loaded) => ({
286
+ state,
287
+ windows: { build, architecture: 'x64', isWindows11 },
288
+ policy,
289
+ components,
290
+ wsl,
291
+ image: { ...base.image, loaded: imageLoaded },
292
+ ...(restart ? { restart } : {}),
293
+ checkedAt,
294
+ });
295
+ if (!policy.allowWsl || !policy.allowWslContainer)
296
+ return result('blocked-by-policy');
297
+ if (restart || restartUnrecorded)
298
+ return result('restart-pending');
299
+ if (vmp === false || lxss === false)
300
+ return result('platform-off');
301
+ if (!wslcUsable)
302
+ return result(wslVersion ? 'wsl-outdated' : 'wsl-missing');
303
+ if (vmp === true && hypervisor === false && options.probeSession !== true) {
304
+ // Turning the platform on outside Namzu leaves no hypervisor until the PC
305
+ // restarts; Windows says so in its own markers. Only without one is it the
306
+ // firmware setting. With a probe the session's own failure decides.
307
+ const pending = await windowsWantsRestart(host);
308
+ if (pending === 'unknown')
309
+ throw couldNotCheck(undefined);
310
+ return result(pending ? 'restart-pending' : 'virtualization-off');
311
+ }
312
+ if (options.probeSession === true) {
313
+ const probe = await probeImage(host, binary, options.imageRef, bundled?.imageId, signal);
314
+ if (probe.kind === 'state')
315
+ return result(probe.state);
316
+ loaded = probe.kind === 'loaded';
317
+ }
318
+ return result(loaded ? 'ready' : 'image-missing', loaded);
319
+ };
320
+ //# sourceMappingURL=readiness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/readiness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** Run `reg.exe` with these arguments and return what it printed. */
2
+ export type RegistryRun = (args: readonly string[]) => Promise<string>;
3
+ /**
4
+ * `reg query` exits 1 both for a key that is not there and for one the caller
5
+ * may not read, and its words are localised, so the exit status alone cannot
6
+ * tell them apart. Ask the parent instead: its listing of subkeys names the
7
+ * key in every language. When the parent is absent too, the same test climbs
8
+ * to the grandparent, and so on. A key an ancestor lists but the query cannot
9
+ * read is not absent, and neither is an ancestor that cannot be read or a
10
+ * climb that reaches a hive root without an answer.
11
+ *
12
+ * Returns the key's listing, or undefined when the key is provably absent.
13
+ * Anything else rethrows the failure.
14
+ */
15
+ export declare function queryRegistryKey(run: RegistryRun, key: string): Promise<string | undefined>;
16
+ /** True when a `reg query <key>` listing carries a value of this name. */
17
+ export declare function listingHasValue(listing: string, name: string): boolean;
18
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/registry.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAOtE;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkBjG;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAMtE"}
@@ -0,0 +1,50 @@
1
+ import { LocalCommandError } from '../engine.js';
2
+ function parentOf(key) {
3
+ const cut = key.lastIndexOf('\\');
4
+ return cut > 0 ? key.slice(0, cut) : undefined;
5
+ }
6
+ /**
7
+ * `reg query` exits 1 both for a key that is not there and for one the caller
8
+ * may not read, and its words are localised, so the exit status alone cannot
9
+ * tell them apart. Ask the parent instead: its listing of subkeys names the
10
+ * key in every language. When the parent is absent too, the same test climbs
11
+ * to the grandparent, and so on. A key an ancestor lists but the query cannot
12
+ * read is not absent, and neither is an ancestor that cannot be read or a
13
+ * climb that reaches a hive root without an answer.
14
+ *
15
+ * Returns the key's listing, or undefined when the key is provably absent.
16
+ * Anything else rethrows the failure.
17
+ */
18
+ export async function queryRegistryKey(run, key) {
19
+ try {
20
+ return await run(['query', key]);
21
+ }
22
+ catch (error) {
23
+ if (!(error instanceof LocalCommandError) || error.exitCode !== 1)
24
+ throw error;
25
+ const parent = parentOf(key);
26
+ if (parent === undefined)
27
+ throw error;
28
+ // The parent may itself be absent (no Windows Update key on an offline or
29
+ // managed image): walk up until an ancestor answers.
30
+ const listing = await queryRegistryKey(run, parent);
31
+ if (listing === undefined)
32
+ return undefined;
33
+ const leaf = key.slice(parent.length + 1).toLowerCase();
34
+ const listed = listing
35
+ .split(/\r?\n/)
36
+ .some((line) => line.trim().toLowerCase().endsWith(`\\${leaf}`));
37
+ if (listed)
38
+ throw error;
39
+ return undefined;
40
+ }
41
+ }
42
+ /** True when a `reg query <key>` listing carries a value of this name. */
43
+ export function listingHasValue(listing, name) {
44
+ const wanted = name.toLowerCase();
45
+ return listing.split(/\r?\n/).some((line) => {
46
+ const match = /^\s+(.+?)\s+REG_[A-Z_]+(?:\s|$)/.exec(line);
47
+ return match?.[1]?.toLowerCase() === wanted;
48
+ });
49
+ }
50
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAKhD,SAAS,QAAQ,CAAC,GAAW;IAC5B,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACjC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC/C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAgB,EAAE,GAAW;IACnE,IAAI,CAAC;QACJ,OAAO,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;YAAE,MAAM,KAAK,CAAA;QAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,KAAK,CAAA;QACrC,0EAA0E;QAC1E,qDAAqD;QACrD,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACnD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QACvD,MAAM,MAAM,GAAG,OAAO;aACpB,KAAK,CAAC,OAAO,CAAC;aACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;QACjE,IAAI,MAAM;YAAE,MAAM,KAAK,CAAA;QACvB,OAAO,SAAS,CAAA;IACjB,CAAC;AACF,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAY;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IACjC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,MAAM,CAAA;IAC5C,CAAC,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ClearRestartMarker, ReadRestartMarker, WriteRestartMarker } from './contract.js';
2
+ export declare function markerPath(directory: string): string;
3
+ /** The recorded restart, or undefined when absent or not one this code wrote. */
4
+ export declare const readRestartMarker: ReadRestartMarker;
5
+ /** Temp file plus rename, so a reader never sees half a marker. */
6
+ export declare const writeRestartMarker: WriteRestartMarker;
7
+ export declare const clearRestartMarker: ClearRestartMarker;
8
+ //# sourceMappingURL=restart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/restart.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAGlB,MAAM,eAAe,CAAA;AAUtB,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAiBD,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,EAAE,iBAO/B,CAAA;AAED,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,EAAE,kBAWhC,CAAA;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAEhC,CAAA"}
@@ -0,0 +1,60 @@
1
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ const STEP_KINDS = [
4
+ 'download-wsl',
5
+ 'enable-windows-features',
6
+ 'install-wsl',
7
+ 'restart',
8
+ 'load-image',
9
+ ];
10
+ export function markerPath(directory) {
11
+ return join(directory, 'restart.json');
12
+ }
13
+ function parseMarker(text) {
14
+ let value;
15
+ try {
16
+ value = JSON.parse(text);
17
+ }
18
+ catch {
19
+ return undefined;
20
+ }
21
+ if (typeof value !== 'object' || value === null)
22
+ return undefined;
23
+ const { recordedAt, planId, remaining } = value;
24
+ if (typeof recordedAt !== 'string' || Number.isNaN(Date.parse(recordedAt)))
25
+ return undefined;
26
+ if (typeof planId !== 'string' || !Array.isArray(remaining))
27
+ return undefined;
28
+ if (!remaining.every((step) => STEP_KINDS.includes(step)))
29
+ return undefined;
30
+ return { recordedAt, planId, remaining: remaining };
31
+ }
32
+ /** The recorded restart, or undefined when absent or not one this code wrote. */
33
+ export const readRestartMarker = async (host) => {
34
+ try {
35
+ return parseMarker(await readFile(markerPath(host.stateDirectory), 'utf8'));
36
+ }
37
+ catch (error) {
38
+ if (error.code === 'ENOENT')
39
+ return undefined;
40
+ throw error;
41
+ }
42
+ };
43
+ /** Temp file plus rename, so a reader never sees half a marker. */
44
+ export const writeRestartMarker = async (host, marker) => {
45
+ await mkdir(host.stateDirectory, { recursive: true });
46
+ const target = markerPath(host.stateDirectory);
47
+ const temp = `${target}.${process.pid}.tmp`;
48
+ await writeFile(temp, `${JSON.stringify(marker)}\n`, 'utf8');
49
+ try {
50
+ await rename(temp, target);
51
+ }
52
+ catch (error) {
53
+ await rm(temp, { force: true });
54
+ throw error;
55
+ }
56
+ };
57
+ export const clearRestartMarker = async (host) => {
58
+ await rm(markerPath(host.stateDirectory), { force: true });
59
+ };
60
+ //# sourceMappingURL=restart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restart.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/restart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAShC,MAAM,UAAU,GAAiC;IAChD,cAAc;IACd,yBAAyB;IACzB,aAAa;IACb,SAAS;IACT,YAAY;CACZ,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC3C,OAAO,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAChC,IAAI,KAAc,CAAA;IAClB,IAAI,CAAC;QACJ,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAA;IACjB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAA;IACjE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAgC,CAAA;IAC1E,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5F,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IAC7E,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAyB,CAAC,CAAC;QAAE,OAAO,SAAS,CAAA;IAChG,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAgC,EAAE,CAAA;AAC3E,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAsB,KAAK,EAAE,IAAI,EAAE,EAAE;IAClE,IAAI,CAAC;QACJ,OAAO,WAAW,CAAC,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;QACxE,MAAM,KAAK,CAAA;IACZ,CAAC;AACF,CAAC,CAAA;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAuB,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAC5E,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,MAAM,CAAA;IAC3C,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC5D,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/B,MAAM,KAAK,CAAA;IACZ,CAAC;AACF,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAuB,KAAK,EAAE,IAAI,EAAE,EAAE;IACpE,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3D,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import type { ClearResumeAtSignIn, RegisterResumeAtSignIn } from './contract.js';
2
+ /**
3
+ * Ask Windows to run `command` once at the next sign-in by writing the
4
+ * `NamzuPalComputerSetup` value (REG_SZ) under `host.resumeRegistryKey`. No
5
+ * administrator is needed for the default per-user key. Windows deletes a
6
+ * RunOnce value just before it runs it; writing the value again replaces it.
7
+ */
8
+ export declare const registerResumeAtSignIn: RegisterResumeAtSignIn;
9
+ /**
10
+ * Take the command back. A value that is not there is not an error; a key
11
+ * that cannot be read is, because the command might still be registered.
12
+ */
13
+ export declare const clearResumeAtSignIn: ClearResumeAtSignIn;
14
+ //# sourceMappingURL=resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/resume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,sBAAsB,EAAiB,MAAM,eAAe,CAAA;AA6B/F;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,EAAE,sBAcpC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBASjC,CAAA"}
@@ -0,0 +1,58 @@
1
+ import { listingHasValue, queryRegistryKey } from './registry.js';
2
+ import { trustedWindowsDirectory } from './windows-folder.js';
3
+ /** The registry value the resume command is stored under. */
4
+ const RESUME_VALUE_NAME = 'NamzuPalComputerSetup';
5
+ /** Windows runs a RunOnce command line of at most this many characters. */
6
+ const MAX_COMMAND_LENGTH = 2048;
7
+ function regBinary(host) {
8
+ return `${trustedWindowsDirectory(host.env)}\\System32\\reg.exe`;
9
+ }
10
+ function checkKey(key) {
11
+ if (!/^HK(CU|LM|CR|U|CC)\\[^\r\n\0"]+$/.test(key)) {
12
+ throw new Error('The sign-in registry key is not a valid registry path.');
13
+ }
14
+ }
15
+ function checkCommand(command) {
16
+ if (command.trim().length === 0)
17
+ throw new Error('The sign-in command is empty.');
18
+ if (command.length > MAX_COMMAND_LENGTH) {
19
+ throw new Error(`The sign-in command is longer than ${MAX_COMMAND_LENGTH} characters.`);
20
+ }
21
+ if (/[\r\n\0]/.test(command)) {
22
+ throw new Error('The sign-in command must be a single line.');
23
+ }
24
+ }
25
+ /**
26
+ * Ask Windows to run `command` once at the next sign-in by writing the
27
+ * `NamzuPalComputerSetup` value (REG_SZ) under `host.resumeRegistryKey`. No
28
+ * administrator is needed for the default per-user key. Windows deletes a
29
+ * RunOnce value just before it runs it; writing the value again replaces it.
30
+ */
31
+ export const registerResumeAtSignIn = async (host, command) => {
32
+ checkKey(host.resumeRegistryKey);
33
+ checkCommand(command);
34
+ await host.runner.run(regBinary(host), [
35
+ 'add',
36
+ host.resumeRegistryKey,
37
+ '/v',
38
+ RESUME_VALUE_NAME,
39
+ '/t',
40
+ 'REG_SZ',
41
+ '/d',
42
+ command,
43
+ '/f',
44
+ ]);
45
+ };
46
+ /**
47
+ * Take the command back. A value that is not there is not an error; a key
48
+ * that cannot be read is, because the command might still be registered.
49
+ */
50
+ export const clearResumeAtSignIn = async (host) => {
51
+ checkKey(host.resumeRegistryKey);
52
+ const reg = regBinary(host);
53
+ const listing = await queryRegistryKey((args) => host.runner.run(reg, [...args]), host.resumeRegistryKey);
54
+ if (listing === undefined || !listingHasValue(listing, RESUME_VALUE_NAME))
55
+ return;
56
+ await host.runner.run(reg, ['delete', host.resumeRegistryKey, '/v', RESUME_VALUE_NAME, '/f']);
57
+ };
58
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/resume.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAE7D,6DAA6D;AAC7D,MAAM,iBAAiB,GAAG,uBAAuB,CAAA;AACjD,2EAA2E;AAC3E,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAE/B,SAAS,SAAS,CAAC,IAAmB;IACrC,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAA;AACjE,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC5B,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;IAC1E,CAAC;AACF,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACpC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IACjF,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,sCAAsC,kBAAkB,cAAc,CAAC,CAAA;IACxF,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC9D,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IACrF,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAChC,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACtC,KAAK;QACL,IAAI,CAAC,iBAAiB;QACtB,IAAI;QACJ,iBAAiB;QACjB,IAAI;QACJ,QAAQ;QACR,IAAI;QACJ,OAAO;QACP,IAAI;KACJ,CAAC,CAAA;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAwB,KAAK,EAAE,IAAI,EAAE,EAAE;IACtE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAChC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC3B,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACrC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EACzC,IAAI,CAAC,iBAAiB,CACtB,CAAA;IACD,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC;QAAE,OAAM;IACjF,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAA;AAC9F,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { RunWslcSetup } from './contract.js';
2
+ /**
3
+ * Run the plan the person agreed to. Inspects again first, with the session
4
+ * probe, and refuses with `plan-changed` when the plan it would run is not the
5
+ * one named by the consent.
6
+ */
7
+ export declare const runWslcSetup: RunWslcSetup;
8
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/local-virtual-computer/setup/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EAMZ,MAAM,eAAe,CAAA;AA4BtB;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,YAwL1B,CAAA"}