@amalgm/shell 0.1.162 → 0.1.163

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 (89) hide show
  1. package/PURPOSE.md +98 -14
  2. package/README.md +16 -0
  3. package/dist/authorization/recovery-host.d.ts +1 -0
  4. package/dist/authorization/recovery-host.js +2 -3
  5. package/dist/authorization/recovery-host.js.map +1 -1
  6. package/dist/cli-arguments.d.ts +8 -0
  7. package/dist/cli-arguments.js +47 -0
  8. package/dist/cli-arguments.js.map +1 -0
  9. package/dist/cli.d.ts +6 -4
  10. package/dist/cli.js +85 -73
  11. package/dist/cli.js.map +1 -1
  12. package/dist/compose.js +4 -3
  13. package/dist/compose.js.map +1 -1
  14. package/dist/development/profile.d.ts +27 -0
  15. package/dist/development/profile.js +142 -0
  16. package/dist/development/profile.js.map +1 -0
  17. package/dist/files-register-host.d.ts +1 -0
  18. package/dist/files-register-host.js +1 -0
  19. package/dist/files-register-host.js.map +1 -1
  20. package/dist/installation/environment.d.ts +30 -0
  21. package/dist/installation/environment.js +28 -0
  22. package/dist/installation/environment.js.map +1 -0
  23. package/dist/installation/lease.d.ts +6 -0
  24. package/dist/installation/lease.js +28 -0
  25. package/dist/installation/lease.js.map +1 -0
  26. package/dist/installation/ownership.d.ts +30 -0
  27. package/dist/installation/ownership.js +156 -0
  28. package/dist/installation/ownership.js.map +1 -0
  29. package/dist/installation/selection.d.ts +8 -0
  30. package/dist/installation/selection.js +29 -0
  31. package/dist/installation/selection.js.map +1 -0
  32. package/dist/machine-host.d.ts +26 -5
  33. package/dist/machine-host.js +192 -69
  34. package/dist/machine-host.js.map +1 -1
  35. package/dist/main.js +56 -2
  36. package/dist/main.js.map +1 -1
  37. package/dist/platform-product-host.d.ts +9 -9
  38. package/dist/platform-product-host.js +17 -17
  39. package/dist/platform-product-host.js.map +1 -1
  40. package/dist/platform-tools.d.ts +4 -3
  41. package/dist/platform-tools.js +34 -37
  42. package/dist/platform-tools.js.map +1 -1
  43. package/dist/process-lifecycle.d.ts +8 -0
  44. package/dist/process-lifecycle.js +32 -0
  45. package/dist/process-lifecycle.js.map +1 -0
  46. package/dist/runtime-command-host.d.ts +7 -0
  47. package/dist/runtime-command-host.js +49 -13
  48. package/dist/runtime-command-host.js.map +1 -1
  49. package/dist/service/adapter.d.ts +36 -0
  50. package/dist/service/adapter.js +24 -0
  51. package/dist/service/adapter.js.map +1 -0
  52. package/dist/service/cli.d.ts +8 -0
  53. package/dist/service/cli.js +196 -0
  54. package/dist/service/cli.js.map +1 -0
  55. package/dist/service/control.d.ts +29 -0
  56. package/dist/service/control.js +68 -0
  57. package/dist/service/control.js.map +1 -0
  58. package/dist/service/index.d.ts +9 -0
  59. package/dist/service/index.js +10 -0
  60. package/dist/service/index.js.map +1 -0
  61. package/dist/service/keepalive.d.ts +11 -0
  62. package/dist/service/keepalive.js +180 -0
  63. package/dist/service/keepalive.js.map +1 -0
  64. package/dist/service/launchd.d.ts +9 -0
  65. package/dist/service/launchd.js +105 -0
  66. package/dist/service/launchd.js.map +1 -0
  67. package/dist/service/owner.d.ts +4 -0
  68. package/dist/service/owner.js +14 -0
  69. package/dist/service/owner.js.map +1 -0
  70. package/dist/service/portable.d.ts +10 -0
  71. package/dist/service/portable.js +32 -0
  72. package/dist/service/portable.js.map +1 -0
  73. package/dist/service/registration.d.ts +82 -0
  74. package/dist/service/registration.js +114 -0
  75. package/dist/service/registration.js.map +1 -0
  76. package/dist/service/systemd.d.ts +9 -0
  77. package/dist/service/systemd.js +94 -0
  78. package/dist/service/systemd.js.map +1 -0
  79. package/dist/service/windows-task.d.ts +16 -0
  80. package/dist/service/windows-task.js +82 -0
  81. package/dist/service/windows-task.js.map +1 -0
  82. package/dist/service/windows.d.ts +2 -0
  83. package/dist/service/windows.js +65 -0
  84. package/dist/service/windows.js.map +1 -0
  85. package/dist/user-ground-host.d.ts +3 -0
  86. package/dist/user-ground-host.js +13 -0
  87. package/dist/user-ground-host.js.map +1 -1
  88. package/npm-shrinkwrap.json +49 -83
  89. package/package.json +9 -9
@@ -1,15 +1,39 @@
1
1
  import { rmSync } from "node:fs";
2
2
  import { request } from "node:http";
3
- import { coerceRuntimeLabel, runtimeStateDir, runtimeStateFile, runtimeTokenFile, } from "@amalgm/core/identity";
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 label = coerceRuntimeLabel(input.runtimeLabel);
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 label = coerceRuntimeLabel(input.runtimeLabel);
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 getRuntimeHealth(port, token);
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 === '{"ok":true}',
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 label = coerceRuntimeLabel(input.runtimeLabel);
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 getRuntimeHealth(port, token) {
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: "/healthz",
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
- timeout: 2_000,
185
+ signal: AbortSignal.timeout(2_000),
154
186
  }, (response) => {
155
187
  response.setEncoding("utf8");
156
188
  let responseBody = "";
157
- response.on("data", (chunk) => { responseBody += 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"), coerceRuntimeLabel(input.runtimeLabel));
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":"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"}
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>;
@@ -0,0 +1,196 @@
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 { existsSync, rmSync } from "node:fs";
8
+ import { option, parseArguments } from "../cli-arguments.js";
9
+ import { runKeepalive } from "./keepalive.js";
10
+ import { keepaliveStatus, stopKeepalive } from "./control.js";
11
+ import { acquireProcessLease } from "../installation/lease.js";
12
+ import { join } from "node:path";
13
+ import { runtimeAppOrigin, runtimeProxyOrigin } from "../installation/environment.js";
14
+ import { resolveInvocationBinding } from "../installation/selection.js";
15
+ import { ownerFor } from "./owner.js";
16
+ import { portableEntrypoint } from "./portable.js";
17
+ import { currentLauncher, detectBackend, readRegistration, registrationSatisfies, serviceIdentity, writeRegistration, registrationFile, } from "./registration.js";
18
+ import { userSystemdAvailable } from "./systemd.js";
19
+ const VERBS = new Set(["install", "start", "stop", "status", "uninstall", "keepalive"]);
20
+ const ALL_BACKENDS = ["launchd", "systemd", "windows", "portable"];
21
+ /** Options that shape the runtime; forwarded to `amalgm run` as well. */
22
+ const RUNTIME_OPTIONS = ["app-url", "proxy-url", "wire-url", "port", "profile"];
23
+ export async function runServiceCli(args, runtimeLabel = "main") {
24
+ const parsed = parseArguments(args);
25
+ if (parsed.command === "help" || parsed.options.help) {
26
+ process.stdout.write(helpText());
27
+ return 0;
28
+ }
29
+ if (!VERBS.has(parsed.command)) {
30
+ process.stderr.write(`Unknown service command: ${parsed.command}\n\n${helpText()}`);
31
+ return 2;
32
+ }
33
+ try {
34
+ const binding = resolveInvocationBinding(runtimeLabel, parsed);
35
+ const identity = serviceIdentity({
36
+ ...binding,
37
+ user: option(parsed, "user"),
38
+ home: option(parsed, "home") || undefined,
39
+ amalgmRoot: option(parsed, "amalgm-root") || undefined,
40
+ });
41
+ if (parsed.command === "keepalive")
42
+ return await runKeepalive(identity);
43
+ if (parsed.command === "install")
44
+ return await install(identity, parsed);
45
+ if (parsed.command === "status") {
46
+ process.stdout.write(`${JSON.stringify(await status(identity), null, 2)}\n`);
47
+ return 0;
48
+ }
49
+ if (parsed.command === "uninstall") {
50
+ await uninstall(identity);
51
+ report("uninstalled", { label: identity.label });
52
+ return 0;
53
+ }
54
+ const registration = readRegistration(identity);
55
+ if (!registration && parsed.command === "start")
56
+ return await install(identity, parsed);
57
+ if (!registration)
58
+ throw new Error(`No service is registered for ${identity.label}; run: amalgm service install --user ${identity.user}`);
59
+ const owner = ownerFor(registration.backend);
60
+ if (parsed.command === "start")
61
+ await owner.start(identity, registration);
62
+ else
63
+ await owner.stop(identity);
64
+ report(parsed.command === "start" ? "started" : "stopped", { label: identity.label, backend: registration.backend });
65
+ return 0;
66
+ }
67
+ catch (error) {
68
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
69
+ return 1;
70
+ }
71
+ }
72
+ async function install(identity, parsed) {
73
+ const file = join(identity.home, '.amalgm', 'owners', `service-install-${identity.labelScope}.sqlite`);
74
+ const deadline = Date.now() + 15_000;
75
+ let lease = acquireProcessLease(file);
76
+ while (!lease && Date.now() < deadline) {
77
+ await new Promise((resolve) => setTimeout(resolve, 50));
78
+ lease = acquireProcessLease(file);
79
+ }
80
+ if (!lease)
81
+ throw new Error('Another setup owns this runtime installation; retry after it completes.');
82
+ try {
83
+ return await installOwned(identity, parsed);
84
+ }
85
+ finally {
86
+ lease.close();
87
+ }
88
+ }
89
+ async function installOwned(identity, parsed) {
90
+ const appUrl = runtimeAppOrigin(identity.binding, option(parsed, "app-url") || undefined);
91
+ runtimeProxyOrigin(identity.binding, appUrl, option(parsed, "proxy-url") || undefined);
92
+ const launcher = currentLauncher();
93
+ const backend = detectBackend(option(parsed, "mode") || "auto", {
94
+ platform: process.platform,
95
+ userSystemd: userSystemdAvailable,
96
+ });
97
+ const prefix = identity.binding.runtimeLabel === 'main' ? [] : [identity.binding.runtimeLabel === 'preview' ? 'preview' : 'dev'];
98
+ const selectors = selectorArguments(identity);
99
+ const keepaliveArgs = [...prefix, 'service', 'keepalive', ...selectors];
100
+ const runArgs = [...prefix, 'run', ...selectors, '--app-url', appUrl, ...forwarded(parsed, RUNTIME_OPTIONS.filter((key) => key !== 'app-url'))];
101
+ const existing = readRegistration(identity);
102
+ const owner = ownerFor(backend);
103
+ if (existing && existing.backend === backend && registrationSatisfies(existing, { launcher, backend, run_args: runArgs })) {
104
+ if (backend !== "portable")
105
+ await owner.start(identity, existing);
106
+ report("installed", { label: identity.label, backend, unchanged: true, files: existing.files });
107
+ }
108
+ else {
109
+ if (existing && existing.backend !== backend)
110
+ await ownerFor(existing.backend).uninstall(identity);
111
+ const registration = {
112
+ binding: identity.binding, user: identity.user, amalgm_root: identity.amalgmRoot,
113
+ backend,
114
+ label: identity.label,
115
+ package_root: launcher.packageRoot,
116
+ package_version: launcher.packageVersion,
117
+ node: launcher.node,
118
+ bin: launcher.bin,
119
+ runtime_host: "node",
120
+ local_only: false,
121
+ files: owner.files(identity),
122
+ keepalive_args: keepaliveArgs,
123
+ run_args: runArgs,
124
+ installed_at: new Date().toISOString(),
125
+ };
126
+ writeRegistration(identity, registration);
127
+ await owner.install(identity, launcher, keepaliveArgs);
128
+ report("installed", { label: identity.label, backend, unchanged: false, files: registration.files });
129
+ }
130
+ if (backend === "portable") {
131
+ process.stdout.write(`Portable mode has no OS owner. Run this in the foreground as your entrypoint:\n ${portableEntrypoint(identity, keepaliveArgs)}\n`);
132
+ }
133
+ return 0;
134
+ }
135
+ async function status(identity) {
136
+ const registration = readRegistration(identity);
137
+ return {
138
+ label: identity.label,
139
+ backend: registration?.backend ?? null,
140
+ registered: registration !== null,
141
+ launcher: registration ? {
142
+ node: registration.node,
143
+ nodeExists: existsSync(registration.node),
144
+ bin: registration.bin,
145
+ binExists: existsSync(registration.bin),
146
+ version: registration.package_version,
147
+ } : null,
148
+ owner: registration ? await ownerFor(registration.backend).status(identity) : null,
149
+ keepalive: await keepaliveStatus(identity),
150
+ serviceDir: identity.serviceDir,
151
+ };
152
+ }
153
+ /** Remove OS launch registration, retaining logs and durable lease files. */
154
+ async function uninstall(identity) {
155
+ const registration = readRegistration(identity);
156
+ if (registration)
157
+ await ownerFor(registration.backend).uninstall(identity);
158
+ for (const backend of ALL_BACKENDS) {
159
+ const owner = ownerFor(backend);
160
+ if (Object.values(owner.files(identity)).some((file) => existsSync(file)))
161
+ await owner.uninstall(identity);
162
+ }
163
+ await stopKeepalive(identity);
164
+ rmSync(registrationFile(identity), { force: true });
165
+ }
166
+ function selectorArguments(identity) {
167
+ const args = ['--user', identity.user, '--home', identity.home, '--amalgm-root', identity.amalgmRoot, '--branch', identity.binding.branch];
168
+ if (identity.binding.localSession)
169
+ args.push('--local-session', identity.binding.localSession);
170
+ return args;
171
+ }
172
+ function forwarded(parsed, keys) {
173
+ return keys.flatMap((key) => (option(parsed, key) ? [`--${key}`, option(parsed, key)] : []));
174
+ }
175
+ function report(event, details) {
176
+ process.stdout.write(`AMALGM_SERVICE ${JSON.stringify({ event, ...details })}\n`);
177
+ }
178
+ function helpText() {
179
+ return `amalgm service — keep the runtime running whenever you are logged in
180
+
181
+ Usage:
182
+ amalgm service install --user EMAIL [--mode auto|launchd|systemd|windows|portable]
183
+ amalgm service start --user EMAIL
184
+ amalgm service stop --user EMAIL
185
+ amalgm service status --user EMAIL
186
+ amalgm service uninstall --user EMAIL
187
+ amalgm service keepalive --user EMAIL (what the OS runs; the foreground entrypoint in portable mode)
188
+
189
+ install registers one keepalive with the OS and starts it: a LaunchAgent on
190
+ macOS, a systemd user unit on Linux, a per-user Task Scheduler owner on
191
+ Windows. The keepalive runs "amalgm run" and restarts it whenever it exits.
192
+ Options given to install (--runtime-label, --home, --amalgm-root, --app-url,
193
+ --branch, --proxy-url, --port) are the options the service will run with.
194
+ `;
195
+ }
196
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/service/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type RuntimeBinding } from '@amalgm/core/binding';
2
+ import type { ServiceIdentity } from './registration.js';
3
+ export interface ControllerState {
4
+ readonly binding: RuntimeBinding;
5
+ readonly user: string;
6
+ readonly instanceId: string;
7
+ readonly pid: number;
8
+ readonly port: number;
9
+ readonly token: string;
10
+ readonly childPid: number | null;
11
+ readonly restarts: number;
12
+ }
13
+ export declare const controllerStateFile: (identity: ServiceIdentity) => string;
14
+ export declare const controllerLeaseFile: (identity: ServiceIdentity) => string;
15
+ /** A recorded port/PID is an address, not proof. Authenticate the live owner. */
16
+ export declare function controllerRequest(identity: ServiceIdentity, action: 'status' | 'stop'): Promise<ControllerState | null>;
17
+ export declare function keepaliveStatus(identity: ServiceIdentity): Promise<{
18
+ alive: boolean;
19
+ binding: RuntimeBinding;
20
+ user: string;
21
+ instanceId: string;
22
+ pid: number;
23
+ port: number;
24
+ token: string;
25
+ childPid: number | null;
26
+ restarts: number;
27
+ } | null>;
28
+ /** Stop only the authenticated owner. Never signal a remembered PID. */
29
+ export declare function stopKeepalive(identity: ServiceIdentity, timeoutMs?: number): Promise<void>;
@@ -0,0 +1,68 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { runtimeBindingsMatch } from '@amalgm/core/binding';
4
+ import { readJson } from '../filesystem.js';
5
+ import { processLeaseHeld } from '../installation/lease.js';
6
+ export const controllerStateFile = (identity) => join(identity.serviceDir, 'controller.json');
7
+ export const controllerLeaseFile = (identity) => join(identity.home, '.amalgm', 'owners', `service-${identity.labelScope}.sqlite`);
8
+ /** A recorded port/PID is an address, not proof. Authenticate the live owner. */
9
+ export async function controllerRequest(identity, action) {
10
+ const state = readJson(controllerStateFile(identity));
11
+ if (!state || !runtimeBindingsMatch(state.binding, identity.binding) || state.user !== identity.user
12
+ || !Number.isInteger(state.port) || state.port < 1 || state.port > 65535
13
+ || typeof state.token !== 'string' || state.token.length < 32 || typeof state.instanceId !== 'string')
14
+ return null;
15
+ try {
16
+ const response = await fetch(`http://127.0.0.1:${state.port}/${action}`, {
17
+ method: action === 'stop' ? 'POST' : 'GET',
18
+ headers: { authorization: `Bearer ${state.token}`,
19
+ 'x-amalgm-controller-identity': JSON.stringify({ instanceId: state.instanceId, user: identity.user, binding: identity.binding }) },
20
+ signal: AbortSignal.timeout(2_000), redirect: 'error',
21
+ });
22
+ if (!response.ok) {
23
+ await response.body?.cancel();
24
+ return null;
25
+ }
26
+ if (!response.body)
27
+ return null;
28
+ const chunks = [];
29
+ let size = 0;
30
+ const reader = response.body.getReader();
31
+ for (;;) {
32
+ const { value, done } = await reader.read();
33
+ if (done)
34
+ break;
35
+ size += value.length;
36
+ if (size > 16_384) {
37
+ await reader.cancel();
38
+ return null;
39
+ }
40
+ chunks.push(value);
41
+ }
42
+ const live = JSON.parse(Buffer.concat(chunks).toString('utf8'));
43
+ return live.instanceId === state.instanceId && live.user === state.user
44
+ && runtimeBindingsMatch(live.binding, identity.binding) ? { ...live, token: '' } : null;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ export async function keepaliveStatus(identity) {
51
+ const state = await controllerRequest(identity, 'status');
52
+ return state ? { ...state, alive: true } : null;
53
+ }
54
+ /** Stop only the authenticated owner. Never signal a remembered PID. */
55
+ export async function stopKeepalive(identity, timeoutMs = 30_000) {
56
+ const leaseFile = controllerLeaseFile(identity);
57
+ if (!existsSync(leaseFile) || !processLeaseHeld(leaseFile))
58
+ return;
59
+ if (!await controllerRequest(identity, 'stop'))
60
+ throw new Error('The runtime controller is occupied but unavailable; ownership was not changed.');
61
+ const deadline = Date.now() + timeoutMs;
62
+ while (processLeaseHeld(leaseFile)) {
63
+ if (Date.now() >= deadline)
64
+ throw new Error('The runtime controller did not finish stopping; ownership was not changed.');
65
+ await new Promise((resolve) => setTimeout(resolve, 50));
66
+ }
67
+ }
68
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../../src/service/control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /** OS adapters start one leased controller; it owns one independent runtime.
2
+ * UI shutdown never stops that controller. Status and stop authenticate the
3
+ * live controller; lock age and remembered PIDs never authorize takeover. */
4
+ export { runServiceCli } from './cli.js';
5
+ export { serviceIdentity, detectBackend, currentLauncher } from './registration.js';
6
+ export { keepaliveStatus, stopKeepalive } from './control.js';
7
+ export { renderLaunchdPlist } from './launchd.js';
8
+ export { renderSystemdUnit } from './systemd.js';
9
+ export { windowsControllerAction } from './windows-task.js';
@@ -0,0 +1,10 @@
1
+ /** OS adapters start one leased controller; it owns one independent runtime.
2
+ * UI shutdown never stops that controller. Status and stop authenticate the
3
+ * live controller; lock age and remembered PIDs never authorize takeover. */
4
+ export { runServiceCli } from './cli.js';
5
+ export { serviceIdentity, detectBackend, currentLauncher } from './registration.js';
6
+ export { keepaliveStatus, stopKeepalive } from './control.js';
7
+ export { renderLaunchdPlist } from './launchd.js';
8
+ export { renderSystemdUnit } from './systemd.js';
9
+ export { windowsControllerAction } from './windows-task.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA;;6EAE6E;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type ServiceIdentity } from './registration.js';
2
+ export declare const STOP_GRACE_MS = 25000;
3
+ export declare const LOG_LIMIT_BYTES: number;
4
+ /** One leased controller supervises one runtime over IPC. OS adapters restart
5
+ * the controller; Core supplies bounded restart timing for its runtime child. */
6
+ export declare function runKeepalive(identity: ServiceIdentity): Promise<number>;
7
+ /** Two bounded log files; even a single oversized write obeys the limit. */
8
+ export declare function openRotatingLog(file: string, limitBytes: number): {
9
+ write(chunk: Buffer | string): void;
10
+ close(): void;
11
+ };