runpane 2.4.183 → 2.4.185

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 (50) hide show
  1. package/README.md +64 -2
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +5 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands.d.ts +3 -0
  6. package/dist/commands.d.ts.map +1 -1
  7. package/dist/commands.js +28 -0
  8. package/dist/commands.js.map +1 -1
  9. package/dist/docs-index.json +1 -1
  10. package/dist/generated/contract.d.ts +25 -13
  11. package/dist/generated/contract.d.ts.map +1 -1
  12. package/dist/generated/contract.js +44 -23
  13. package/dist/generated/contract.js.map +1 -1
  14. package/dist/update.d.ts +9 -0
  15. package/dist/update.d.ts.map +1 -0
  16. package/dist/update.js +312 -0
  17. package/dist/update.js.map +1 -0
  18. package/dist/updateArtifacts.d.ts +12 -0
  19. package/dist/updateArtifacts.d.ts.map +1 -0
  20. package/dist/updateArtifacts.js +112 -0
  21. package/dist/updateArtifacts.js.map +1 -0
  22. package/dist/updateCapacity.d.ts +5 -0
  23. package/dist/updateCapacity.d.ts.map +1 -0
  24. package/dist/updateCapacity.js +72 -0
  25. package/dist/updateCapacity.js.map +1 -0
  26. package/dist/updateOperation.d.ts +48 -0
  27. package/dist/updateOperation.d.ts.map +1 -0
  28. package/dist/updateOperation.js +208 -0
  29. package/dist/updateOperation.js.map +1 -0
  30. package/dist/updatePackage.d.ts +14 -0
  31. package/dist/updatePackage.d.ts.map +1 -0
  32. package/dist/updatePackage.js +103 -0
  33. package/dist/updatePackage.js.map +1 -0
  34. package/dist/updatePreflight.d.ts +46 -0
  35. package/dist/updatePreflight.d.ts.map +1 -0
  36. package/dist/updatePreflight.js +134 -0
  37. package/dist/updatePreflight.js.map +1 -0
  38. package/dist/updatePython.d.ts +16 -0
  39. package/dist/updatePython.d.ts.map +1 -0
  40. package/dist/updatePython.js +46 -0
  41. package/dist/updatePython.js.map +1 -0
  42. package/dist/updateRuntime.d.ts +3 -0
  43. package/dist/updateRuntime.d.ts.map +1 -0
  44. package/dist/updateRuntime.js +61 -0
  45. package/dist/updateRuntime.js.map +1 -0
  46. package/dist/updateSupervisor.d.ts +13 -0
  47. package/dist/updateSupervisor.d.ts.map +1 -0
  48. package/dist/updateSupervisor.js +103 -0
  49. package/dist/updateSupervisor.js.map +1 -0
  50. package/package.json +1 -1
@@ -0,0 +1,9 @@
1
+ import type { ParsedArgs } from './commands';
2
+ import { stageApp } from './updateArtifacts';
3
+ export declare function runUpdate(parsed: ParsedArgs): Promise<number>;
4
+ /** Entry point executed solely from the independently staged code and runtime. */
5
+ export interface UpdateArtifactStager {
6
+ stageApplication: typeof stageApp;
7
+ }
8
+ export declare function runUpdateHelper(directory: string, artifacts?: UpdateArtifactStager): Promise<number>;
9
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C,OAAO,EAAE,QAAQ,EAAoC,MAAM,mBAAmB,CAAC;AA+B/E,wBAAsB,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAmDnE;AAWD,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,OAAO,QAAQ,CAAC;CACnC;AAED,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,oBAAqD,GAAG,OAAO,CAAC,MAAM,CAAC,CA4I1I"}
package/dist/update.js ADDED
@@ -0,0 +1,312 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runUpdate = runUpdate;
7
+ exports.runUpdateHelper = runUpdateHelper;
8
+ const updateCapacity_1 = require("./updateCapacity");
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const node_crypto_1 = require("node:crypto");
12
+ const node_child_process_1 = require("node:child_process");
13
+ const boundaryDecoder_1 = require("./boundaryDecoder");
14
+ const daemonClient_1 = require("./daemonClient");
15
+ const errors_1 = require("./errors");
16
+ const updatePreflight_1 = require("./updatePreflight");
17
+ const updateRuntime_1 = require("./updateRuntime");
18
+ const updateSupervisor_1 = require("./updateSupervisor");
19
+ const updateOperation_1 = require("./updateOperation");
20
+ const updatePackage_1 = require("./updatePackage");
21
+ const updatePython_1 = require("./updatePython");
22
+ const updateArtifacts_1 = require("./updateArtifacts");
23
+ const preflightSchema = boundaryDecoder_1.boundary.object({
24
+ machine: boundaryDecoder_1.boundary.nonEmptyString, paneDir: boundaryDecoder_1.boundary.nonEmptyString,
25
+ scope: boundaryDecoder_1.boundary.enumeration('both', 'pane', 'cli'), requestedVersion: boundaryDecoder_1.boundary.nonEmptyString,
26
+ host: boundaryDecoder_1.boundary.nullable(updatePreflight_1.updateHostSchema),
27
+ cli: boundaryDecoder_1.boundary.nullable(boundaryDecoder_1.boundary.object({ owner: boundaryDecoder_1.boundary.enumeration('managed', 'npm', 'pip'), entrypoint: boundaryDecoder_1.boundary.nonEmptyString, version: boundaryDecoder_1.boundary.nonEmptyString, prefix: boundaryDecoder_1.boundary.nonEmptyString, packageManager: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.nonEmptyString), pipUser: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.boolean) })),
28
+ disableOsIntegration: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.boolean),
29
+ npmSource: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.nonEmptyString),
30
+ runtimeSource: boundaryDecoder_1.boundary.nonEmptyString, lockDirectory: boundaryDecoder_1.boundary.nonEmptyString, additionalLockDirectories: boundaryDecoder_1.boundary.array(boundaryDecoder_1.boundary.nonEmptyString),
31
+ limitations: boundaryDecoder_1.boundary.array(boundaryDecoder_1.boundary.string),
32
+ });
33
+ const stagedSchema = boundaryDecoder_1.boundary.object({
34
+ app: boundaryDecoder_1.boundary.nullable(boundaryDecoder_1.boundary.object({ version: boundaryDecoder_1.boundary.string, artifact: boundaryDecoder_1.boundary.string, installPath: boundaryDecoder_1.boundary.string, backupPath: boundaryDecoder_1.boundary.string, sha256: boundaryDecoder_1.boundary.string })),
35
+ cli: boundaryDecoder_1.boundary.nullable(boundaryDecoder_1.boundary.object({ version: boundaryDecoder_1.boundary.string, archive: boundaryDecoder_1.boundary.string, packageRoot: boundaryDecoder_1.boundary.string })),
36
+ npm: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.string),
37
+ });
38
+ const terminal = (journal) => ['complete', 'needs-attention', 'failed'].includes(journal.phase);
39
+ const pause = (ms) => new Promise(resolve => setTimeout(resolve, ms));
40
+ function operationDirectory(paneDir, id) {
41
+ if (!/^[a-zA-Z0-9-]{1,80}$/.test(id))
42
+ throw new errors_1.RunpaneError('ERR_UPDATE_ID', 'Invalid update operation ID. Nothing was changed.', 'Use the ID returned by runpane update.');
43
+ return node_path_1.default.join(paneDir, 'updates', id);
44
+ }
45
+ function processExists(pid) {
46
+ try {
47
+ process.kill(pid, 0);
48
+ return true;
49
+ }
50
+ catch (error) {
51
+ const code = (0, boundaryDecoder_1.decodeBoundary)(error, boundaryDecoder_1.boundary.object({ code: boundaryDecoder_1.boundary.optional(boundaryDecoder_1.boundary.string) })).code;
52
+ if (code === 'ESRCH')
53
+ return false;
54
+ throw error;
55
+ }
56
+ }
57
+ async function runUpdate(parsed) {
58
+ const paneDir = node_path_1.default.resolve((0, daemonClient_1.resolvePaneDirectory)(parsed.paneDir));
59
+ if (parsed.updateStatus)
60
+ return presentUpdate(node_path_1.default.join(operationDirectory(paneDir, parsed.updateStatus), 'status.json'), parsed);
61
+ const preflight = await (0, updatePreflight_1.preflightUpdate)(parsed, parsed.updateScope ?? 'both');
62
+ if (parsed.dryRun) {
63
+ console.log(JSON.stringify({ preflight, changed: false }, null, 2));
64
+ return 0;
65
+ }
66
+ if (!parsed.json)
67
+ console.log(`Updating ${preflight.scope} on ${preflight.machine}. Pane: ${preflight.host?.executable ?? 'not selected'}; CLI: ${preflight.cli ? `${preflight.cli.owner} ${preflight.cli.entrypoint}` : 'not selected'}.`);
68
+ const id = (0, node_crypto_1.randomUUID)();
69
+ const directory = operationDirectory(paneDir, id);
70
+ const file = node_path_1.default.join(directory, 'status.json');
71
+ (0, updateOperation_1.writeUpdateJson)(file, { id, host: preflight.machine, scope: preflight.scope, version: preflight.requestedVersion, phase: 'accepted', completed: [], setupPid: process.pid, setupExpiresAt: Date.now() + 120_000, updatedAt: new Date().toISOString(), appUpdated: false, cliUpdated: false, hostReachable: false, restored: [] });
72
+ const acquired = [];
73
+ try {
74
+ for (const target of [...new Set([preflight.lockDirectory, ...preflight.additionalLockDirectories])].sort()) {
75
+ const lock = (0, updateOperation_1.claimUpdateLock)(target, id, file);
76
+ if (!lock.acquired) {
77
+ for (const owned of acquired)
78
+ (0, updateOperation_1.releaseUpdateLock)(owned, id);
79
+ return presentUpdate(lock.statusFile, parsed);
80
+ }
81
+ acquired.push(target);
82
+ }
83
+ }
84
+ catch (error) {
85
+ for (const owned of acquired)
86
+ (0, updateOperation_1.releaseUpdateLock)(owned, id);
87
+ throw error;
88
+ }
89
+ node_fs_1.default.mkdirSync(directory, { recursive: true, mode: 0o700 });
90
+ try {
91
+ const runtime = (0, updateRuntime_1.stageUpdateRuntime)(preflight.runtimeSource, node_path_1.default.join(directory, 'runtime'));
92
+ const helper = (0, updatePackage_1.stageUpdateCode)(process.argv[1], node_path_1.default.join(directory, 'helper'));
93
+ (0, updateOperation_1.writeUpdateJson)(node_path_1.default.join(directory, 'preflight.json'), { ...preflight, runtimeSource: runtime });
94
+ // Verify the staged helper can load every runtime import without depending
95
+ // on the active npm package or the installed Electron executable.
96
+ (0, node_child_process_1.execFileSync)(runtime, [helper, '--version'], { timeout: 15_000, env: { ...process.env, ELECTRON_RUN_AS_NODE: '' } });
97
+ (0, updateSupervisor_1.startUpdateSupervisor)({ id, directory, executable: runtime, args: [helper, '__update-runner', directory] });
98
+ const deadline = Date.now() + 20_000;
99
+ while (!(0, updateOperation_1.readUpdateJournal)(file).helperPid && Date.now() < deadline)
100
+ await pause(100);
101
+ if (!(0, updateOperation_1.readUpdateJournal)(file).helperPid)
102
+ throw new errors_1.RunpaneError('ERR_UPDATE_HELPER_NOT_READY', 'The supervisor did not acknowledge startup. Pane was not shut down.', `Inspect ${directory} and retry after resolving the supervisor error.`);
103
+ }
104
+ catch (error) {
105
+ // A queued task must not wake later and shut down a host after its caller
106
+ // reported failure. Fence independently of the mutable journal: a helper
107
+ // may be publishing its acknowledgment concurrently with this failure.
108
+ (0, updateOperation_1.writeUpdateJson)(node_path_1.default.join(directory, 'canceled.json'), { id, reason: error instanceof Error ? error.message : String(error) });
109
+ // A supervisor command can fail after launching its task. Once the helper
110
+ // acknowledged, it owns reconciliation and any post-shutdown locks; never
111
+ // overwrite its progress or release those locks from the requesting CLI.
112
+ if ((0, updateOperation_1.readUpdateJournal)(file).helperPid)
113
+ return presentUpdate(file, parsed);
114
+ (0, updateOperation_1.writeUpdateJson)(file, { ...(0, updateOperation_1.readUpdateJournal)(file), phase: 'failed', error: error instanceof Error ? error.message : String(error) });
115
+ try {
116
+ (0, updateSupervisor_1.removeUpdateSupervisor)(id);
117
+ }
118
+ catch { /* the operation is durably failed */ }
119
+ for (const lock of [preflight.lockDirectory, ...preflight.additionalLockDirectories])
120
+ (0, updateOperation_1.releaseUpdateLock)(lock, id);
121
+ throw error;
122
+ }
123
+ return presentUpdate(file, parsed);
124
+ }
125
+ async function presentUpdate(file, parsed) {
126
+ let journal = (0, updateOperation_1.readUpdateJournal)(file);
127
+ if (parsed.updateWait) {
128
+ while (!terminal(journal)) {
129
+ await pause(500);
130
+ journal = (0, updateOperation_1.readUpdateJournal)(file);
131
+ }
132
+ }
133
+ console.log(JSON.stringify({ ...journal, statusFile: file, next: `runpane update --status ${journal.id} --pane-dir ${JSON.stringify(node_path_1.default.dirname(node_path_1.default.dirname(node_path_1.default.dirname(file))))} --wait --json` }, null, 2));
134
+ return journal.phase === 'failed' || journal.phase === 'needs-attention' ? 1 : 0;
135
+ }
136
+ async function runUpdateHelper(directory, artifacts = { stageApplication: updateArtifacts_1.stageApp }) {
137
+ const file = node_path_1.default.join(directory, 'status.json');
138
+ const preflight = (0, boundaryDecoder_1.decodeBoundary)(JSON.parse(node_fs_1.default.readFileSync(node_path_1.default.join(directory, 'preflight.json'), 'utf8')), preflightSchema);
139
+ const options = { paneDir: preflight.paneDir, timeoutMs: 15_000 };
140
+ const host = preflight.host;
141
+ const id = (0, updateOperation_1.readUpdateJournal)(file).id;
142
+ if (node_path_1.default.resolve(directory) !== operationDirectory(preflight.paneDir, id))
143
+ throw new Error('Update operation path does not match its target.');
144
+ const request = { id, bootId: host?.bootId ?? '' };
145
+ const manifest = node_path_1.default.join(directory, 'staged.json');
146
+ const result = await (0, updateOperation_1.executeUpdate)(file, { run: async (step, journal) => {
147
+ if (step === 'stage') {
148
+ (0, updateSupervisor_1.checkUpdateSupervisor)();
149
+ if (node_fs_1.default.existsSync(manifest)) {
150
+ const staged = (0, boundaryDecoder_1.decodeBoundary)(JSON.parse(node_fs_1.default.readFileSync(manifest, 'utf8')), stagedSchema);
151
+ return { version: staged.app?.version ?? staged.cli.version };
152
+ }
153
+ for (const folder of ['app', 'cli'])
154
+ node_fs_1.default.rmSync(node_path_1.default.join(directory, folder), { recursive: true, force: true });
155
+ let app = null;
156
+ let cli = null;
157
+ const npm = preflight.npmSource;
158
+ if (host)
159
+ app = await artifacts.stageApplication(host, preflight.requestedVersion, node_path_1.default.join(directory, 'app'));
160
+ if (preflight.cli)
161
+ cli = preflight.cli.owner === 'pip'
162
+ ? (0, updatePython_1.stagePythonCli)(preflight.cli.packageManager, app?.version ?? preflight.requestedVersion, node_path_1.default.join(directory, 'cli'))
163
+ : (0, updatePackage_1.stageCliPackage)(preflight.runtimeSource, npm, app?.version ?? preflight.requestedVersion, node_path_1.default.join(directory, 'cli'));
164
+ if (preflight.cli?.owner === 'pip' && cli)
165
+ (0, node_child_process_1.execFileSync)(preflight.cli.packageManager, ['-m', 'pip', 'install', '--dry-run', '--no-index', '--no-deps', ...(preflight.cli.pipUser ? ['--user'] : []), cli.archive], { timeout: 30_000, stdio: 'pipe' });
166
+ (0, updateOperation_1.writeUpdateJson)(manifest, { app, cli, npm });
167
+ return { version: app?.version ?? cli.version };
168
+ }
169
+ const staged = (0, boundaryDecoder_1.decodeBoundary)(JSON.parse(node_fs_1.default.readFileSync(manifest, 'utf8')), stagedSchema);
170
+ if (step === 'checkpoint' && host) {
171
+ (0, updateCapacity_1.assertUpdateCapacity)(preflight.paneDir, host, staged.app.installPath, preflight.cli?.prefix);
172
+ const current = await (0, daemonClient_1.invokeDaemon)('runpane:update:host', [], updatePreflight_1.updateHostSchema, options);
173
+ if (current.bootId !== host.bootId || current.executable !== host.executable || current.endpointFingerprint !== host.endpointFingerprint)
174
+ throw new Error('The target host changed after preflight. Pane remains running.');
175
+ await (0, daemonClient_1.invokeDaemon)('runpane:update:checkpoint', [request], boundaryDecoder_1.boundary.jsonObject, options);
176
+ }
177
+ if (step === 'stop' && host) {
178
+ // Reconcile an acknowledged stop after a helper restart. Never kill a
179
+ // reused PID, another Pane installation, or a replacement daemon.
180
+ if (processExists(host.pid)) {
181
+ try {
182
+ await (0, daemonClient_1.invokeDaemon)('runpane:update:stop', [request], boundaryDecoder_1.boundary.object({ accepted: boundaryDecoder_1.boundary.boolean }), options);
183
+ }
184
+ catch (error) {
185
+ if (processExists(host.pid))
186
+ throw error;
187
+ }
188
+ }
189
+ const deadline = Date.now() + 30_000;
190
+ while (processExists(host.pid) && Date.now() < deadline)
191
+ await pause(200);
192
+ if (processExists(host.pid))
193
+ throw new Error('Pane did not exit within 30 seconds. No installer was started. Inspect the host before retrying.');
194
+ (0, updateOperation_1.assertUpdateQuiescence)(directory, { id, bootId: host.bootId, pid: host.pid });
195
+ }
196
+ if (step === 'snapshot' && host) {
197
+ const snapshot = node_path_1.default.join(directory, 'snapshot');
198
+ const ready = node_path_1.default.join(snapshot, 'complete.json');
199
+ if (!node_fs_1.default.existsSync(ready)) {
200
+ node_fs_1.default.rmSync(snapshot, { recursive: true, force: true });
201
+ node_fs_1.default.mkdirSync(snapshot, { recursive: true, mode: 0o700 });
202
+ for (const [name, source] of [['data', host.paneDir], ['profile', host.userData]]) {
203
+ const target = node_path_1.default.join(snapshot, name);
204
+ node_fs_1.default.mkdirSync(target, { recursive: true, mode: 0o700 });
205
+ for (const entry of node_fs_1.default.readdirSync(source)) {
206
+ if (source === host.paneDir && entry === 'updates')
207
+ continue;
208
+ node_fs_1.default.cpSync(node_path_1.default.join(source, entry), node_path_1.default.join(target, entry), { recursive: true, verbatimSymlinks: true, filter: file => !node_fs_1.default.lstatSync(file).isSocket() && !node_path_1.default.basename(file).startsWith('Singleton') });
209
+ }
210
+ }
211
+ (0, updateOperation_1.writeUpdateJson)(ready, { version: host.version, createdAt: new Date().toISOString() });
212
+ }
213
+ }
214
+ if (step === 'install') {
215
+ if (staged.app) {
216
+ (0, updateArtifacts_1.installStagedApp)(staged.app);
217
+ (0, updateOperation_1.writeUpdateJson)(file, { ...(0, updateOperation_1.readUpdateJournal)(file), appUpdated: true });
218
+ }
219
+ if (staged.cli && preflight.cli) {
220
+ if (preflight.cli.owner === 'pip')
221
+ (0, updatePython_1.installPythonCli)(preflight.cli.packageManager, staged.cli.archive, preflight.cli.pipUser ?? false);
222
+ else if (preflight.cli.owner === 'npm')
223
+ (0, updatePackage_1.runNpm)(preflight.runtimeSource, staged.npm, ['install', '--global', '--prefix', preflight.cli.prefix, '--ignore-scripts', '--offline', staged.cli.archive]);
224
+ else {
225
+ const target = node_path_1.default.join(preflight.cli.prefix, 'cli', id);
226
+ const packageRoot = node_path_1.default.join(target, 'package');
227
+ node_fs_1.default.mkdirSync(target, { recursive: true, mode: 0o700 });
228
+ node_fs_1.default.cpSync(staged.cli.packageRoot, packageRoot, { recursive: true });
229
+ const runtimeDirectory = node_path_1.default.join(target, 'runtime');
230
+ const runtime = node_fs_1.default.existsSync(runtimeDirectory) ? node_path_1.default.join(runtimeDirectory, process.platform === 'win32' ? 'node.exe' : 'node') : (0, updateRuntime_1.stageUpdateRuntime)(preflight.runtimeSource, runtimeDirectory);
231
+ (0, updatePackage_1.activateManagedCli)(preflight.paneDir, staged.cli.version, node_path_1.default.join(packageRoot, 'dist/cli.js'), runtime);
232
+ }
233
+ }
234
+ return { appUpdated: Boolean(staged.app), cliUpdated: Boolean(staged.cli) };
235
+ }
236
+ if (step === 'launch' && host) {
237
+ let running = false;
238
+ try {
239
+ const current = await (0, daemonClient_1.invokeDaemon)('runpane:update:host', [], updatePreflight_1.updateHostSchema, options);
240
+ running = current.bootId !== host.bootId;
241
+ }
242
+ catch { /* expected after shutdown */ }
243
+ if (!running) {
244
+ const env = { PANE_DIR: preflight.paneDir };
245
+ if (preflight.disableOsIntegration)
246
+ env.PANE_DISABLE_OS_INTEGRATION = '1';
247
+ delete env.ELECTRON_RUN_AS_NODE;
248
+ if (process.platform === 'darwin') {
249
+ (0, node_child_process_1.execFileSync)('/usr/bin/open', ['-n', '-a', node_path_1.default.resolve(host.executable, '../../..'), '--env', `PANE_DIR=${preflight.paneDir}`, ...(preflight.disableOsIntegration ? ['--env', 'PANE_DISABLE_OS_INTEGRATION=1'] : []), '--args', `--user-data-dir=${host.userData}`], { timeout: 30_000 });
250
+ }
251
+ else {
252
+ // Relaunch has its own supervisor lifetime. Completing/removing the
253
+ // updater task must not tear down the new app with the helper's job.
254
+ const launcher = node_path_1.default.join(directory, 'launch-app.cjs');
255
+ node_fs_1.default.writeFileSync(launcher, `const {spawn}=require('node:child_process');const env={...process.env,...${JSON.stringify(env)}};delete env.ELECTRON_RUN_AS_NODE;const child=spawn(${JSON.stringify(host.executable)},${JSON.stringify([`--user-data-dir=${host.userData}`])},{stdio:'ignore',env});child.on('error',()=>process.exit(1));child.on('exit',code=>process.exit(code||0));`, { mode: 0o600 });
256
+ (0, updateSupervisor_1.startUpdateSupervisor)({ id: `${id}-app`, directory, executable: preflight.runtimeSource, args: [launcher] });
257
+ }
258
+ }
259
+ }
260
+ if (step === 'health' && staged.cli && preflight.cli) {
261
+ const actual = preflight.cli.owner === 'pip'
262
+ ? (0, updatePython_1.identifyPythonCli)(preflight.cli.packageManager, preflight.cli.entrypoint).version
263
+ : (0, node_child_process_1.execFileSync)(preflight.runtimeSource, [preflight.cli.owner === 'managed' ? node_path_1.default.join(preflight.cli.prefix, 'cli', id, 'package/dist/cli.js') : preflight.cli.entrypoint, '--version'], { encoding: 'utf8', timeout: 15_000 }).trim().split(/\s+/).pop();
264
+ if (actual !== staged.cli.version)
265
+ throw new Error(`The active CLI reports ${actual}, expected ${staged.cli.version}.`);
266
+ }
267
+ if (step === 'health' && host) {
268
+ const deadline = Date.now() + 90_000;
269
+ let failure = '';
270
+ while (Date.now() < deadline) {
271
+ try {
272
+ const current = await (0, daemonClient_1.invokeDaemon)('runpane:update:host', [], updatePreflight_1.updateHostSchema, options);
273
+ if (!current.remoteHealthy || current.bootId === host.bootId || current.version !== journal.version || current.paneDir !== host.paneDir || current.userData !== host.userData || current.executable !== host.executable || current.endpointFingerprint !== host.endpointFingerprint)
274
+ throw new Error('Relaunched host version, identity, or endpoint/auth configuration does not match.');
275
+ if (process.platform === 'win32')
276
+ (0, updateSupervisor_1.removeUpdateSupervisor)(`${id}-app`);
277
+ return { hostReachable: true };
278
+ }
279
+ catch (error) {
280
+ failure = error instanceof Error ? error.message : String(error);
281
+ await pause(500);
282
+ }
283
+ }
284
+ throw new Error(`The new host failed its health check: ${failure}. The data snapshot is preserved; no automatic database downgrade was attempted.`);
285
+ }
286
+ if (step === 'restore' && host) {
287
+ const deadline = Date.now() + 30 * 60_000;
288
+ while (Date.now() < deadline) {
289
+ const progress = await (0, daemonClient_1.invokeDaemon)('runpane:update:restore', [{ id }], boundaryDecoder_1.boundary.object({ complete: boundaryDecoder_1.boundary.boolean, restored: boundaryDecoder_1.boundary.array(boundaryDecoder_1.boundary.object({ panelId: boundaryDecoder_1.boundary.string, outcome: boundaryDecoder_1.boundary.string, reason: boundaryDecoder_1.boundary.string })) }), options);
290
+ (0, updateOperation_1.writeUpdateJson)(file, { ...(0, updateOperation_1.readUpdateJournal)(file), restored: progress.restored });
291
+ if (progress.complete)
292
+ return { restored: progress.restored };
293
+ await pause(500);
294
+ }
295
+ throw new Error('Panel restoration exceeded its deadline. Durable per-panel progress is preserved; inspect the operation before taking further action.');
296
+ }
297
+ return {};
298
+ } });
299
+ if (terminal(result)) {
300
+ // Keep failed-after-shutdown ownership for inspection; a new operation must
301
+ // not overwrite the recovery evidence or start a second installer.
302
+ if (result.phase === 'complete' || result.phase === 'failed')
303
+ for (const lock of [preflight.lockDirectory, ...preflight.additionalLockDirectories])
304
+ (0, updateOperation_1.releaseUpdateLock)(lock, id);
305
+ try {
306
+ (0, updateSupervisor_1.removeUpdateSupervisor)(id);
307
+ }
308
+ catch { /* terminal journal prevents another execution */ }
309
+ }
310
+ return result.phase === 'complete' ? 0 : 1;
311
+ }
312
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":";;;;;AA8CA,8BAmDC;AAgBD,0CA4IC;AA7PD,qDAAwD;AACxD,sDAAyB;AACzB,0DAA6B;AAC7B,6CAAyC;AACzC,2DAAkD;AAElD,uDAA6D;AAC7D,iDAAoE;AACpE,qCAAwC;AACxC,uDAAsE;AACtE,mDAAqD;AACrD,yDAA0G;AAC1G,uDAAsK;AACtK,mDAA+G;AAC/G,iDAAqF;AACrF,uDAA+E;AAE/E,MAAM,eAAe,GAAG,0BAAQ,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,0BAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,0BAAQ,CAAC,cAAc;IAClE,KAAK,EAAE,0BAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,gBAAgB,EAAE,0BAAQ,CAAC,cAAc;IAC7F,IAAI,EAAE,0BAAQ,CAAC,QAAQ,CAAC,kCAAgB,CAAC;IACzC,GAAG,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,0BAAQ,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,UAAU,EAAE,0BAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,0BAAQ,CAAC,cAAc,EAAE,MAAM,EAAE,0BAAQ,CAAC,cAAc,EAAE,cAAc,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACnT,oBAAoB,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,OAAO,CAAC;IACzD,SAAS,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,cAAc,CAAC;IACrD,aAAa,EAAE,0BAAQ,CAAC,cAAc,EAAE,aAAa,EAAE,0BAAQ,CAAC,cAAc,EAAE,yBAAyB,EAAE,0BAAQ,CAAC,KAAK,CAAC,0BAAQ,CAAC,cAAc,CAAC;IAClJ,WAAW,EAAE,0BAAQ,CAAC,KAAK,CAAC,0BAAQ,CAAC,MAAM,CAAC;CAC7C,CAAC,CAAC;AACH,MAAM,YAAY,GAAG,0BAAQ,CAAC,MAAM,CAAC;IACnC,GAAG,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,0BAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,0BAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,0BAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,0BAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,0BAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpL,GAAG,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,0BAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,0BAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,0BAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7H,GAAG,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,MAAM,CAAC;CACxC,CAAC,CAAC;AACH,MAAM,QAAQ,GAAG,CAAC,OAAsB,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC/G,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACpF,SAAS,kBAAkB,CAAC,OAAe,EAAE,EAAU;IACrD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,qBAAY,CAAC,eAAe,EAAE,mDAAmD,EAAE,wCAAwC,CAAC,CAAC;IAC7K,OAAO,mBAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AACD,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,IAAA,gCAAc,EAAC,KAAK,EAAE,0BAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,0BAAQ,CAAC,QAAQ,CAAC,0BAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvG,IAAI,IAAI,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACnC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,MAAkB;IAChD,MAAM,OAAO,GAAG,mBAAI,CAAC,OAAO,CAAC,IAAA,mCAAoB,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,YAAY;QAAE,OAAO,aAAa,CAAC,mBAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;IAClI,MAAM,SAAS,GAAG,MAAM,IAAA,iCAAe,EAAC,MAAM,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;IAC9E,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACrG,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC,OAAO,WAAW,SAAS,CAAC,IAAI,EAAE,UAAU,IAAI,cAAc,UAAU,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;IAC5O,MAAM,EAAE,GAAG,IAAA,wBAAU,GAAE,CAAC;IACxB,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACjD,IAAA,iCAAe,EAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,gBAAgB,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAClU,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,yBAAyB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5G,MAAM,IAAI,GAAG,IAAA,iCAAe,EAAC,MAAM,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,KAAK,MAAM,KAAK,IAAI,QAAQ;oBAAE,IAAA,mCAAiB,EAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3D,OAAO,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,QAAQ;YAAE,IAAA,mCAAiB,EAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,CAAC;IACd,CAAC;IACD,iBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,kCAAkB,EAAC,SAAS,CAAC,aAAa,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAA,+BAAe,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChF,IAAA,iCAAe,EAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;QAClG,2EAA2E;QAC3E,kEAAkE;QAClE,IAAA,iCAAY,EAAC,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,oBAAoB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QACrH,IAAA,wCAAqB,EAAC,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5G,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;QACrC,OAAO,CAAC,IAAA,mCAAiB,EAAC,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;YAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACrF,IAAI,CAAC,IAAA,mCAAiB,EAAC,IAAI,CAAC,CAAC,SAAS;YAAE,MAAM,IAAI,qBAAY,CAAC,6BAA6B,EAAE,qEAAqE,EAAE,WAAW,SAAS,kDAAkD,CAAC,CAAC;IAC/O,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0EAA0E;QAC1E,yEAAyE;QACzE,uEAAuE;QACvE,IAAA,iCAAe,EAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/H,0EAA0E;QAC1E,0EAA0E;QAC1E,yEAAyE;QACzE,IAAI,IAAA,mCAAiB,EAAC,IAAI,CAAC,CAAC,SAAS;YAAE,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1E,IAAA,iCAAe,EAAC,IAAI,EAAE,EAAE,GAAG,IAAA,mCAAiB,EAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtI,IAAI,CAAC;YAAC,IAAA,yCAAsB,EAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,qCAAqC,CAAC,CAAC;QACnF,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,yBAAyB,CAAC;YAAE,IAAA,mCAAiB,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAClH,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,MAAkB;IAC3D,IAAI,OAAO,GAAG,IAAA,mCAAiB,EAAC,IAAI,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAAC,OAAO,GAAG,IAAA,mCAAiB,EAAC,IAAI,CAAC,CAAC;QAAC,CAAC;IACrF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,2BAA2B,OAAO,CAAC,EAAE,eAAe,IAAI,CAAC,SAAS,CAAC,mBAAI,CAAC,OAAO,CAAC,mBAAI,CAAC,OAAO,CAAC,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACjN,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,KAAK,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnF,CAAC;AAOM,KAAK,UAAU,eAAe,CAAC,SAAiB,EAAE,YAAkC,EAAE,gBAAgB,EAAE,0BAAQ,EAAE;IACvH,MAAM,IAAI,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,IAAA,gCAAc,EAAC,IAAI,CAAC,KAAK,CAAC,iBAAE,CAAC,YAAY,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAC/H,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAClE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC5B,MAAM,EAAE,GAAG,IAAA,mCAAiB,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC;IACtC,IAAI,mBAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,kBAAkB,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAC/I,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;IACnD,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAa,EAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YACtE,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,IAAA,wCAAqB,GAAE,CAAC;gBACxB,IAAI,iBAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,MAAM,MAAM,GAAG,IAAA,gCAAc,EAAC,IAAI,CAAC,KAAK,CAAC,iBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;oBAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAI,CAAC,OAAO,EAAE,CAAC;gBACjE,CAAC;gBACD,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;oBAAE,iBAAE,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/G,IAAI,GAAG,GAAqB,IAAI,CAAC;gBACjC,IAAI,GAAG,GAAqB,IAAI,CAAC;gBACjC,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC;gBAChC,IAAI,IAAI;oBAAE,GAAG,GAAG,MAAM,SAAS,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,gBAAgB,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;gBAChH,IAAI,SAAS,CAAC,GAAG;oBAAE,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK;wBACpD,CAAC,CAAC,IAAA,6BAAc,EAAC,SAAS,CAAC,GAAG,CAAC,cAAe,EAAE,GAAG,EAAE,OAAO,IAAI,SAAS,CAAC,gBAAgB,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;wBACxH,CAAC,CAAC,IAAA,+BAAe,EAAC,SAAS,CAAC,aAAa,EAAE,GAAI,EAAE,GAAG,EAAE,OAAO,IAAI,SAAS,CAAC,gBAAgB,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC5H,IAAI,SAAS,CAAC,GAAG,EAAE,KAAK,KAAK,KAAK,IAAI,GAAG;oBAAE,IAAA,iCAAY,EAAC,SAAS,CAAC,GAAG,CAAC,cAAe,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACxP,IAAA,iCAAe,EAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC7C,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,GAAI,CAAC,OAAO,EAAE,CAAC;YACnD,CAAC;YACD,MAAM,MAAM,GAAG,IAAA,gCAAc,EAAC,IAAI,CAAC,KAAK,CAAC,iBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YAC3F,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,EAAE,CAAC;gBAClC,IAAA,qCAAoB,EAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAI,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC9F,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAY,EAAC,qBAAqB,EAAE,EAAE,EAAE,kCAAgB,EAAE,OAAO,CAAC,CAAC;gBACzF,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB;oBAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;gBAC5N,MAAM,IAAA,2BAAY,EAAC,2BAA2B,EAAE,CAAC,OAAO,CAAC,EAAE,0BAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3F,CAAC;YACD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;gBAC5B,sEAAsE;gBACtE,kEAAkE;gBAClE,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,IAAI,CAAC;wBAAC,MAAM,IAAA,2BAAY,EAAC,qBAAqB,EAAE,CAAC,OAAO,CAAC,EAAE,0BAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,0BAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;oBAAC,CAAC;oBACvH,OAAO,KAAK,EAAE,CAAC;wBAAC,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;4BAAE,MAAM,KAAK,CAAC;oBAAC,CAAC;gBAC7D,CAAC;gBACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;gBACrC,OAAO,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;oBAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC1E,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,kGAAkG,CAAC,CAAC;gBACjJ,IAAA,wCAAsB,EAAC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAChF,CAAC;YACD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,mBAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBACnD,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,iBAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBACtD,iBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;oBACzD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;wBAClF,MAAM,MAAM,GAAG,mBAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;wBACzC,iBAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBACvD,KAAK,MAAM,KAAK,IAAI,iBAAE,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;4BAC3C,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS;gCAAE,SAAS;4BAC7D,iBAAE,CAAC,MAAM,CAAC,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,iBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;wBAC7M,CAAC;oBACH,CAAC;oBACD,IAAA,iCAAe,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACzF,CAAC;YACH,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;oBACf,IAAA,kCAAgB,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC7B,IAAA,iCAAe,EAAC,IAAI,EAAE,EAAE,GAAG,IAAA,mCAAiB,EAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1E,CAAC;gBACD,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;oBAChC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK;wBAAE,IAAA,+BAAgB,EAAC,SAAS,CAAC,GAAG,CAAC,cAAe,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;yBAClI,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK;wBAAE,IAAA,sBAAM,EAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,GAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;yBAChM,CAAC;wBACJ,MAAM,MAAM,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;wBAC1D,MAAM,WAAW,GAAG,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;wBACjD,iBAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBACvD,iBAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;wBACpE,MAAM,gBAAgB,GAAG,mBAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;wBACtD,MAAM,OAAO,GAAG,iBAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,mBAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAA,kCAAkB,EAAC,SAAS,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;wBAClM,IAAA,kCAAkB,EAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC5G,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9E,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC9B,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC;oBAAC,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAY,EAAC,qBAAqB,EAAE,EAAE,EAAE,kCAAgB,EAAE,OAAO,CAAC,CAAC;oBAAC,OAAO,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,6BAA6B,CAAC,CAAC;gBACnL,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,GAAG,GAAsB,EAAE,QAAQ,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;oBAC/D,IAAI,SAAS,CAAC,oBAAoB;wBAAE,GAAG,CAAC,2BAA2B,GAAG,GAAG,CAAC;oBAC1E,OAAO,GAAG,CAAC,oBAAoB,CAAC;oBAChC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBAClC,IAAA,iCAAY,EAAC,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,YAAY,SAAS,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,+BAA+B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC7R,CAAC;yBAAM,CAAC;wBACN,oEAAoE;wBACpE,qEAAqE;wBACrE,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;wBACxD,iBAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,4EAA4E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,uDAAuD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,mBAAmB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,4GAA4G,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;wBACvY,IAAA,wCAAqB,EAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBAC/G,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;gBACrD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK;oBAC1C,CAAC,CAAC,IAAA,gCAAiB,EAAC,SAAS,CAAC,GAAG,CAAC,cAAe,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO;oBACpF,CAAC,CAAC,IAAA,iCAAY,EAAC,SAAS,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC5P,IAAI,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,cAAc,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;YAC1H,CAAC;YACD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;gBACrC,IAAI,OAAO,GAAG,EAAE,CAAC;gBACjB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACH,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAY,EAAC,qBAAqB,EAAE,EAAE,EAAE,kCAAgB,EAAE,OAAO,CAAC,CAAC;wBACzF,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB;4BAAE,MAAM,IAAI,KAAK,CAAC,mFAAmF,CAAC,CAAC;wBAC1X,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;4BAAE,IAAA,yCAAsB,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;wBACtE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;oBACjC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAAC,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wBAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;oBAAC,CAAC;gBACzG,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,OAAO,kFAAkF,CAAC,CAAC;YACtJ,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;gBAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;oBAC7B,MAAM,QAAQ,GAAG,MAAM,IAAA,2BAAY,EAAC,wBAAwB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,0BAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,0BAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,0BAAQ,CAAC,KAAK,CAAC,0BAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,0BAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,0BAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,0BAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;oBAC9P,IAAA,iCAAe,EAAC,IAAI,EAAE,EAAE,GAAG,IAAA,mCAAiB,EAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;oBACnF,IAAI,QAAQ,CAAC,QAAQ;wBAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAC9D,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,uIAAuI,CAAC,CAAC;YAC3J,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,CAAC,CAAC;IACL,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,4EAA4E;QAC5E,mEAAmE;QACnE,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ;YAAE,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,yBAAyB,CAAC;gBAAE,IAAA,mCAAiB,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChL,IAAI,CAAC;YAAC,IAAA,yCAAsB,EAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iDAAiD,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { UpdateHost } from './updatePreflight';
2
+ export interface StagedApp {
3
+ version: string;
4
+ artifact: string;
5
+ installPath: string;
6
+ backupPath: string;
7
+ sha256: string;
8
+ }
9
+ export declare function stageApp(host: UpdateHost, requested: string, directory: string): Promise<StagedApp>;
10
+ /** Replacement is reconciled from owned sibling paths after a helper restart. */
11
+ export declare function installStagedApp(staged: StagedApp): void;
12
+ //# sourceMappingURL=updateArtifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateArtifacts.d.ts","sourceRoot":"","sources":["../src/updateArtifacts.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,MAAM,WAAW,SAAS;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAczH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAqCzG;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsBxD"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.stageApp = stageApp;
7
+ exports.installStagedApp = installStagedApp;
8
+ const node_fs_1 = __importDefault(require("node:fs"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_child_process_1 = require("node:child_process");
11
+ const node_crypto_1 = require("node:crypto");
12
+ const releases_1 = require("./releases");
13
+ const download_1 = require("./download");
14
+ const platform_1 = require("./platform");
15
+ const errors_1 = require("./errors");
16
+ const boundaryDecoder_1 = require("./boundaryDecoder");
17
+ function sha(file) { return (0, node_crypto_1.createHash)('sha256').update(node_fs_1.default.readFileSync(file)).digest('hex'); }
18
+ function macSigner(bundle) {
19
+ (0, node_child_process_1.execFileSync)('/usr/bin/codesign', ['--verify', '--deep', '--strict', bundle], { timeout: 60_000 });
20
+ const result = (0, node_child_process_1.spawnSync)('/usr/bin/codesign', ['-dv', '--verbose=2', bundle], { encoding: 'utf8', timeout: 10_000 });
21
+ const team = result.stderr.match(/^TeamIdentifier=(.+)$/m)?.[1];
22
+ if (result.status !== 0 || !team || team === 'not set')
23
+ throw new Error('The application has no verified signing team.');
24
+ return team;
25
+ }
26
+ function windowsSigner(file) {
27
+ const script = `$s=Get-AuthenticodeSignature -LiteralPath '${file.replace(/'/g, "''")}'; if ($s.Status -ne 'Valid') { throw 'Invalid application signature' }; $s.SignerCertificate.Thumbprint`;
28
+ return (0, node_child_process_1.execFileSync)('powershell.exe', ['-NoProfile', '-NonInteractive', '-EncodedCommand', Buffer.from(script, 'utf16le').toString('base64')], { encoding: 'utf8', timeout: 30_000 }).trim();
29
+ }
30
+ async function stageApp(host, requested, directory) {
31
+ const platform = (0, platform_1.detectPlatform)();
32
+ const resolved = await (0, releases_1.resolveRelease)({ version: requested, channel: 'stable', source: 'npm', platform, format: platform.os === 'darwin' ? 'zip' : platform.os === 'win32' ? 'exe' : 'appimage', target: 'client' });
33
+ const metadata = resolved.release.assets?.find(asset => asset.name === 'continuity.json');
34
+ if (!metadata)
35
+ throw new errors_1.RunpaneError('ERR_UPDATE_TARGET_PROTOCOL', 'This release does not declare the continuity protocol. Pane remains running.', 'Choose a release supporting independent updates; older installers require a manual update.');
36
+ const response = await fetch(metadata.browser_download_url, { signal: AbortSignal.timeout(30_000) });
37
+ if (!response.ok)
38
+ throw new Error('The release continuity manifest could not be downloaded. Pane remains running.');
39
+ const manifest = (0, boundaryDecoder_1.decodeBoundary)(await response.json(), boundaryDecoder_1.boundary.object({ protocol: boundaryDecoder_1.boundary.literal(1), version: boundaryDecoder_1.boundary.nonEmptyString, artifacts: boundaryDecoder_1.boundary.array(boundaryDecoder_1.boundary.object({ name: boundaryDecoder_1.boundary.nonEmptyString, sha256: boundaryDecoder_1.boundary.nonEmptyString })) }));
40
+ if (manifest.version !== resolved.release.tag_name.replace(/^v/, ''))
41
+ throw new Error('The continuity manifest identifies a different release.');
42
+ const expected = manifest.artifacts.find(item => item.name === resolved.artifact.name)?.sha256;
43
+ if (!expected || !/^[a-f0-9]{64}$/i.test(expected))
44
+ throw new Error('The selected artifact is missing from the continuity manifest.');
45
+ const downloaded = await (0, download_1.downloadArtifact)(resolved, directory);
46
+ if (sha(downloaded.path) !== expected.toLowerCase())
47
+ throw new Error('The update artifact does not match the continuity manifest. Pane remains running.');
48
+ const version = resolved.release.tag_name.replace(/^v/, '');
49
+ let artifact = downloaded.path;
50
+ const installPath = process.platform === 'darwin' ? node_path_1.default.resolve(host.executable, '../../..') : process.platform === 'linux' ? host.executable : node_path_1.default.dirname(host.executable);
51
+ if (process.platform === 'darwin') {
52
+ const unpacked = node_path_1.default.join(directory, 'unpacked');
53
+ node_fs_1.default.mkdirSync(unpacked);
54
+ (0, node_child_process_1.execFileSync)('/usr/bin/ditto', ['-x', '-k', artifact, unpacked], { timeout: 120_000 });
55
+ artifact = node_path_1.default.join(unpacked, 'Pane.app');
56
+ if (macSigner(installPath) !== macSigner(artifact))
57
+ throw new Error('The update signing team does not match the installed Pane.');
58
+ (0, node_child_process_1.execFileSync)('/usr/sbin/spctl', ['--assess', '--type', 'execute', artifact], { timeout: 60_000 });
59
+ const actual = (0, node_child_process_1.execFileSync)('/usr/libexec/PlistBuddy', ['-c', 'Print :CFBundleShortVersionString', node_path_1.default.join(artifact, 'Contents/Info.plist')], { encoding: 'utf8' }).trim();
60
+ if (actual !== version)
61
+ throw new Error('The staged app version does not match the requested release.');
62
+ }
63
+ else if (process.platform === 'win32') {
64
+ if (windowsSigner(host.executable) !== windowsSigner(artifact))
65
+ throw new Error('The installer signer does not match the installed Pane.');
66
+ }
67
+ else {
68
+ // The public installer historically treats checksums as optional. Independent
69
+ // updates require one before shutting down a healthy Linux host.
70
+ const response = await fetch(resolved.checksumUrl, { signal: AbortSignal.timeout(30_000) });
71
+ if (!response.ok)
72
+ throw new Error('A release checksum is required for an independent Linux update.');
73
+ const line = (await response.text()).split(/\r?\n/).find(item => item.trim().endsWith(downloaded.fileName));
74
+ if (!line || line.trim().split(/\s+/)[0].toLowerCase() !== sha(artifact))
75
+ throw new Error('The AppImage release checksum is missing or invalid.');
76
+ node_fs_1.default.chmodSync(artifact, 0o755);
77
+ }
78
+ return { version, artifact, installPath, backupPath: `${installPath}.before-${node_path_1.default.basename(node_path_1.default.dirname(directory))}`, sha256: sha(downloaded.path) };
79
+ }
80
+ /** Replacement is reconciled from owned sibling paths after a helper restart. */
81
+ function installStagedApp(staged) {
82
+ if (process.platform === 'win32') {
83
+ // /D is deliberately last, with no shell. NSIS owns its exact registered
84
+ // installation and migration; failures retain the data snapshot for repair.
85
+ // NSIS /D consumes the unquoted remainder, including spaces:
86
+ // https://nsis.sourceforge.io/Docs/Chapter3.html#installerusage
87
+ const installed = (0, node_child_process_1.spawnSync)(staged.artifact, ['/S', '--updated', `/D=${staged.installPath}`], { timeout: 180_000, stdio: 'pipe', windowsVerbatimArguments: true });
88
+ if (installed.error)
89
+ throw installed.error;
90
+ if (installed.status !== 0)
91
+ throw new errors_1.RunpaneError('ERR_UPDATE_INSTALL', `The installer exited with ${installed.status}. The data snapshot was retained.`, 'Inspect the operation and installer log before retrying.');
92
+ return;
93
+ }
94
+ const incoming = `${staged.installPath}.incoming-${node_path_1.default.basename(staged.backupPath)}`;
95
+ if (!node_fs_1.default.existsSync(staged.backupPath)) {
96
+ if (node_fs_1.default.existsSync(incoming))
97
+ node_fs_1.default.rmSync(incoming, { recursive: true });
98
+ if (process.platform === 'darwin')
99
+ (0, node_child_process_1.execFileSync)('/usr/bin/ditto', [staged.artifact, incoming], { timeout: 120_000 });
100
+ else {
101
+ node_fs_1.default.copyFileSync(staged.artifact, incoming);
102
+ node_fs_1.default.chmodSync(incoming, 0o755);
103
+ }
104
+ node_fs_1.default.renameSync(staged.installPath, staged.backupPath);
105
+ }
106
+ if (!node_fs_1.default.existsSync(staged.installPath)) {
107
+ if (!node_fs_1.default.existsSync(incoming))
108
+ throw new errors_1.RunpaneError('ERR_UPDATE_RECOVERY', 'The prepared app is missing after the old installation was preserved.', `Inspect ${staged.backupPath}; do not restore old application data over a migrated database.`);
109
+ node_fs_1.default.renameSync(incoming, staged.installPath);
110
+ }
111
+ }
112
+ //# sourceMappingURL=updateArtifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateArtifacts.js","sourceRoot":"","sources":["../src/updateArtifacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function assertUpdateCapacity(paneDir: string, host: {
2
+ paneDir: string;
3
+ userData: string;
4
+ } | null, install: string, cliPrefix?: string): void;
5
+ //# sourceMappingURL=updateCapacity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateCapacity.d.ts","sourceRoot":"","sources":["../src/updateCapacity.ts"],"names":[],"mappings":"AAmCA,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAmBnJ"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assertUpdateCapacity = assertUpdateCapacity;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_module_1 = require("node:module");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const errors_1 = require("./errors");
11
+ // Electron virtualizes app.asar as a directory. Capacity and snapshots concern
12
+ // physical files; the staged standalone Node helper has these semantics too.
13
+ // SAFETY: Electron's built-in original-fs exposes the unchanged Node fs API.
14
+ const fs = process.versions.electron
15
+ ? (0, node_module_1.createRequire)(__filename)('original-fs')
16
+ : node_fs_1.default;
17
+ /** Live Chromium files may be exclusively locked until clean shutdown on Windows. */
18
+ function updateSnapshotBytes(source, excludeUpdates = false, liveProfile = false) {
19
+ let total = 0;
20
+ for (const entry of fs.readdirSync(source)) {
21
+ if ((excludeUpdates && entry === 'updates') || entry.startsWith('Singleton'))
22
+ continue;
23
+ const file = node_path_1.default.join(source, entry);
24
+ const stat = fs.lstatSync(file);
25
+ if (stat.isSocket())
26
+ continue;
27
+ if (stat.isDirectory())
28
+ total += updateSnapshotBytes(file, false, liveProfile);
29
+ else if (stat.isSymbolicLink()) {
30
+ fs.readlinkSync(file);
31
+ total += stat.size;
32
+ }
33
+ else if (stat.isFile()) {
34
+ try {
35
+ const fd = fs.openSync(file, 'r');
36
+ fs.closeSync(fd);
37
+ }
38
+ catch (error) {
39
+ // A sharing violation is not an ACL denial. Count the physical size
40
+ // now; the post-quiescence snapshot must read/copy it before install.
41
+ if (!(liveProfile && process.platform === 'win32' && error instanceof Error && 'code' in error && error.code === 'EBUSY'))
42
+ throw error;
43
+ }
44
+ total += stat.size;
45
+ }
46
+ else
47
+ throw new errors_1.RunpaneError('ERR_UPDATE_SNAPSHOT_ENTRY', `The recovery snapshot cannot copy ${file}. Pane remains running.`, 'Move the unsupported special file outside Pane data and retry.');
48
+ }
49
+ return total;
50
+ }
51
+ function assertUpdateCapacity(paneDir, host, install, cliPrefix) {
52
+ const GiB = 1024 ** 3;
53
+ const installBytes = host ? (fs.statSync(install).isDirectory() ? updateSnapshotBytes(install) : fs.statSync(install).size) : 0;
54
+ const snapshotBytes = host ? updateSnapshotBytes(host.paneDir, true) + updateSnapshotBytes(host.userData, false, true) : 0;
55
+ const requirements = [
56
+ { directory: paneDir, bytes: snapshotBytes * 1.2 + (host ? installBytes * 3 : 0) + 2 * GiB },
57
+ ...(host ? [{ directory: node_path_1.default.dirname(install), bytes: installBytes * 2 }] : []),
58
+ ...(cliPrefix ? [{ directory: cliPrefix, bytes: GiB }] : []),
59
+ ];
60
+ const volumes = new Map();
61
+ for (const requirement of requirements) {
62
+ const device = fs.statSync(requirement.directory).dev;
63
+ const prior = volumes.get(device);
64
+ volumes.set(device, { directory: requirement.directory, bytes: (prior?.bytes ?? 0) + requirement.bytes });
65
+ }
66
+ for (const { directory, bytes } of volumes.values()) {
67
+ const disk = fs.statfsSync(directory);
68
+ if (disk.bavail * disk.bsize < bytes)
69
+ throw new errors_1.RunpaneError('ERR_UPDATE_DISK_SPACE', `The volume containing ${directory} needs at least ${(bytes / GiB).toFixed(1)} GiB free for staging, replacement and recovery. Pane remains running.`, 'Free space on that volume and retry.');
70
+ }
71
+ }
72
+ //# sourceMappingURL=updateCapacity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateCapacity.js","sourceRoot":"","sources":["../src/updateCapacity.ts"],"names":[],"mappings":"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"}