@amalgm/shell 0.1.162 → 0.1.164-main.34182640231
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PURPOSE.md +163 -17
- package/README.md +74 -11
- package/config/releases/trust/runtime/main.root.json +84 -0
- package/config/releases/trust/runtime/preview.root.json +84 -0
- package/dist/authorization/recovery-host.d.ts +1 -0
- package/dist/authorization/recovery-host.js +2 -3
- package/dist/authorization/recovery-host.js.map +1 -1
- package/dist/boot.js +28 -20
- package/dist/boot.js.map +1 -1
- package/dist/cli-arguments.d.ts +8 -0
- package/dist/cli-arguments.js +47 -0
- package/dist/cli-arguments.js.map +1 -0
- package/dist/cli.d.ts +6 -4
- package/dist/cli.js +91 -73
- package/dist/cli.js.map +1 -1
- package/dist/compose.js +4 -3
- package/dist/compose.js.map +1 -1
- package/dist/content-cache-index.js +2 -2
- package/dist/content-cache-index.js.map +1 -1
- package/dist/detection/runtime.js +2 -2
- package/dist/detection/runtime.js.map +1 -1
- package/dist/development/profile.d.ts +27 -0
- package/dist/development/profile.js +142 -0
- package/dist/development/profile.js.map +1 -0
- package/dist/entity-apply-host.js +2 -2
- package/dist/entity-apply-host.js.map +1 -1
- package/dist/entity-apply-store.d.ts +2 -1
- package/dist/entity-apply-store.js +52 -37
- package/dist/entity-apply-store.js.map +1 -1
- package/dist/files-register-host.d.ts +1 -0
- package/dist/files-register-host.js +1 -0
- package/dist/files-register-host.js.map +1 -1
- package/dist/installation/environment.d.ts +30 -0
- package/dist/installation/environment.js +28 -0
- package/dist/installation/environment.js.map +1 -0
- package/dist/installation/lease.d.ts +6 -0
- package/dist/installation/lease.js +28 -0
- package/dist/installation/lease.js.map +1 -0
- package/dist/installation/ownership.d.ts +30 -0
- package/dist/installation/ownership.js +156 -0
- package/dist/installation/ownership.js.map +1 -0
- package/dist/installation/selection.d.ts +8 -0
- package/dist/installation/selection.js +29 -0
- package/dist/installation/selection.js.map +1 -0
- package/dist/machine-host.d.ts +27 -5
- package/dist/machine-host.js +244 -96
- package/dist/machine-host.js.map +1 -1
- package/dist/main.js +56 -2
- package/dist/main.js.map +1 -1
- package/dist/platform-product-host.d.ts +9 -9
- package/dist/platform-product-host.js +17 -17
- package/dist/platform-product-host.js.map +1 -1
- package/dist/platform-tools.d.ts +4 -3
- package/dist/platform-tools.js +34 -37
- package/dist/platform-tools.js.map +1 -1
- package/dist/process-lifecycle.d.ts +6 -0
- package/dist/process-lifecycle.js +42 -0
- package/dist/process-lifecycle.js.map +1 -0
- package/dist/pty-host.d.ts +1 -1
- package/dist/pty-host.js +70 -21
- package/dist/pty-host.js.map +1 -1
- package/dist/runtime-command-host.d.ts +7 -0
- package/dist/runtime-command-host.js +49 -13
- package/dist/runtime-command-host.js.map +1 -1
- package/dist/service/adapter.d.ts +36 -0
- package/dist/service/adapter.js +24 -0
- package/dist/service/adapter.js.map +1 -0
- package/dist/service/cli.d.ts +8 -0
- package/dist/service/cli.js +237 -0
- package/dist/service/cli.js.map +1 -0
- package/dist/service/control.d.ts +38 -0
- package/dist/service/control.js +68 -0
- package/dist/service/control.js.map +1 -0
- package/dist/service/index.d.ts +9 -0
- package/dist/service/index.js +10 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/keepalive.d.ts +18 -0
- package/dist/service/keepalive.js +418 -0
- package/dist/service/keepalive.js.map +1 -0
- package/dist/service/launchd.d.ts +9 -0
- package/dist/service/launchd.js +105 -0
- package/dist/service/launchd.js.map +1 -0
- package/dist/service/owner.d.ts +4 -0
- package/dist/service/owner.js +14 -0
- package/dist/service/owner.js.map +1 -0
- package/dist/service/portable.d.ts +10 -0
- package/dist/service/portable.js +32 -0
- package/dist/service/portable.js.map +1 -0
- package/dist/service/recovery.d.ts +27 -0
- package/dist/service/recovery.js +58 -0
- package/dist/service/recovery.js.map +1 -0
- package/dist/service/registration.d.ts +82 -0
- package/dist/service/registration.js +114 -0
- package/dist/service/registration.js.map +1 -0
- package/dist/service/systemd-unit.d.ts +7 -0
- package/dist/service/systemd-unit.js +43 -0
- package/dist/service/systemd-unit.js.map +1 -0
- package/dist/service/systemd.d.ts +5 -0
- package/dist/service/systemd.js +72 -0
- package/dist/service/systemd.js.map +1 -0
- package/dist/service/windows-action.d.ts +9 -0
- package/dist/service/windows-action.js +55 -0
- package/dist/service/windows-action.js.map +1 -0
- package/dist/service/windows-task.d.ts +9 -0
- package/dist/service/windows-task.js +46 -0
- package/dist/service/windows-task.js.map +1 -0
- package/dist/service/windows.d.ts +2 -0
- package/dist/service/windows.js +65 -0
- package/dist/service/windows.js.map +1 -0
- package/dist/sqlite.d.ts +4 -0
- package/dist/sqlite.js +16 -0
- package/dist/sqlite.js.map +1 -0
- package/dist/updates/artifacts.d.ts +40 -0
- package/dist/updates/artifacts.js +299 -0
- package/dist/updates/artifacts.js.map +1 -0
- package/dist/updates/bootstrap.d.ts +48 -0
- package/dist/updates/bootstrap.js +384 -0
- package/dist/updates/bootstrap.js.map +1 -0
- package/dist/updates/controller.d.ts +66 -0
- package/dist/updates/controller.js +322 -0
- package/dist/updates/controller.js.map +1 -0
- package/dist/updates/isolated-command-lifetime.d.ts +1 -0
- package/dist/updates/isolated-command-lifetime.js +63 -0
- package/dist/updates/isolated-command-lifetime.js.map +1 -0
- package/dist/updates/store.d.ts +41 -0
- package/dist/updates/store.js +80 -0
- package/dist/updates/store.js.map +1 -0
- package/dist/updates/trust.d.ts +20 -0
- package/dist/updates/trust.js +138 -0
- package/dist/updates/trust.js.map +1 -0
- package/dist/user-ground-host.d.ts +4 -1
- package/dist/user-ground-host.js +16 -3
- package/dist/user-ground-host.js.map +1 -1
- package/dist/watching/host.js +4 -2
- package/dist/watching/host.js.map +1 -1
- package/dist/workspace-add-staging.js +2 -2
- package/dist/workspace-add-staging.js.map +1 -1
- package/examinations/fixtures/machine-control-plane.js +57 -0
- package/examinations/fixtures/private-wire-authority.js +1065 -0
- package/examinations/native-service.mjs +92 -0
- package/examinations/network-view.mjs +202 -0
- package/examinations/runtime-upgrade.native-test.mjs +198 -0
- package/npm-shrinkwrap.json +2097 -218
- package/package.json +95 -14
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/** Windows Task Scheduler owns a hidden action in the current account's
|
|
2
|
+
* logged-in lifetime; that action applies Core's controller recovery policy. */
|
|
3
|
+
import { existsSync, rmSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { windowsStartupScriptPath } from '@amalgm/core/supervision';
|
|
6
|
+
import { atomicJson } from '../filesystem.js';
|
|
7
|
+
import { keepaliveStatus, stopKeepalive } from './control.js';
|
|
8
|
+
import { keepaliveCommand, osCommand } from './adapter.js';
|
|
9
|
+
import { powershellExecutable, windowsControllerAction, windowsTaskOperation } from './windows-task.js';
|
|
10
|
+
const definition = (identity) => join(identity.serviceDir, 'windows-task.json');
|
|
11
|
+
const task = (identity, operation, action) => osCommand(powershellExecutable(), ['-NoProfile', '-NonInteractive', '-EncodedCommand', windowsTaskOperation({
|
|
12
|
+
operation, name: identity.label, ...(action ? { action } : {}),
|
|
13
|
+
})]);
|
|
14
|
+
async function waitForController(identity) {
|
|
15
|
+
const deadline = Date.now() + 15_000;
|
|
16
|
+
while (Date.now() < deadline) {
|
|
17
|
+
if ((await keepaliveStatus(identity))?.alive)
|
|
18
|
+
return;
|
|
19
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
20
|
+
}
|
|
21
|
+
throw new Error(`The Windows task for ${identity.label} did not report an authenticated controller; see ${identity.serviceDir}`);
|
|
22
|
+
}
|
|
23
|
+
export const windowsOwner = {
|
|
24
|
+
backend: 'windows',
|
|
25
|
+
files: (identity) => ({ task: definition(identity) }),
|
|
26
|
+
async install(identity, launcher, keepaliveArgs) {
|
|
27
|
+
await stopKeepalive(identity);
|
|
28
|
+
const action = windowsControllerAction(keepaliveCommand(launcher, keepaliveArgs), identity.home);
|
|
29
|
+
task(identity, 'install', action);
|
|
30
|
+
await waitForController(identity);
|
|
31
|
+
atomicJson(definition(identity), { name: identity.label, action, binding: identity.binding });
|
|
32
|
+
// Retire only the known previous registration after the new owner is live.
|
|
33
|
+
rmSync(windowsStartupScriptPath(identity.labelScope, { home: identity.home, appData: process.env.APPDATA }), { force: true });
|
|
34
|
+
},
|
|
35
|
+
async start(identity) {
|
|
36
|
+
if ((await keepaliveStatus(identity))?.alive)
|
|
37
|
+
return;
|
|
38
|
+
task(identity, 'start');
|
|
39
|
+
await waitForController(identity);
|
|
40
|
+
},
|
|
41
|
+
async stop(identity) {
|
|
42
|
+
task(identity, 'disable');
|
|
43
|
+
await stopKeepalive(identity);
|
|
44
|
+
task(identity, 'stop');
|
|
45
|
+
},
|
|
46
|
+
async status(identity) {
|
|
47
|
+
const native = JSON.parse(task(identity, 'status').stdout);
|
|
48
|
+
const controller = await keepaliveStatus(identity);
|
|
49
|
+
return {
|
|
50
|
+
registered: native.registered && existsSync(definition(identity)), loaded: native.registered,
|
|
51
|
+
state: controller?.alive ? 'running' : native.state?.toLowerCase() || 'not registered',
|
|
52
|
+
pid: controller?.alive ? controller.bootstrapPid ?? controller.pid : null,
|
|
53
|
+
...(native.lastResult ? { detail: `Task Scheduler result: ${native.lastResult}` } : {}),
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
async uninstall(identity) {
|
|
57
|
+
task(identity, 'disable');
|
|
58
|
+
await stopKeepalive(identity);
|
|
59
|
+
task(identity, 'stop');
|
|
60
|
+
task(identity, 'uninstall');
|
|
61
|
+
rmSync(definition(identity), { force: true });
|
|
62
|
+
rmSync(windowsStartupScriptPath(identity.labelScope, { home: identity.home, appData: process.env.APPDATA }), { force: true });
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=windows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"windows.js","sourceRoot":"","sources":["../../src/service/windows.ts"],"names":[],"mappings":"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"}
|
package/dist/sqlite.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
/** Every persistent SQLite handle names the same OS file as Node's filesystem.
|
|
3
|
+
* The Windows namespace prefix bypasses legacy Win32 MAX_PATH interpretation. */
|
|
4
|
+
export declare function openFileDatabase(file: string, options?: Database.Options): Database.Database;
|
package/dist/sqlite.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { resolve, toNamespacedPath } from 'node:path';
|
|
3
|
+
/** Every persistent SQLite handle names the same OS file as Node's filesystem.
|
|
4
|
+
* The Windows namespace prefix bypasses legacy Win32 MAX_PATH interpretation. */
|
|
5
|
+
export function openFileDatabase(file, options) {
|
|
6
|
+
const filename = toNamespacedPath(resolve(file));
|
|
7
|
+
try {
|
|
8
|
+
return new Database(filename, options);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (error instanceof Error)
|
|
12
|
+
error.message = `SQLite ${JSON.stringify(file)}: ${error.message}`;
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEtD;iFACiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAA0B;IACvE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC;QAAC,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IAC/C,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,KAAK;YAAE,KAAK,CAAC,OAAO,GAAG,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/F,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { AcceptedRuntimeRelease } from '@amalgm/core/supervision';
|
|
2
|
+
import type { ServiceIdentity } from '../service/registration.js';
|
|
3
|
+
export declare class RuntimeDownloadError extends Error {
|
|
4
|
+
}
|
|
5
|
+
export declare class RuntimeCommandError extends Error {
|
|
6
|
+
readonly stdout: string;
|
|
7
|
+
readonly exitCode: number | null;
|
|
8
|
+
constructor(message: string, stdout: string, exitCode: number | null);
|
|
9
|
+
}
|
|
10
|
+
/** Only npm's structured top-level error classifies dependency transport.
|
|
11
|
+
* Script diagnostics, integrity failures and preflight output never do. */
|
|
12
|
+
export declare function classifyNpmFailure(error: unknown): unknown;
|
|
13
|
+
export declare const RUNTIME_CONTRACT: Readonly<{
|
|
14
|
+
schema: 1;
|
|
15
|
+
controllerProtocol: 1;
|
|
16
|
+
nodeMajor: 24;
|
|
17
|
+
platforms: string[];
|
|
18
|
+
protocol: 1;
|
|
19
|
+
stores: Readonly<{
|
|
20
|
+
id: "installation";
|
|
21
|
+
reads: {
|
|
22
|
+
min: number;
|
|
23
|
+
max: number;
|
|
24
|
+
};
|
|
25
|
+
writes: 1;
|
|
26
|
+
}>[];
|
|
27
|
+
}>;
|
|
28
|
+
export declare function managedPackage(root?: string): boolean;
|
|
29
|
+
export declare function artifactDirectory(identity: ServiceIdentity, release: AcceptedRuntimeRelease): string;
|
|
30
|
+
export declare function hashFile(file: string): Promise<string>;
|
|
31
|
+
export declare function examineArchive(file: string, directory: string): Promise<readonly string[]>;
|
|
32
|
+
export declare function runIsolated(node: string, args: readonly string[], cwd: string, signal: AbortSignal, timeout?: number): Promise<string>;
|
|
33
|
+
/** New generations never overwrite packages that an existing process can read.
|
|
34
|
+
* The receipt is written only after strict installation and isolated preflight. */
|
|
35
|
+
export declare function stageRuntime(identity: ServiceIdentity, release: AcceptedRuntimeRelease, node: string, signal: AbortSignal, installedBaseline?: string): Promise<string>;
|
|
36
|
+
export declare function collectRuntimeArtifacts(identity: ServiceIdentity, retained: readonly string[]): Promise<void>;
|
|
37
|
+
/** Called only after the new controller owns the exclusive controller lease,
|
|
38
|
+
* before discovery or staging starts. An isolated command's own lease remains
|
|
39
|
+
* authoritative even if the controller that spawned it has already exited. */
|
|
40
|
+
export declare function collectAbandonedUpdateWork(identity: ServiceIdentity): Promise<void>;
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
3
|
+
import { createServer } from 'node:net';
|
|
4
|
+
import { createRequire } from 'node:module';
|
|
5
|
+
import { createReadStream, existsSync } from 'node:fs';
|
|
6
|
+
import { lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';
|
|
7
|
+
import { dirname, join, resolve } from 'node:path';
|
|
8
|
+
import { extract, list } from 'tar';
|
|
9
|
+
import { BaseFetcher } from 'tuf-js';
|
|
10
|
+
import { acquireProcessLease } from '../installation/lease.js';
|
|
11
|
+
import { installedPackage, packageRoot, RUNTIME_FORMAT, CONTROLLER_PROTOCOL } from './store.js';
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
export class RuntimeDownloadError extends Error {
|
|
14
|
+
}
|
|
15
|
+
export class RuntimeCommandError extends Error {
|
|
16
|
+
stdout;
|
|
17
|
+
exitCode;
|
|
18
|
+
constructor(message, stdout, exitCode) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.stdout = stdout;
|
|
21
|
+
this.exitCode = exitCode;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const npmTransportCodes = new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'ESOCKETTIMEDOUT', 'EAI_AGAIN',
|
|
25
|
+
'ENOTFOUND', 'ENETUNREACH', 'EHOSTUNREACH', 'E408', 'E429', 'E500', 'E502', 'E503', 'E504']);
|
|
26
|
+
/** Only npm's structured top-level error classifies dependency transport.
|
|
27
|
+
* Script diagnostics, integrity failures and preflight output never do. */
|
|
28
|
+
export function classifyNpmFailure(error) {
|
|
29
|
+
if (!(error instanceof RuntimeCommandError) || error.exitCode === null)
|
|
30
|
+
return error;
|
|
31
|
+
let code;
|
|
32
|
+
try {
|
|
33
|
+
code = JSON.parse(error.stdout).error?.code;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return error;
|
|
37
|
+
}
|
|
38
|
+
return typeof code === 'string' && npmTransportCodes.has(code)
|
|
39
|
+
? new RuntimeDownloadError(`Runtime dependency transport failed (${code})`, { cause: error }) : error;
|
|
40
|
+
}
|
|
41
|
+
export const RUNTIME_CONTRACT = Object.freeze({ schema: 1, controllerProtocol: CONTROLLER_PROTOCOL, nodeMajor: 24,
|
|
42
|
+
platforms: ['darwin-arm64', 'darwin-x64', 'linux-x64', 'win32-x64'],
|
|
43
|
+
protocol: 1, stores: [RUNTIME_FORMAT] });
|
|
44
|
+
export function managedPackage(root = packageRoot) {
|
|
45
|
+
const pkg = installedPackage(root);
|
|
46
|
+
return pkg.name === 'amalgm' && ['main', 'preview'].includes(pkg.amalgmSource?.branch ?? '');
|
|
47
|
+
}
|
|
48
|
+
export function artifactDirectory(identity, release) {
|
|
49
|
+
return join(identity.serviceDir, 'generations', release.digest, 'package');
|
|
50
|
+
}
|
|
51
|
+
export async function hashFile(file) {
|
|
52
|
+
const hash = createHash('sha512');
|
|
53
|
+
for await (const bytes of createReadStream(file))
|
|
54
|
+
hash.update(bytes);
|
|
55
|
+
return hash.digest('hex');
|
|
56
|
+
}
|
|
57
|
+
class RegistryFetcher extends BaseFetcher {
|
|
58
|
+
signal;
|
|
59
|
+
constructor(signal) {
|
|
60
|
+
super();
|
|
61
|
+
this.signal = signal;
|
|
62
|
+
}
|
|
63
|
+
async fetch(url) {
|
|
64
|
+
const target = new URL(url);
|
|
65
|
+
if (target.origin !== 'https://registry.npmjs.org')
|
|
66
|
+
throw new Error('Runtime archive escaped the npm registry');
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetch(target, { signal: this.signal, redirect: 'error' });
|
|
69
|
+
if (!response.ok || !response.body) {
|
|
70
|
+
const message = `Runtime archive returned HTTP ${response.status}`;
|
|
71
|
+
if (response.status >= 500 || response.status === 429 || response.status === 404)
|
|
72
|
+
throw new RuntimeDownloadError(message);
|
|
73
|
+
throw new Error(message);
|
|
74
|
+
}
|
|
75
|
+
// BaseFetcher consumes this body after fetch() returns. Classify failures
|
|
76
|
+
// at the transport reader, before archive integrity or disk effects run.
|
|
77
|
+
const reader = response.body.getReader();
|
|
78
|
+
return new ReadableStream({
|
|
79
|
+
async pull(controller) {
|
|
80
|
+
try {
|
|
81
|
+
const next = await reader.read();
|
|
82
|
+
if (next.done) {
|
|
83
|
+
reader.releaseLock();
|
|
84
|
+
controller.close();
|
|
85
|
+
}
|
|
86
|
+
else
|
|
87
|
+
controller.enqueue(next.value);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
reader.releaseLock();
|
|
91
|
+
controller.error(new RuntimeDownloadError('Runtime archive transfer was interrupted', { cause: error }));
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
async cancel(reason) { try {
|
|
95
|
+
await reader.cancel(reason);
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
reader.releaseLock();
|
|
99
|
+
} },
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (error instanceof TypeError || error.name === 'TimeoutError')
|
|
104
|
+
throw new RuntimeDownloadError(String(error));
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export async function examineArchive(file, directory) {
|
|
110
|
+
const paths = new Set();
|
|
111
|
+
let size = 0;
|
|
112
|
+
let invalid = null;
|
|
113
|
+
await list({ file, strict: true, onReadEntry(entry) {
|
|
114
|
+
if (invalid)
|
|
115
|
+
return;
|
|
116
|
+
const parts = entry.path.replace(/\/$/, '').split('/');
|
|
117
|
+
if (parts[0] !== 'package' || parts.some(part => !part || part === '.' || part === '..') || entry.path.includes('\\')
|
|
118
|
+
|| !['File', 'Directory'].includes(entry.type) || paths.has(entry.path) || paths.size >= 20_000) {
|
|
119
|
+
invalid = 'Runtime archive has unsafe or ambiguous entries';
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
paths.add(entry.path);
|
|
123
|
+
size += entry.size;
|
|
124
|
+
if (size > 256 * 1024 * 1024)
|
|
125
|
+
invalid = 'Runtime archive exceeds its expanded bound';
|
|
126
|
+
} });
|
|
127
|
+
if (invalid)
|
|
128
|
+
throw new Error(invalid);
|
|
129
|
+
await extract({ file, cwd: directory, strict: true, preservePaths: false, noChmod: true });
|
|
130
|
+
return [...paths].filter(path => !path.endsWith('/'));
|
|
131
|
+
}
|
|
132
|
+
export async function runIsolated(node, args, cwd, signal, timeout = 600_000) {
|
|
133
|
+
const ownerFile = join(cwd, '.isolated-command.sqlite');
|
|
134
|
+
const token = randomBytes(32).toString('hex');
|
|
135
|
+
const streams = new Set();
|
|
136
|
+
const lifetime = createServer(stream => {
|
|
137
|
+
streams.add(stream);
|
|
138
|
+
stream.once('close', () => streams.delete(stream));
|
|
139
|
+
stream.on('error', () => { });
|
|
140
|
+
stream.setTimeout(5_000, () => stream.destroy());
|
|
141
|
+
let admission = '';
|
|
142
|
+
stream.on('data', bytes => {
|
|
143
|
+
admission += bytes.toString('utf8');
|
|
144
|
+
if (admission.length > 65 || !(token + '\n').startsWith(admission))
|
|
145
|
+
stream.destroy();
|
|
146
|
+
else if (admission === token + '\n') {
|
|
147
|
+
stream.setTimeout(0);
|
|
148
|
+
stream.write('start\n');
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
lifetime.maxConnections = 1;
|
|
153
|
+
await new Promise((resolveReady, reject) => { lifetime.once('error', reject); lifetime.listen(0, '127.0.0.1', resolveReady); });
|
|
154
|
+
const address = lifetime.address();
|
|
155
|
+
if (!address || typeof address === 'string')
|
|
156
|
+
throw new Error('The isolated command has no parent lifetime address');
|
|
157
|
+
const env = { ...process.env, npm_config_userconfig: join(cwd, '.release-npmrc'), npm_config_audit: 'false', npm_config_fund: 'false',
|
|
158
|
+
AMALGM_ISOLATED_COMMAND_LIFETIME: JSON.stringify({ file: ownerFile, timeout, port: address.port, token }) };
|
|
159
|
+
delete env.NODE_AUTH_TOKEN;
|
|
160
|
+
delete env.NPM_TOKEN;
|
|
161
|
+
delete env.NODE_OPTIONS;
|
|
162
|
+
return await new Promise((resolveResult, reject) => {
|
|
163
|
+
const child = spawn(node, ['--import', new URL('./isolated-command-lifetime.js', import.meta.url).href, ...args], { cwd, env, stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true });
|
|
164
|
+
let bytes = '';
|
|
165
|
+
let outputBytes = '';
|
|
166
|
+
let complete = false;
|
|
167
|
+
let drain;
|
|
168
|
+
const cancel = () => child.kill('SIGKILL');
|
|
169
|
+
const timer = setTimeout(cancel, timeout);
|
|
170
|
+
signal.addEventListener('abort', cancel, { once: true });
|
|
171
|
+
const clean = () => { clearTimeout(timer); clearTimeout(drain); signal.removeEventListener('abort', cancel); };
|
|
172
|
+
const output = (chunk) => { bytes = (bytes + chunk.toString('utf8')).slice(-64 * 1024); };
|
|
173
|
+
child.stdout.on('data', (chunk) => { outputBytes = (outputBytes + chunk.toString('utf8')).slice(-64 * 1024); output(chunk); });
|
|
174
|
+
child.stderr.on('data', output);
|
|
175
|
+
child.once('exit', () => {
|
|
176
|
+
// A script descendant retaining stdout cannot keep the direct command's
|
|
177
|
+
// result pending after that command has actually exited.
|
|
178
|
+
drain = setTimeout(() => { child.stdout?.destroy(); child.stderr?.destroy(); }, 1_000);
|
|
179
|
+
drain.unref();
|
|
180
|
+
});
|
|
181
|
+
child.on('error', error => { if (!child.pid) {
|
|
182
|
+
complete = true;
|
|
183
|
+
clean();
|
|
184
|
+
reject(error);
|
|
185
|
+
} });
|
|
186
|
+
child.on('close', code => { if (complete)
|
|
187
|
+
return; clean(); if (code === 0 && !signal.aborted)
|
|
188
|
+
resolveResult(outputBytes);
|
|
189
|
+
else
|
|
190
|
+
reject(new RuntimeCommandError(`Isolated runtime command failed (${code}): ${bytes.slice(-4_000)}`, outputBytes, code)); });
|
|
191
|
+
if (signal.aborted)
|
|
192
|
+
cancel();
|
|
193
|
+
}).finally(async () => {
|
|
194
|
+
for (const stream of streams)
|
|
195
|
+
stream.destroy();
|
|
196
|
+
await new Promise(resolveClosed => lifetime.close(() => resolveClosed()));
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async function verifyPackage(root, release) {
|
|
200
|
+
const artifact = release.target.release.units[0].artifact;
|
|
201
|
+
const pkg = installedPackage(root);
|
|
202
|
+
if (pkg.name !== artifact.name || pkg.version !== artifact.version
|
|
203
|
+
|| ['repository', 'branch', 'commit'].some(key => Reflect.get(pkg.amalgmSource ?? {}, key) !== Reflect.get(artifact.source, key))
|
|
204
|
+
|| await hashFile(join(root, 'npm-shrinkwrap.json')) !== artifact.lockSha512)
|
|
205
|
+
throw new Error('Runtime package differs from the signed composition');
|
|
206
|
+
}
|
|
207
|
+
/** New generations never overwrite packages that an existing process can read.
|
|
208
|
+
* The receipt is written only after strict installation and isolated preflight. */
|
|
209
|
+
export async function stageRuntime(identity, release, node, signal, installedBaseline) {
|
|
210
|
+
const destination = artifactDirectory(identity, release);
|
|
211
|
+
if (!installedBaseline && existsSync(join(dirname(destination), 'verified.json'))) {
|
|
212
|
+
await verifyPackage(destination, release);
|
|
213
|
+
return destination;
|
|
214
|
+
}
|
|
215
|
+
const parent = dirname(dirname(destination));
|
|
216
|
+
await mkdir(parent, { recursive: true, mode: 0o700 });
|
|
217
|
+
const scratch = await mkdtemp(join(parent, '.stage-'));
|
|
218
|
+
try {
|
|
219
|
+
const artifact = release.target.release.units[0].artifact;
|
|
220
|
+
const archive = join(scratch, 'runtime.tgz');
|
|
221
|
+
const fetcher = new RegistryFetcher(AbortSignal.any([signal, AbortSignal.timeout(120_000)]));
|
|
222
|
+
await fetcher.downloadFile(`https://registry.npmjs.org/amalgm/-/amalgm-${artifact.version}.tgz`, 128 * 1024 * 1024, async (file) => {
|
|
223
|
+
if (await hashFile(file) !== artifact.sha512)
|
|
224
|
+
throw new Error('Runtime archive integrity differs from its signed target');
|
|
225
|
+
await writeFile(archive, await readFile(file));
|
|
226
|
+
});
|
|
227
|
+
const files = await examineArchive(archive, scratch);
|
|
228
|
+
const root = join(scratch, 'package');
|
|
229
|
+
await verifyPackage(root, release);
|
|
230
|
+
if (installedBaseline) {
|
|
231
|
+
await verifyPackage(installedBaseline, release);
|
|
232
|
+
for (const path of files) {
|
|
233
|
+
const source = resolve(scratch, path);
|
|
234
|
+
const relative = path.slice('package/'.length);
|
|
235
|
+
const stat = await lstat(source);
|
|
236
|
+
if (stat.isFile() && await hashFile(source) !== await hashFile(join(installedBaseline, relative)))
|
|
237
|
+
throw new Error('Installed baseline contains different package bytes');
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
await writeFile(join(root, '.release-npmrc'), 'registry=https://registry.npmjs.org/\nstrict-allow-scripts=true\n');
|
|
241
|
+
const npm = join(dirname(require.resolve('npm/package.json')), 'bin/npm-cli.js');
|
|
242
|
+
try {
|
|
243
|
+
await runIsolated(node, [npm, 'ci', '--json', '--omit=dev', '--strict-allow-scripts', '--no-audit', '--no-fund'], root, signal);
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
throw classifyNpmFailure(error);
|
|
247
|
+
}
|
|
248
|
+
const result = await runIsolated(node, [join(root, 'dist/main.js'), 'version', '--runtime-contract'], root, signal, 30_000);
|
|
249
|
+
const contract = JSON.parse(result.trim());
|
|
250
|
+
const declared = release.target.release;
|
|
251
|
+
if (contract.controllerProtocol !== declared.controllerProtocol || contract.nodeMajor !== declared.nodeMajor
|
|
252
|
+
|| contract.protocol !== declared.units[0].protocol || JSON.stringify(contract.stores) !== JSON.stringify(declared.units[0].stores))
|
|
253
|
+
throw new Error('Runtime preflight contract differs from its signed recipe');
|
|
254
|
+
await rm(archive);
|
|
255
|
+
await rm(join(root, '.release-npmrc'));
|
|
256
|
+
await rm(join(root, '.isolated-command.sqlite'));
|
|
257
|
+
await writeFile(join(scratch, 'verified.json'), JSON.stringify({ digest: release.digest }));
|
|
258
|
+
if (existsSync(dirname(destination))) {
|
|
259
|
+
await verifyPackage(destination, release);
|
|
260
|
+
return destination;
|
|
261
|
+
}
|
|
262
|
+
await rename(scratch, dirname(destination));
|
|
263
|
+
return destination;
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
await rm(scratch, { recursive: true, force: true });
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
export async function collectRuntimeArtifacts(identity, retained) {
|
|
270
|
+
const parent = join(identity.serviceDir, 'generations');
|
|
271
|
+
for (const entry of await readdir(parent).catch(() => [])) {
|
|
272
|
+
if (/^[a-f0-9]{64}$/.test(entry) && !retained.includes(entry))
|
|
273
|
+
await rm(join(parent, entry), { recursive: true, force: true });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/** Called only after the new controller owns the exclusive controller lease,
|
|
277
|
+
* before discovery or staging starts. An isolated command's own lease remains
|
|
278
|
+
* authoritative even if the controller that spawned it has already exited. */
|
|
279
|
+
export async function collectAbandonedUpdateWork(identity) {
|
|
280
|
+
const parent = join(identity.serviceDir, 'generations');
|
|
281
|
+
for (const entry of await readdir(parent, { withFileTypes: true }).catch(() => [])) {
|
|
282
|
+
if (!entry.isDirectory() || !/^\.stage-[A-Za-z0-9]+$/.test(entry.name))
|
|
283
|
+
continue;
|
|
284
|
+
const directory = join(parent, entry.name);
|
|
285
|
+
const owner = join(directory, 'package', '.isolated-command.sqlite');
|
|
286
|
+
if (existsSync(owner)) {
|
|
287
|
+
const lease = acquireProcessLease(owner);
|
|
288
|
+
if (!lease)
|
|
289
|
+
continue;
|
|
290
|
+
lease.close();
|
|
291
|
+
}
|
|
292
|
+
await rm(directory, { recursive: true, force: true });
|
|
293
|
+
}
|
|
294
|
+
for (const entry of await readdir(identity.serviceDir, { withFileTypes: true })) {
|
|
295
|
+
if (entry.isDirectory() && /^trust-refresh-[A-Za-z0-9]+$/.test(entry.name))
|
|
296
|
+
await rm(join(identity.serviceDir, entry.name), { recursive: true, force: true });
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/updates/artifacts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface LaunchCommand {
|
|
2
|
+
node: string;
|
|
3
|
+
bin: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
}
|
|
6
|
+
export interface LaunchLimits {
|
|
7
|
+
maxAttempts: number;
|
|
8
|
+
initialDelayMs: number;
|
|
9
|
+
maxDelayMs: number;
|
|
10
|
+
stableAfterMs: number;
|
|
11
|
+
readyTimeoutMs: number;
|
|
12
|
+
healthIntervalMs: number;
|
|
13
|
+
healthTimeoutMs: number;
|
|
14
|
+
maxHealthFailures: number;
|
|
15
|
+
stopGraceMs: number;
|
|
16
|
+
}
|
|
17
|
+
export interface LaunchState extends LaunchLimits {
|
|
18
|
+
schema: 1;
|
|
19
|
+
current: LaunchCommand;
|
|
20
|
+
pending: null | {
|
|
21
|
+
token: string;
|
|
22
|
+
candidate: LaunchCommand;
|
|
23
|
+
recovery: LaunchCommand;
|
|
24
|
+
attempted: boolean;
|
|
25
|
+
recoveryAttempted: boolean;
|
|
26
|
+
};
|
|
27
|
+
attempts: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function validateLaunchState(value: unknown): LaunchState;
|
|
30
|
+
/** Reinstall can repair a missing bootstrap file, but never resets selected
|
|
31
|
+
* release, in-flight handover, or spent recovery allowance. */
|
|
32
|
+
export declare function initializeBootstrap(input: {
|
|
33
|
+
serviceDir: string;
|
|
34
|
+
controllerLease: string;
|
|
35
|
+
current: LaunchCommand;
|
|
36
|
+
limits: LaunchLimits;
|
|
37
|
+
}): {
|
|
38
|
+
node: string;
|
|
39
|
+
bin: string;
|
|
40
|
+
args: string[];
|
|
41
|
+
current: LaunchCommand;
|
|
42
|
+
};
|
|
43
|
+
/** Explicit operator retry restores control through known recovery code. It
|
|
44
|
+
* never chooses the failed candidate or changes the Core policy/quarantine. */
|
|
45
|
+
export declare function retryBootstrap(databaseFile: string): boolean;
|
|
46
|
+
/** One stable owner waits for the installation lease to drain, charges every
|
|
47
|
+
* launch durably, and parks rather than asking its OS parent for more attempts. */
|
|
48
|
+
export declare function runBootstrap(databaseFile: string, controllerLeaseFile: string): Promise<number>;
|