@aeolus-fleet/trierarch 0.21.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +4 -4
  2. package/dist/adapters/capped-log.d.ts +23 -0
  3. package/dist/adapters/capped-log.js +74 -0
  4. package/dist/adapters/capped-log.js.map +1 -0
  5. package/dist/adapters/claude-code.d.ts +2 -1
  6. package/dist/adapters/claude-code.js +5 -3
  7. package/dist/adapters/claude-code.js.map +1 -1
  8. package/dist/adapters/codex-plugin-data.d.ts +11 -0
  9. package/dist/adapters/codex-plugin-data.js +44 -0
  10. package/dist/adapters/codex-plugin-data.js.map +1 -0
  11. package/dist/adapters/codex-screen.d.ts +2 -0
  12. package/dist/adapters/codex-screen.js +9 -3
  13. package/dist/adapters/codex-screen.js.map +1 -1
  14. package/dist/adapters/codex.d.ts +8 -2
  15. package/dist/adapters/codex.js +12 -6
  16. package/dist/adapters/codex.js.map +1 -1
  17. package/dist/adapters/command-line.d.ts +1 -1
  18. package/dist/adapters/command-line.js +2 -2
  19. package/dist/adapters/command-line.js.map +1 -1
  20. package/dist/adapters/harnesses.js +5 -3
  21. package/dist/adapters/harnesses.js.map +1 -1
  22. package/dist/adapters/json-state.js +1 -0
  23. package/dist/adapters/json-state.js.map +1 -1
  24. package/dist/adapters/plugin-identity.d.ts +6 -2
  25. package/dist/adapters/plugin-identity.js +4 -2
  26. package/dist/adapters/plugin-identity.js.map +1 -1
  27. package/dist/adapters/plugin-update.d.ts +41 -0
  28. package/dist/adapters/plugin-update.js +141 -0
  29. package/dist/adapters/plugin-update.js.map +1 -0
  30. package/dist/adapters/plugin.d.ts +8 -1
  31. package/dist/adapters/plugin.js +14 -6
  32. package/dist/adapters/plugin.js.map +1 -1
  33. package/dist/adapters/rest-fleet.d.ts +6 -1
  34. package/dist/adapters/rest-fleet.js +24 -2
  35. package/dist/adapters/rest-fleet.js.map +1 -1
  36. package/dist/adapters/running-processes.d.ts +10 -0
  37. package/dist/adapters/running-processes.js +28 -0
  38. package/dist/adapters/running-processes.js.map +1 -0
  39. package/dist/adapters/tmux.d.ts +11 -0
  40. package/dist/adapters/tmux.js +11 -1
  41. package/dist/adapters/tmux.js.map +1 -1
  42. package/dist/cli/main.js +27 -10
  43. package/dist/cli/main.js.map +1 -1
  44. package/dist/cli/run.js +2 -2
  45. package/dist/cli/run.js.map +1 -1
  46. package/dist/cli/status.d.ts +3 -1
  47. package/dist/cli/status.js +2 -0
  48. package/dist/cli/status.js.map +1 -1
  49. package/dist/cli/upgrade.d.ts +28 -0
  50. package/dist/cli/upgrade.js +68 -3
  51. package/dist/cli/upgrade.js.map +1 -1
  52. package/dist/core/entry.d.ts +2 -0
  53. package/dist/core/entry.js.map +1 -1
  54. package/dist/core/no-terminal-questions.d.ts +4 -0
  55. package/dist/core/no-terminal-questions.js +10 -0
  56. package/dist/core/no-terminal-questions.js.map +1 -0
  57. package/dist/core/ports.d.ts +6 -0
  58. package/dist/core/reconciler.d.ts +21 -0
  59. package/dist/core/reconciler.js +44 -6
  60. package/dist/core/reconciler.js.map +1 -1
  61. package/dist/core/run-pass.js +57 -10
  62. package/dist/core/run-pass.js.map +1 -1
  63. package/package.json +11 -4
@@ -0,0 +1,41 @@
1
+ import { type PluginHarness } from './plugin.js';
2
+ import { type RunningProcess } from './running-processes.js';
3
+ /**
4
+ * The aeolus plugin updated through each harness's own command (#581), from
5
+ * the release tag it is given, or main without one (#652): each harness's
6
+ * aeolus-fleet marketplace is pointed at it first. Neither harness adds a
7
+ * second source for a marketplace. Codex's is removed and added again, which
8
+ * keeps the plugin and its cache, once a throwaway Codex home proves this
9
+ * Codex keeps the plugin's data, its log and the crew identities not yet
10
+ * moved to ~/.aeolus/crews, when it is removed (#660); the upgrade changes
11
+ * nothing otherwise. Claude Code's is never removed, since that uninstalls the
12
+ * plugin and deletes its data, with its log and those identities: the
13
+ * marketplace its settings declare is dropped from them, and adding it again
14
+ * declares the new source.
15
+ * Codex's plugin upgrade installs the new version and deletes every other
16
+ * version folder, so a Codex session still running on the old version would
17
+ * lose its plugin scripts: the version folders there before are kept aside and
18
+ * put back beside the new one, also when the upgrade fails. After an upgrade
19
+ * that succeeded, a version folder no running session can use is removed
20
+ * (#653): a session uses the newest version there was when it started, so a
21
+ * version is left behind once its next version came before every running
22
+ * Codex process, and the trierarch, started. A version counts from when the
23
+ * upgrade installed it. Claude Code keeps old versions beside the new one
24
+ * itself.
25
+ */
26
+ export interface PluginUpdate {
27
+ /** `tag`: the release tag to install the plugin from; none installs it from main. */
28
+ update(harness: PluginHarness, tag: string | undefined): Promise<void>;
29
+ }
30
+ export declare function createPluginUpdate(at: {
31
+ homeDirectory: string;
32
+ env: Readonly<Record<string, string | undefined>>;
33
+ /** The programs to run; `codex` and `claude` unless a test runs others. */
34
+ commands?: Partial<Record<PluginHarness, string>>;
35
+ /** The clock; a test passes its own. */
36
+ now?: () => Date;
37
+ /** The processes running on this machine now; ps unless a test says them. */
38
+ processes?: (now: Date) => Promise<readonly RunningProcess[]>;
39
+ /** The running trierarch's pid, none when none runs: it took its plugin scripts from the newest version when it started. */
40
+ trierarchPid: () => Promise<number | undefined>;
41
+ }): PluginUpdate;
@@ -0,0 +1,141 @@
1
+ import { cp, mkdtemp, readdir, readFile, rename, rm, stat, utimes, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { basename, join } from 'node:path';
4
+ import { z } from 'zod';
5
+ import { codexKeepsPluginData } from './codex-plugin-data.js';
6
+ import { byVersion } from './plugin.js';
7
+ import { runCommand } from './run-command.js';
8
+ import { runningProcesses } from './running-processes.js';
9
+ const MARKETPLACE = 'aeolus-fleet';
10
+ const REPOSITORY = 'ThomasHendrickx/aeolus-fleet';
11
+ const PLUGIN = 'aeolus@aeolus-fleet';
12
+ async function run(command, args) {
13
+ const result = await runCommand(command, { args });
14
+ if (result.status !== 0) {
15
+ throw new Error(`${[command, ...args].join(' ')} failed: ${`${result.stdout}${result.stderr}`.trim()}`);
16
+ }
17
+ }
18
+ const settingsSchema = z.record(z.string(), z.unknown());
19
+ const marketplacesSchema = z.record(z.string(), z.unknown());
20
+ /** Drops the aeolus-fleet marketplace from the `extraKnownMarketplaces` of Claude Code's settings, leaving everything else as it is. */
21
+ async function dropDeclaredMarketplace(path) {
22
+ const text = await readFile(path, 'utf8').catch(() => undefined);
23
+ if (text === undefined) {
24
+ return;
25
+ }
26
+ const settings = settingsSchema.parse(JSON.parse(text));
27
+ const declared = marketplacesSchema.safeParse(settings.extraKnownMarketplaces).data;
28
+ if (declared?.[MARKETPLACE] === undefined) {
29
+ return;
30
+ }
31
+ const others = Object.fromEntries(Object.entries(declared).filter(([name]) => name !== MARKETPLACE));
32
+ const temporary = `${path}.aeolus-trierarch.tmp`;
33
+ await writeFile(temporary, `${JSON.stringify({ ...settings, extraKnownMarketplaces: others }, null, 2)}\n`, { mode: (await stat(path)).mode & 0o777 });
34
+ await rename(temporary, path);
35
+ }
36
+ /** The folders under `cache`, none where it does not exist. */
37
+ async function versionFolders(cache) {
38
+ const names = await readdir(cache).catch(() => []);
39
+ const folders = [];
40
+ for (const name of names) {
41
+ if ((await stat(join(cache, name))).isDirectory()) {
42
+ folders.push(name);
43
+ }
44
+ }
45
+ return folders;
46
+ }
47
+ /** ps says elapsed time in whole seconds, and a session takes a moment to read its plugin: a start this close after a version came may still have found the one before. */
48
+ const START_MARGIN_MS = 60 * 1000;
49
+ const VERSION = /^\d+\.\d+\.\d+$/;
50
+ /** Marks each version folder the upgrade installed with the time it did, whatever times Codex gave its files. */
51
+ async function markInstalled(cache, at) {
52
+ for (const version of await versionFolders(cache)) {
53
+ if (!at.before.includes(version)) {
54
+ await utimes(join(cache, version), at.now, at.now);
55
+ }
56
+ }
57
+ }
58
+ /** Removes each version folder whose next version came before the earliest start, every older one when nothing runs. */
59
+ async function removeUnused(cache, earliestStart) {
60
+ const versions = (await versionFolders(cache)).filter((name) => VERSION.test(name)).sort(byVersion);
61
+ for (const [index, version] of versions.entries()) {
62
+ const next = versions[index + 1];
63
+ if (next === undefined) {
64
+ continue;
65
+ }
66
+ const nextCame = (await stat(join(cache, next))).mtime.getTime();
67
+ if (earliestStart === undefined || earliestStart.getTime() >= nextCame + START_MARGIN_MS) {
68
+ await rm(join(cache, version), { recursive: true, force: true });
69
+ }
70
+ }
71
+ }
72
+ /** The earliest start of a process that may use a Codex plugin version: a Codex one, or the trierarch. */
73
+ function earliestStartOf(processes, trierarchPid) {
74
+ const users = processes.filter((process) => basename(process.program) === 'codex' || process.pid === trierarchPid);
75
+ return users.map((process) => process.startedAt).reduce((earliest, startedAt) => (earliest === undefined || startedAt < earliest ? startedAt : earliest), undefined);
76
+ }
77
+ /** Runs `upgrade` with every version folder in `cache` kept aside, and puts back each one it deleted; then removes the unused ones. */
78
+ async function keepingVersions(cache, at) {
79
+ const versions = await versionFolders(cache);
80
+ const times = new Map(await Promise.all(versions.map(async (version) => [version, await stat(join(cache, version))])));
81
+ const aside = await mkdtemp(join(tmpdir(), 'aeolus-plugin-versions-'));
82
+ try {
83
+ for (const version of versions) {
84
+ await cp(join(cache, version), join(aside, version), { recursive: true, preserveTimestamps: true });
85
+ }
86
+ try {
87
+ await at.upgrade();
88
+ }
89
+ finally {
90
+ const left = new Set(await versionFolders(cache));
91
+ for (const version of versions.filter((name) => !left.has(name))) {
92
+ await cp(join(aside, version), join(cache, version), { recursive: true, preserveTimestamps: true });
93
+ // cp keeps the times of files, not of folders: the folder's time says when its version came.
94
+ const time = times.get(version);
95
+ if (time !== undefined) {
96
+ await utimes(join(cache, version), time.atime, time.mtime);
97
+ }
98
+ }
99
+ }
100
+ await at.afterUpgrade(versions);
101
+ }
102
+ finally {
103
+ await rm(aside, { recursive: true, force: true });
104
+ }
105
+ }
106
+ export function createPluginUpdate(at) {
107
+ const now = at.now ?? (() => new Date());
108
+ const processes = at.processes ?? runningProcesses;
109
+ const codex = at.commands?.codex ?? 'codex';
110
+ const claude = at.commands?.['claude-code'] ?? 'claude';
111
+ const claudeSettings = join(at.env.CLAUDE_CONFIG_DIR ?? join(at.homeDirectory, '.claude'), 'settings.json');
112
+ const codexCache = join(at.env.CODEX_HOME ?? join(at.homeDirectory, '.codex'), 'plugins', 'cache', MARKETPLACE, 'aeolus');
113
+ return {
114
+ update: async (harness, tag) => {
115
+ if (harness === 'codex') {
116
+ if (!(await codexKeepsPluginData(codex))) {
117
+ throw new Error(`Codex would delete the aeolus plugin's data on this machine, its log and the crew identities not yet moved to ~/.aeolus/crews, when its ${MARKETPLACE} marketplace is removed: the upgrade leaves the marketplace as it is`);
118
+ }
119
+ await keepingVersions(codexCache, {
120
+ upgrade: async () => {
121
+ // There may be no marketplace to remove: adding it says what is wrong.
122
+ await runCommand(codex, { args: ['plugin', 'marketplace', 'remove', MARKETPLACE] });
123
+ await run(codex, ['plugin', 'marketplace', 'add', REPOSITORY, ...(tag === undefined ? [] : ['--ref', tag])]);
124
+ await run(codex, ['plugin', 'marketplace', 'upgrade', MARKETPLACE]);
125
+ },
126
+ afterUpgrade: async (before) => {
127
+ const upgradedAt = now();
128
+ await markInstalled(codexCache, { before, now: upgradedAt });
129
+ await removeUnused(codexCache, earliestStartOf(await processes(upgradedAt), await at.trierarchPid()));
130
+ },
131
+ });
132
+ return;
133
+ }
134
+ await dropDeclaredMarketplace(claudeSettings);
135
+ await run(claude, ['plugin', 'marketplace', 'add', tag === undefined ? REPOSITORY : `${REPOSITORY}#${tag}`]);
136
+ await run(claude, ['plugin', 'marketplace', 'update', MARKETPLACE]);
137
+ await run(claude, ['plugin', 'update', PLUGIN]);
138
+ },
139
+ };
140
+ }
141
+ //# sourceMappingURL=plugin-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-update.js","sourceRoot":"","sources":["../../src/adapters/plugin-update.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,17 @@
1
1
  import type { AeolusPlugin } from './plugin-identity.js';
2
2
  /** The harnesses that install the aeolus plugin, each in its own plugin folders. */
3
3
  export type PluginHarness = 'claude-code' | 'codex';
4
+ export declare const PLUGIN_HARNESSES: readonly PluginHarness[];
5
+ /** The aeolus plugin's data folder in a harness's plugin folders, as both harnesses name it. */
6
+ export declare const PLUGIN_DATA_FOLDER = "aeolus-aeolus-fleet";
4
7
  /**
5
8
  * Where a harness installed the aeolus plugin: the newest version in its
6
9
  * plugin cache and the plugin's data folder, unless variables name others
7
10
  * (AEOLUS_PLUGIN_ROOT and AEOLUS_PLUGIN_DATA for Claude Code,
8
11
  * AEOLUS_CODEX_PLUGIN_ROOT and AEOLUS_CODEX_PLUGIN_DATA for Codex). The
9
- * folders follow CLAUDE_CONFIG_DIR and CODEX_HOME as the harnesses do.
12
+ * folders follow CLAUDE_CONFIG_DIR and CODEX_HOME as the harnesses do. The
13
+ * identities of the harness's sessions live in ~/.aeolus/crews/<harness>, as
14
+ * the plugin keeps them (decision 0015).
10
15
  */
11
16
  export declare function findAeolusPlugin(at: {
12
17
  homeDirectory: string;
@@ -23,3 +28,5 @@ export declare function aeolusPluginVersion(at: {
23
28
  env: Readonly<Record<string, string | undefined>>;
24
29
  harness: string;
25
30
  }): Promise<string | undefined>;
31
+ /** Orders versions such as 0.9.0 and 0.10.0 by their numbers. */
32
+ export declare function byVersion(left: string, right: string): number;
@@ -1,6 +1,9 @@
1
1
  import { readdir, readFile } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
3
  import { z } from 'zod';
4
+ export const PLUGIN_HARNESSES = ['claude-code', 'codex'];
5
+ /** The aeolus plugin's data folder in a harness's plugin folders, as both harnesses name it. */
6
+ export const PLUGIN_DATA_FOLDER = 'aeolus-aeolus-fleet';
4
7
  /** Where each harness keeps its plugins, and the variables that point elsewhere. */
5
8
  function placesOf(at) {
6
9
  const { homeDirectory, env } = at;
@@ -14,13 +17,17 @@ function placesOf(at) {
14
17
  * plugin cache and the plugin's data folder, unless variables name others
15
18
  * (AEOLUS_PLUGIN_ROOT and AEOLUS_PLUGIN_DATA for Claude Code,
16
19
  * AEOLUS_CODEX_PLUGIN_ROOT and AEOLUS_CODEX_PLUGIN_DATA for Codex). The
17
- * folders follow CLAUDE_CONFIG_DIR and CODEX_HOME as the harnesses do.
20
+ * folders follow CLAUDE_CONFIG_DIR and CODEX_HOME as the harnesses do. The
21
+ * identities of the harness's sessions live in ~/.aeolus/crews/<harness>, as
22
+ * the plugin keeps them (decision 0015).
18
23
  */
19
24
  export async function findAeolusPlugin(at) {
20
- const places = placesOf({ ...at, harness: at.harness ?? 'claude-code' });
21
- const data = places.data ?? join(places.plugins, 'data', 'aeolus-aeolus-fleet');
25
+ const harness = at.harness ?? 'claude-code';
26
+ const places = placesOf({ ...at, harness });
27
+ const data = places.data ?? join(places.plugins, 'data', PLUGIN_DATA_FOLDER);
28
+ const crews = join(at.homeDirectory, '.aeolus', 'crews', harness);
22
29
  if (places.root !== undefined) {
23
- return { root: places.root, data };
30
+ return { root: places.root, data, crews };
24
31
  }
25
32
  const cache = join(places.plugins, 'cache', 'aeolus-fleet', 'aeolus');
26
33
  const versions = (await readdir(cache).catch(() => [])).filter((name) => /^\d+\.\d+\.\d+$/.test(name)).sort(byVersion);
@@ -28,7 +35,7 @@ export async function findAeolusPlugin(at) {
28
35
  if (newest === undefined) {
29
36
  throw new Error(`The aeolus plugin is not installed for ${places.name} (nothing in ${cache}): install it, or set ${places.rootVariable}`);
30
37
  }
31
- return { root: join(cache, newest), data };
38
+ return { root: join(cache, newest), data, crews };
32
39
  }
33
40
  /** The part of a plugin's manifest the version is read from. */
34
41
  const manifestSchema = z.object({ version: z.string() });
@@ -59,7 +66,8 @@ export async function aeolusPluginVersion(at) {
59
66
  return undefined;
60
67
  }
61
68
  }
62
- function byVersion(left, right) {
69
+ /** Orders versions such as 0.9.0 and 0.10.0 by their numbers. */
70
+ export function byVersion(left, right) {
63
71
  const [a, b] = [left, right].map((version) => version.split('.').map(Number));
64
72
  for (let index = 0; index < 3; index += 1) {
65
73
  const difference = (a?.[index] ?? 0) - (b?.[index] ?? 0);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/adapters/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/adapters/plugin.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,9 @@ import type { Delivery, FleetPort } from '../core/ports.js';
6
6
  * crew token, its `crew:run` calls for the ships assigned to it (assigned
7
7
  * requests, status, confirm, ship, getStartingPrompt, release), and a
8
8
  * session's register, inbox and report. A refusal the trierarch does not expect throws
9
- * with the fleet's code and message.
9
+ * with the fleet's code and message. While the fleet is busy (nothing stored),
10
+ * each call is made again by itself with the same body, after each of the busy
11
+ * waits (each drawn by `busyWaitMs`), so a send keeps its idempotency key.
10
12
  */
11
13
  /** What the trierarch states as model and harness: it is software, not a model, as squadrons is (#157). */
12
14
  export declare const TRIERARCH_SELF: {
@@ -33,4 +35,7 @@ export interface RestFleet extends FleetPort {
33
35
  export declare function createRestFleet(options: {
34
36
  fleetUrl: string;
35
37
  crewToken: string;
38
+ busyWaitsMs?: readonly number[];
39
+ random?: () => number;
40
+ wait?: (waitMs: number, signal?: AbortSignal) => Promise<void>;
36
41
  }): RestFleet;
@@ -1,4 +1,5 @@
1
- import { assignedCrewRequestsOutputSchema, clearRequestsOutputSchema, giveBackCrewRequestOutputSchema, idSchema, receivedDeliverySchema, shipDetailOutputSchema } from '@aeolus-fleet/common';
1
+ import { setTimeout as wait } from 'node:timers/promises';
2
+ import { assignedCrewRequestsOutputSchema, busyWaitMs, clearRequestsOutputSchema, FLEET_BUSY_WAITS_MS, giveBackCrewRequestOutputSchema, idSchema, receivedDeliverySchema, shipDetailOutputSchema } from '@aeolus-fleet/common';
2
3
  import { z } from 'zod';
3
4
  import { runningVersion } from './version.js';
4
5
  /**
@@ -7,7 +8,9 @@ import { runningVersion } from './version.js';
7
8
  * crew token, its `crew:run` calls for the ships assigned to it (assigned
8
9
  * requests, status, confirm, ship, getStartingPrompt, release), and a
9
10
  * session's register, inbox and report. A refusal the trierarch does not expect throws
10
- * with the fleet's code and message.
11
+ * with the fleet's code and message. While the fleet is busy (nothing stored),
12
+ * each call is made again by itself with the same body, after each of the busy
13
+ * waits (each drawn by `busyWaitMs`), so a send keeps its idempotency key.
11
14
  */
12
15
  /** What the trierarch states as model and harness: it is software, not a model, as squadrons is (#157). */
13
16
  export const TRIERARCH_SELF = { model: `@aeolus-fleet/trierarch@${runningVersion()}`, harness: 'aeolus-trierarch' };
@@ -16,6 +19,8 @@ const LOCATION = { kind: 'DEVICE' };
16
19
  /** The harness a session the trierarch crews states when the trierarch registers it. */
17
20
  const SESSION_HARNESS = 'claude-code';
18
21
  const refusalSchema = z.object({ code: z.string(), message: z.string() });
22
+ /** The fleet's code for a call it could not start: nothing was stored, so the same call may be made again. */
23
+ const FLEET_BUSY = 'SERVICE_UNAVAILABLE';
19
24
  /** A refusal from the fleet: its code and message, and both together as the error's message. */
20
25
  export class FleetRefusal extends Error {
21
26
  code;
@@ -30,7 +35,24 @@ export function createRestFleet(options) {
30
35
  const fleetUrl = options.fleetUrl.replace(/\/$/, '');
31
36
  /** A call that got no answer: said with the fleet's url, unless it was stopped on purpose. */
32
37
  const unreachable = (error, signal) => signal?.aborted === true ? error : new Error(`The fleet at ${fleetUrl} cannot be reached: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
38
+ const busyWaitsMs = options.busyWaitsMs ?? FLEET_BUSY_WAITS_MS;
39
+ const random = options.random ?? Math.random;
40
+ const waitBusy = options.wait ?? ((waitMs, signal) => wait(waitMs, undefined, signal === undefined ? {} : { signal }));
33
41
  async function call(request) {
42
+ for (const waitMs of busyWaitsMs) {
43
+ try {
44
+ return await callOnce(request);
45
+ }
46
+ catch (error) {
47
+ if (!(error instanceof FleetRefusal && error.code === FLEET_BUSY)) {
48
+ throw error;
49
+ }
50
+ await waitBusy(busyWaitMs(waitMs, random), request.signal);
51
+ }
52
+ }
53
+ return callOnce(request);
54
+ }
55
+ async function callOnce(request) {
34
56
  const headers = {};
35
57
  const crewToken = request.crewToken ?? options.crewToken;
36
58
  if (crewToken !== '') {
@@ -1 +1 @@
1
- {"version":3,"file":"rest-fleet.js","sourceRoot":"","sources":["../../src/adapters/rest-fleet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rest-fleet.js","sourceRoot":"","sources":["../../src/adapters/rest-fleet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,gCAAgC,EAAE,UAAU,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,QAAQ,EAAE,sBAAsB,EAAE,sBAAsB,EAAe,MAAM,sBAAsB,CAAC;AAC5O,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;;;;GASG;AAEH,2GAA2G;AAC3G,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,KAAK,EAAE,2BAA2B,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAW,CAAC;AAE7H,uFAAuF;AACvF,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC;AAE7C,wFAAwF;AACxF,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE1E,8GAA8G;AAC9G,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAEzC,gGAAgG;AAChG,MAAM,OAAO,YAAa,SAAQ,KAAK;IAE1B;IACA;IAFX,YACW,IAAY,EACZ,IAAY;QAErB,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QAHjB,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;IAGvB,CAAC;CACF;AAkBD,MAAM,UAAU,eAAe,CAAC,OAAwK;IACtM,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrD,8FAA8F;IAC9F,MAAM,WAAW,GAAG,CAAC,KAAc,EAAE,MAA+B,EAAW,EAAE,CAC/E,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,gBAAgB,QAAQ,uBAAuB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1K,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,mBAAmB,CAAC;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,MAAc,EAAE,MAAoB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC7I,KAAK,UAAU,IAAI,CAAI,OAAqB;QAC1C,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;oBAClE,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,QAAQ,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IACD,KAAK,UAAU,QAAQ,CAAI,OAAqB;QAC9C,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;QACzD,IAAI,SAAS,KAAK,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,aAAa,GAAG,UAAU,SAAS,EAAE,CAAC;QAChD,CAAC;QACD,8CAA8C;QAC9C,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CACpB,GAAG,QAAQ,UAAU,OAAO,CAAC,IAAI,EAAE,EACnC,OAAO,CAAC,IAAI,KAAK,SAAS;gBACxB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE;gBAC5D,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,CACxJ,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,qHAAqH;QACrH,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gBAAgB,QAAQ,mCAAmC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,qCAAqC,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7J,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9C,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACrJ,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,IAAwC,EAAE,OAAe,EAAE,EAAE,CAC7E,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAEhJ,OAAO;QACL,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACrB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;gBACpG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpB,KAAK,cAAc;wBACjB,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;oBACnD,KAAK,QAAQ;wBACX,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC7C,KAAK,SAAS;wBACZ,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBAC/B,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAChE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;gBAC9B,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QAC5I,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;QACzD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC;QACpE,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QACrH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC7L,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5J,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACxB,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACzB,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,YAAY,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE;YAC/C,MAAM,IAAI,CAAC;gBACT,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE;gBACzI,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;aACtD,CAAC,CAAC;QACL,CAAC;QACD,gBAAgB,EAAE,KAAK,IAAI,EAAE,CAC3B,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5N,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YAC5D,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxJ,CAAC;QACD,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,EAAE;YACtD,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;gBACxI,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YAC/B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;oBAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;gBACpE,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/B,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,aAAa,EAAE,KAAK,IAAI,EAAE,CACxB,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC9I,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YAChC,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;YACzB,IAAI,CAAC;gBACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;gBACtH,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,YAAY,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;oBACrG,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;gBAChC,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;YAC3C,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7C,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7F,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ /** A process running on this machine: its pid, its program and when it started. */
2
+ export interface RunningProcess {
3
+ readonly pid: number;
4
+ readonly program: string;
5
+ readonly startedAt: Date;
6
+ }
7
+ /** The processes `ps -A -o pid=,etime=,comm=` says, each started its elapsed time before `now`. */
8
+ export declare function processesOf(text: string, now: Date): RunningProcess[];
9
+ /** Every process running on this machine now, as macOS and Linux ps both say them. */
10
+ export declare function runningProcesses(now: Date): Promise<RunningProcess[]>;
@@ -0,0 +1,28 @@
1
+ import { runCommand } from './run-command.js';
2
+ const SECOND = 1000;
3
+ const MINUTE = 60 * SECOND;
4
+ const HOUR = 60 * MINUTE;
5
+ const DAY = 24 * HOUR;
6
+ /** A line of `ps -A -o pid=,etime=,comm=`: the elapsed time is `[[days-]hours:]minutes:seconds`. */
7
+ const LINE = /^\s*(\d+)\s+(?:(\d+)-)?(?:(\d+):)?(\d+):(\d+)\s+(.+)$/;
8
+ /** The processes `ps -A -o pid=,etime=,comm=` says, each started its elapsed time before `now`. */
9
+ export function processesOf(text, now) {
10
+ return text.split('\n').flatMap((line) => {
11
+ const match = LINE.exec(line);
12
+ if (match === null) {
13
+ return [];
14
+ }
15
+ const [, pid, days, hours, minutes, seconds, program] = match;
16
+ const elapsed = Number(days ?? 0) * DAY + Number(hours ?? 0) * HOUR + Number(minutes) * MINUTE + Number(seconds) * SECOND;
17
+ return [{ pid: Number(pid), program: (program ?? '').trim(), startedAt: new Date(now.getTime() - elapsed) }];
18
+ });
19
+ }
20
+ /** Every process running on this machine now, as macOS and Linux ps both say them. */
21
+ export async function runningProcesses(now) {
22
+ const listed = await runCommand('ps', { args: ['-A', '-o', 'pid=,etime=,comm='] });
23
+ if (listed.status !== 0) {
24
+ throw new Error(`ps -A -o pid=,etime=,comm= failed: ${listed.stderr.trim()}`);
25
+ }
26
+ return processesOf(listed.stdout, now);
27
+ }
28
+ //# sourceMappingURL=running-processes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"running-processes.js","sourceRoot":"","sources":["../../src/adapters/running-processes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAS9C,MAAM,MAAM,GAAG,IAAI,CAAC;AACpB,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,CAAC;AAC3B,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC;AACzB,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtB,oGAAoG;AACpG,MAAM,IAAI,GAAG,uDAAuD,CAAC;AAErE,mGAAmG;AACnG,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,GAAS;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;QAC1H,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC,CAAC,CAAC;AACL,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAS;IAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACnF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC"}
@@ -5,6 +5,11 @@ import type { ProcessPort } from '../core/ports.js';
5
5
  * per ship, named after its ship id, kept on exit so an exit is seen. The
6
6
  * trierarch uses its own tmux server (`tmux -L aeolus-trierarch`), so it never
7
7
  * touches the operator's own sessions.
8
+ *
9
+ * The first session started forks the tmux server, which keeps running when
10
+ * the trierarch stops. Under a systemd unit it starts in a scope of its own
11
+ * (`systemd-run --scope`), so it is not left over in the service's control
12
+ * group on a restart (#537), and the unit's stop leaves it alone (#479).
8
13
  */
9
14
  export interface Tmux extends ProcessPort {
10
15
  /** Starts the command in the folder, in a new session for the ship; an exited one is replaced. */
@@ -23,6 +28,12 @@ export interface Tmux extends ProcessPort {
23
28
  screen(shipId: ShipId): Promise<string>;
24
29
  }
25
30
  export declare const TMUX_SERVER = "aeolus-trierarch";
31
+ /** What the tmux command that may start the server runs through: a systemd scope of its own under a systemd unit, which sets INVOCATION_ID. */
32
+ export declare function sessionsLaunch(at: {
33
+ platform: string;
34
+ env: Readonly<Record<string, string | undefined>>;
35
+ }): readonly string[];
26
36
  export declare function createTmux(options?: {
27
37
  server?: string;
38
+ launch?: readonly string[];
28
39
  }): Tmux;
@@ -5,11 +5,16 @@ const PREFIX = 'trierarch-';
5
5
  export const TMUX_SERVER = 'aeolus-trierarch';
6
6
  /** How many lines back a screen is read: the launch window's first prompt fits well within. */
7
7
  const SCREEN_LINES = 200;
8
+ /** What the tmux command that may start the server runs through: a systemd scope of its own under a systemd unit, which sets INVOCATION_ID. */
9
+ export function sessionsLaunch(at) {
10
+ return at.platform === 'linux' && at.env.INVOCATION_ID !== undefined ? ['systemd-run', '--user', '--scope', '--quiet', '--collect', '--'] : [];
11
+ }
8
12
  function sessionName(shipId) {
9
13
  return `${PREFIX}${shipId}`;
10
14
  }
11
15
  export function createTmux(options = {}) {
12
16
  const server = options.server ?? TMUX_SERVER;
17
+ const launch = options.launch ?? [];
13
18
  const tmux = async (args) => runCommand('tmux', { args: ['-L', server, ...args] });
14
19
  const must = async (args) => {
15
20
  const result = await tmux(args);
@@ -40,7 +45,12 @@ export function createTmux(options = {}) {
40
45
  const name = sessionName(shipId);
41
46
  await tmux(['kill-session', '-t', `=${name}`]);
42
47
  // Start with the shell, keep the pane on exit, then run the command: so even a command that ends at once leaves its exit to see.
43
- await must(['new-session', '-d', '-s', name, '-c', folder, '-x', '200', '-y', '50']);
48
+ // The one command that starts the server when none runs yet.
49
+ const [program, ...args] = [...launch, 'tmux', '-L', server, 'new-session', '-d', '-s', name, '-c', folder, '-x', '200', '-y', '50'];
50
+ const started = await runCommand(program, { args });
51
+ if (started.status !== 0) {
52
+ throw new Error(`tmux new-session failed: ${started.stderr.trim()}`);
53
+ }
44
54
  await must(['set-option', '-w', '-t', `=${name}:`, 'remain-on-exit', 'on']);
45
55
  await must(['respawn-pane', '-k', '-t', `=${name}:`, '-c', folder, '--', ...command]);
46
56
  },
@@ -1 +1 @@
1
- {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/adapters/tmux.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/adapters/tmux.ts"],"names":[],"mappings":"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"}