@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
package/dist/pty-host.js
CHANGED
|
@@ -7,11 +7,23 @@ import * as nativePty from "@homebridge/node-pty-prebuilt-multiarch";
|
|
|
7
7
|
import { createPtyApi, PtySessionManager, } from "@amalgm/core/pty";
|
|
8
8
|
import { WS_CLOSE_UNAUTHORIZED, } from "@amalgm/core/transport";
|
|
9
9
|
import { WebSocket, WebSocketServer } from "ws";
|
|
10
|
+
// Terminal drains must finish inside the runtime's 25-second shutdown grace.
|
|
11
|
+
const TERMINAL_HANGUP_GRACE_MS = 1_000;
|
|
12
|
+
const TERMINAL_FORCED_EXIT_MS = 5_000;
|
|
10
13
|
/** Native effects for Core's PTY law; Engine reference local-gateway.js:33-47,333-346,777-904. */
|
|
11
14
|
export function createPtyHost(config) {
|
|
12
15
|
ensureSpawnHelperExecutable();
|
|
16
|
+
const terminals = new Set();
|
|
17
|
+
let closing;
|
|
13
18
|
const manager = new PtySessionManager({
|
|
14
|
-
spawn: (spec) =>
|
|
19
|
+
spawn: (spec) => {
|
|
20
|
+
if (closing)
|
|
21
|
+
throw new Error("PTY host is closed");
|
|
22
|
+
const owned = adaptProcess(nativePty.spawn(spec.shell, [], spec));
|
|
23
|
+
terminals.add(owned);
|
|
24
|
+
void owned.exited.then(() => terminals.delete(owned));
|
|
25
|
+
return owned.process;
|
|
26
|
+
},
|
|
15
27
|
timer: {
|
|
16
28
|
schedule(delayMs, callback) {
|
|
17
29
|
const handle = setTimeout(callback, delayMs);
|
|
@@ -59,10 +71,21 @@ export function createPtyHost(config) {
|
|
|
59
71
|
},
|
|
60
72
|
},
|
|
61
73
|
close() {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
74
|
+
if (!closing) {
|
|
75
|
+
// Seal admission before closing peers, whose callbacks can enter Core.
|
|
76
|
+
let resolve;
|
|
77
|
+
let reject;
|
|
78
|
+
closing = new Promise((yes, no) => { resolve = yes; reject = no; });
|
|
79
|
+
const owned = [...terminals];
|
|
80
|
+
manager.closeAll();
|
|
81
|
+
for (const terminal of owned)
|
|
82
|
+
terminal.process.kill();
|
|
83
|
+
for (const client of wss.clients)
|
|
84
|
+
client.terminate();
|
|
85
|
+
const socketsClosed = new Promise(yes => wss.close(yes));
|
|
86
|
+
void Promise.all([socketsClosed, ...owned.map(terminal => terminal.drain())]).then(() => resolve(), reject);
|
|
87
|
+
}
|
|
88
|
+
return closing;
|
|
66
89
|
},
|
|
67
90
|
};
|
|
68
91
|
}
|
|
@@ -74,33 +97,59 @@ function hostShell(env) {
|
|
|
74
97
|
return platform() === "darwin" ? "/bin/zsh" : "/bin/sh";
|
|
75
98
|
}
|
|
76
99
|
function adaptProcess(proc) {
|
|
77
|
-
let
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
100
|
+
let stopped = false;
|
|
101
|
+
let finished = false;
|
|
102
|
+
let force;
|
|
103
|
+
let resolveExit;
|
|
104
|
+
const exited = new Promise(resolve => { resolveExit = resolve; });
|
|
105
|
+
const signal = (value) => {
|
|
82
106
|
try {
|
|
83
|
-
proc.kill();
|
|
107
|
+
proc.kill(value);
|
|
84
108
|
}
|
|
85
109
|
catch {
|
|
86
110
|
// A process may have completed before native teardown reaches it.
|
|
87
111
|
}
|
|
88
112
|
};
|
|
113
|
+
const observation = proc.onExit(() => {
|
|
114
|
+
finished = true;
|
|
115
|
+
clearTimeout(force);
|
|
116
|
+
// ConPTY's native transport has its own lifetime after the program exits.
|
|
117
|
+
if (platform() === "win32")
|
|
118
|
+
signal();
|
|
119
|
+
observation.dispose();
|
|
120
|
+
resolveExit();
|
|
121
|
+
});
|
|
122
|
+
const stop = () => {
|
|
123
|
+
if (stopped || finished)
|
|
124
|
+
return;
|
|
125
|
+
stopped = true;
|
|
126
|
+
signal();
|
|
127
|
+
if (!finished)
|
|
128
|
+
force = setTimeout(() => { if (!finished)
|
|
129
|
+
signal("SIGKILL"); }, TERMINAL_HANGUP_GRACE_MS);
|
|
130
|
+
};
|
|
89
131
|
return {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
132
|
+
process: {
|
|
133
|
+
pid: proc.pid,
|
|
134
|
+
write: (data) => proc.write(data),
|
|
135
|
+
resize: (cols, rows) => proc.resize(cols, rows),
|
|
136
|
+
kill: stop,
|
|
137
|
+
onData: (listener) => proc.onData(listener),
|
|
138
|
+
onExit: (listener) => proc.onExit(listener),
|
|
139
|
+
},
|
|
140
|
+
exited,
|
|
141
|
+
async drain() {
|
|
142
|
+
stop();
|
|
143
|
+
let deadline;
|
|
96
144
|
try {
|
|
97
|
-
|
|
145
|
+
await Promise.race([exited, new Promise((_, reject) => {
|
|
146
|
+
deadline = setTimeout(() => reject(new Error(`PTY ${proc.pid} did not exit after forced termination`)), TERMINAL_HANGUP_GRACE_MS + TERMINAL_FORCED_EXIT_MS);
|
|
147
|
+
})]);
|
|
98
148
|
}
|
|
99
149
|
finally {
|
|
100
|
-
|
|
101
|
-
release();
|
|
150
|
+
clearTimeout(deadline);
|
|
102
151
|
}
|
|
103
|
-
}
|
|
152
|
+
},
|
|
104
153
|
};
|
|
105
154
|
}
|
|
106
155
|
function adaptPeer(ws) {
|
package/dist/pty-host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pty-host.js","sourceRoot":"","sources":["../src/pty-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,KAAK,SAAS,MAAM,yCAAyC,CAAC;AACrE,OAAO,EACL,YAAY,EACZ,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,qBAAqB,GACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAiBhD,kGAAkG;AAClG,MAAM,UAAU,aAAa,CAAC,MAAqB;IACjD,2BAA2B,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC;QACpC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"pty-host.js","sourceRoot":"","sources":["../src/pty-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,12 @@ export interface RuntimeCommandAddress {
|
|
|
2
2
|
readonly userRoot: string;
|
|
3
3
|
readonly deviceId: string;
|
|
4
4
|
readonly runtimeLabel: string;
|
|
5
|
+
readonly branch?: string;
|
|
6
|
+
readonly localSession?: string;
|
|
5
7
|
readonly userScope: string;
|
|
6
8
|
}
|
|
7
9
|
export interface RuntimeCommandPublication extends RuntimeCommandAddress {
|
|
10
|
+
readonly instanceId: string;
|
|
8
11
|
readonly port: number;
|
|
9
12
|
readonly token: string;
|
|
10
13
|
}
|
|
@@ -18,6 +21,10 @@ export interface RuntimeCommandConnection {
|
|
|
18
21
|
readonly runtimeUrl: string;
|
|
19
22
|
readonly runtimeToken: string;
|
|
20
23
|
}
|
|
24
|
+
/** Pre-controller releases did not hold an OS lease. A live process named by
|
|
25
|
+
* their publication therefore prevents a new writer; a PID is never authority
|
|
26
|
+
* to stop it. After its intentional exit, normal setup adopts durable state. */
|
|
27
|
+
export declare function assertRuntimeCanStart(input: RuntimeCommandAddress): void;
|
|
21
28
|
/** Publish the loopback address only after the watching runtime is ready. */
|
|
22
29
|
export declare function publishRuntimeCommands(input: RuntimeCommandPublication): void;
|
|
23
30
|
/** Remove only the discovery document owned by this exact runtime token. */
|
|
@@ -1,15 +1,39 @@
|
|
|
1
1
|
import { rmSync } from "node:fs";
|
|
2
2
|
import { request } from "node:http";
|
|
3
|
-
import {
|
|
3
|
+
import { resolveRuntimeBinding, runtimeBindingsMatch, assertRuntimeLabel, RUNTIME_IDENTITY_PATH, createRuntimeIdentity, runtimeIdentitiesMatch, runtimeStateDir, runtimeStateFile, runtimeTokenFile, } from "@amalgm/core/identity";
|
|
4
4
|
import { atomicJson, readJson } from "./filesystem.js";
|
|
5
5
|
const FILES_PORT = "amalgm_mcp";
|
|
6
|
+
/** Pre-controller releases did not hold an OS lease. A live process named by
|
|
7
|
+
* their publication therefore prevents a new writer; a PID is never authority
|
|
8
|
+
* to stop it. After its intentional exit, normal setup adopts durable state. */
|
|
9
|
+
export function assertRuntimeCanStart(input) {
|
|
10
|
+
const state = readJson(commandFiles(input).state);
|
|
11
|
+
if (!state || (state.instance_id && state.binding))
|
|
12
|
+
return;
|
|
13
|
+
const pid = Number(state.pid);
|
|
14
|
+
if (!Number.isSafeInteger(pid) || pid <= 0) {
|
|
15
|
+
throw Object.assign(new Error('An older runtime publication has no verifiable process. Repair its installation before starting another runtime.'), { code: 'runtime_owner_unknown' });
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
process.kill(pid, 0);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error.code === 'ESRCH')
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
throw Object.assign(new Error('An older Amalgm runtime is still using this installation. Stop that runtime once, then repeat setup to adopt its saved account into the independent service.'), { code: 'runtime_owner_unknown' });
|
|
25
|
+
}
|
|
6
26
|
/** Publish the loopback address only after the watching runtime is ready. */
|
|
7
27
|
export function publishRuntimeCommands(input) {
|
|
8
28
|
const files = commandFiles(input);
|
|
9
|
-
const
|
|
29
|
+
const binding = resolveRuntimeBinding(input);
|
|
30
|
+
const label = binding.runtimeLabel;
|
|
31
|
+
createRuntimeIdentity({ binding, userScope: input.userScope, deviceId: input.deviceId, instanceId: input.instanceId });
|
|
10
32
|
atomicJson(files.token, { token: required(input.token, "runtime token") });
|
|
11
33
|
atomicJson(files.state, {
|
|
12
34
|
runtime_label: label,
|
|
35
|
+
binding,
|
|
36
|
+
instance_id: input.instanceId,
|
|
13
37
|
user_scope: input.userScope,
|
|
14
38
|
pid: process.pid,
|
|
15
39
|
ports: { [FILES_PORT]: validPort(input.port) },
|
|
@@ -30,10 +54,12 @@ export function unpublishRuntimeCommands(input) {
|
|
|
30
54
|
export async function inspectRuntimeCommands(input) {
|
|
31
55
|
const files = commandFiles(input);
|
|
32
56
|
const state = readJson(files.state);
|
|
33
|
-
const
|
|
57
|
+
const binding = resolveRuntimeBinding(input);
|
|
58
|
+
const label = binding.runtimeLabel;
|
|
34
59
|
if (!state
|
|
35
60
|
|| state.runtime_label !== label
|
|
36
|
-
|| state.user_scope !== input.userScope
|
|
61
|
+
|| state.user_scope !== input.userScope
|
|
62
|
+
|| (state.binding ? !runtimeBindingsMatch(state.binding, binding) : label === 'local')) {
|
|
37
63
|
return { published: false, running: false, pid: null, port: null };
|
|
38
64
|
}
|
|
39
65
|
const pid = Number.isSafeInteger(state.pid) && Number(state.pid) > 0
|
|
@@ -49,10 +75,14 @@ export async function inspectRuntimeCommands(input) {
|
|
|
49
75
|
return { published: true, running: false, pid, port };
|
|
50
76
|
}
|
|
51
77
|
try {
|
|
52
|
-
const response = await
|
|
78
|
+
const response = await getRuntimeIdentity(port, token);
|
|
79
|
+
const expected = createRuntimeIdentity({
|
|
80
|
+
binding, userScope: input.userScope, deviceId: input.deviceId,
|
|
81
|
+
instanceId: required(state.instance_id, 'runtime instance'),
|
|
82
|
+
});
|
|
53
83
|
return {
|
|
54
84
|
published: true,
|
|
55
|
-
running: response.statusCode === 200 && response.body
|
|
85
|
+
running: response.statusCode === 200 && runtimeIdentitiesMatch(JSON.parse(response.body), expected),
|
|
56
86
|
pid,
|
|
57
87
|
port,
|
|
58
88
|
};
|
|
@@ -65,10 +95,12 @@ export async function inspectRuntimeCommands(input) {
|
|
|
65
95
|
export function runtimeCommandConnection(input) {
|
|
66
96
|
const files = commandFiles(input);
|
|
67
97
|
const state = readJson(files.state);
|
|
68
|
-
const
|
|
98
|
+
const binding = resolveRuntimeBinding(input);
|
|
99
|
+
const label = binding.runtimeLabel;
|
|
69
100
|
if (!state
|
|
70
101
|
|| state.runtime_label !== label
|
|
71
|
-
|| state.user_scope !== input.userScope
|
|
102
|
+
|| state.user_scope !== input.userScope
|
|
103
|
+
|| (state.binding ? !runtimeBindingsMatch(state.binding, binding) : label === 'local')) {
|
|
72
104
|
throw runtimeUnavailable(input.userScope);
|
|
73
105
|
}
|
|
74
106
|
const port = validPort(state.ports?.[FILES_PORT]);
|
|
@@ -139,22 +171,26 @@ function postRuntimeCommand(port, path, token, body) {
|
|
|
139
171
|
command.end(encoded);
|
|
140
172
|
});
|
|
141
173
|
}
|
|
142
|
-
function
|
|
174
|
+
function getRuntimeIdentity(port, token) {
|
|
143
175
|
return new Promise((resolve, reject) => {
|
|
144
176
|
const command = request({
|
|
145
177
|
hostname: "127.0.0.1",
|
|
146
178
|
port,
|
|
147
|
-
path:
|
|
179
|
+
path: RUNTIME_IDENTITY_PATH,
|
|
148
180
|
method: "GET",
|
|
149
181
|
headers: {
|
|
150
182
|
"x-amalgm-runtime-token": token,
|
|
151
183
|
"connection": "close",
|
|
152
184
|
},
|
|
153
|
-
|
|
185
|
+
signal: AbortSignal.timeout(2_000),
|
|
154
186
|
}, (response) => {
|
|
155
187
|
response.setEncoding("utf8");
|
|
156
188
|
let responseBody = "";
|
|
157
|
-
response.on("data", (chunk) => {
|
|
189
|
+
response.on("data", (chunk) => {
|
|
190
|
+
responseBody += chunk;
|
|
191
|
+
if (Buffer.byteLength(responseBody) > 16_384)
|
|
192
|
+
command.destroy(new Error('Runtime identity response is too large'));
|
|
193
|
+
});
|
|
158
194
|
response.once("end", () => resolve({
|
|
159
195
|
statusCode: response.statusCode ?? 500,
|
|
160
196
|
body: responseBody,
|
|
@@ -167,7 +203,7 @@ function getRuntimeHealth(port, token) {
|
|
|
167
203
|
});
|
|
168
204
|
}
|
|
169
205
|
function commandFiles(input) {
|
|
170
|
-
const directory = runtimeStateDir(input.userRoot, required(input.deviceId, "device id"),
|
|
206
|
+
const directory = runtimeStateDir(input.userRoot, required(input.deviceId, "device id"), assertRuntimeLabel(input.runtimeLabel));
|
|
171
207
|
return { state: runtimeStateFile(directory), token: runtimeTokenFile(directory) };
|
|
172
208
|
}
|
|
173
209
|
function validPort(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-command-host.js","sourceRoot":"","sources":["../src/runtime-command-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"runtime-command-host.js","sourceRoot":"","sources":["../src/runtime-command-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Backend, Launcher, Registration, ServiceIdentity } from './registration.js';
|
|
2
|
+
/** What the OS reports; `null` fields are ones this owner cannot know. */
|
|
3
|
+
export interface OwnerStatus {
|
|
4
|
+
/** The launcher artifact(s) exist where the OS looks for them. */
|
|
5
|
+
readonly registered: boolean;
|
|
6
|
+
/** The OS currently has the service loaded/enabled, when it can say. */
|
|
7
|
+
readonly loaded: boolean | null;
|
|
8
|
+
readonly state: string | null;
|
|
9
|
+
readonly pid: number | null;
|
|
10
|
+
readonly detail?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface ServiceOwner {
|
|
13
|
+
readonly backend: Backend;
|
|
14
|
+
/** Launcher artifacts this owner writes, by name, for the registration record. */
|
|
15
|
+
files(identity: ServiceIdentity): Readonly<Record<string, string>>;
|
|
16
|
+
/** Write the artifacts and put the keepalive under OS care, started. */
|
|
17
|
+
install(identity: ServiceIdentity, launcher: Launcher, keepaliveArgs: readonly string[]): void | Promise<void>;
|
|
18
|
+
start(identity: ServiceIdentity, registration: Registration): void | Promise<void>;
|
|
19
|
+
stop(identity: ServiceIdentity): void | Promise<void>;
|
|
20
|
+
status(identity: ServiceIdentity): OwnerStatus | Promise<OwnerStatus>;
|
|
21
|
+
/** Stop and remove the artifacts; idempotent. */
|
|
22
|
+
uninstall(identity: ServiceIdentity): void | Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/** Run one OS command to completion; throw its stderr when it fails and failure matters. */
|
|
25
|
+
export declare function osCommand(command: string, args: readonly string[], options?: {
|
|
26
|
+
readonly tolerate?: boolean;
|
|
27
|
+
}): {
|
|
28
|
+
readonly ok: boolean;
|
|
29
|
+
readonly stdout: string;
|
|
30
|
+
readonly stderr: string;
|
|
31
|
+
};
|
|
32
|
+
/** The keepalive command line every owner launches: `node main.js service keepalive …`. */
|
|
33
|
+
export declare function keepaliveCommand(launcher: Pick<Launcher, "node" | "bin">, keepaliveArgs: readonly string[]): readonly string[];
|
|
34
|
+
/** Preserve the OS account environment. The selected data home travels in CLI
|
|
35
|
+
* arguments; changing HOME here would select a different native credential store. */
|
|
36
|
+
export declare function serviceEnvironment(identity: ServiceIdentity, env?: NodeJS.ProcessEnv): Readonly<Record<string, string>>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Shared adapter contract and host effects. This layer imports no OS adapter. */
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
/** Run one OS command to completion; throw its stderr when it fails and failure matters. */
|
|
5
|
+
export function osCommand(command, args, options = {}) {
|
|
6
|
+
const result = spawnSync(command, [...args], { encoding: "utf8", timeout: 60_000, windowsHide: true });
|
|
7
|
+
const ok = result.status === 0;
|
|
8
|
+
const stdout = result.stdout ?? "";
|
|
9
|
+
const stderr = result.error ? result.error.message : (result.stderr ?? "");
|
|
10
|
+
if (!ok && !options.tolerate) {
|
|
11
|
+
throw new Error(`${command} ${args.join(" ")} failed: ${stderr.trim() || stdout.trim() || `exit ${result.status}`}`);
|
|
12
|
+
}
|
|
13
|
+
return { ok, stdout, stderr };
|
|
14
|
+
}
|
|
15
|
+
/** The keepalive command line every owner launches: `node main.js service keepalive …`. */
|
|
16
|
+
export function keepaliveCommand(launcher, keepaliveArgs) {
|
|
17
|
+
return [launcher.node, launcher.bin, ...keepaliveArgs];
|
|
18
|
+
}
|
|
19
|
+
/** Preserve the OS account environment. The selected data home travels in CLI
|
|
20
|
+
* arguments; changing HOME here would select a different native credential store. */
|
|
21
|
+
export function serviceEnvironment(identity, env = process.env) {
|
|
22
|
+
return { PATH: env.PATH ?? "/usr/local/bin:/usr/bin:/bin", HOME: env.HOME || homedir() };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/service/adapter.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AA2BlC,4FAA4F;AAC5F,MAAM,UAAU,SAAS,CACvB,OAAe,EACf,IAAuB,EACvB,UAA2C,EAAE;IAE7C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACvG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,gBAAgB,CAAC,QAAwC,EAAE,aAAgC;IACzG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC;AACzD,CAAC;AAED;qFACqF;AACrF,MAAM,UAAU,kBAAkB,CAAC,QAAyB,EAAE,MAAyB,OAAO,CAAC,GAAG;IAChG,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,8BAA8B,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `amalgm service …`: the verbs a person or an installer uses to put the
|
|
3
|
+
* runtime under OS care. Every verb resolves the same identity from
|
|
4
|
+
* `--user` (and the optional root/home/label selectors), then hands one
|
|
5
|
+
* owner one job. `keepalive` is the verb the OS itself runs.
|
|
6
|
+
*/
|
|
7
|
+
import type { RuntimeLabel } from "@amalgm/core/identity";
|
|
8
|
+
export declare function runServiceCli(args: readonly string[], runtimeLabel?: RuntimeLabel): Promise<number>;
|