@aeolus-fleet/trierarch 0.17.0 → 0.17.2

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 (60) hide show
  1. package/README.md +36 -17
  2. package/dist/adapters/claude-code-setup.d.ts +18 -0
  3. package/dist/adapters/claude-code-setup.js +51 -0
  4. package/dist/adapters/claude-code-setup.js.map +1 -0
  5. package/dist/adapters/claude-code.js +18 -2
  6. package/dist/adapters/claude-code.js.map +1 -1
  7. package/dist/adapters/files.d.ts +6 -3
  8. package/dist/adapters/files.js +4 -3
  9. package/dist/adapters/files.js.map +1 -1
  10. package/dist/adapters/git-workspace.d.ts +0 -6
  11. package/dist/adapters/git-workspace.js +12 -2
  12. package/dist/adapters/git-workspace.js.map +1 -1
  13. package/dist/adapters/json-state.js +1 -0
  14. package/dist/adapters/json-state.js.map +1 -1
  15. package/dist/adapters/rest-fleet.d.ts +7 -2
  16. package/dist/adapters/rest-fleet.js +17 -4
  17. package/dist/adapters/rest-fleet.js.map +1 -1
  18. package/dist/adapters/service.d.ts +53 -0
  19. package/dist/adapters/service.js +224 -0
  20. package/dist/adapters/service.js.map +1 -0
  21. package/dist/bin/aeolus-trierarch.js +3 -1
  22. package/dist/bin/aeolus-trierarch.js.map +1 -1
  23. package/dist/cli/config-check.d.ts +11 -2
  24. package/dist/cli/config-check.js +10 -3
  25. package/dist/cli/config-check.js.map +1 -1
  26. package/dist/cli/init.d.ts +36 -11
  27. package/dist/cli/init.js +213 -19
  28. package/dist/cli/init.js.map +1 -1
  29. package/dist/cli/list.d.ts +16 -0
  30. package/dist/cli/list.js +32 -0
  31. package/dist/cli/list.js.map +1 -0
  32. package/dist/cli/logs.d.ts +16 -0
  33. package/dist/cli/logs.js +51 -0
  34. package/dist/cli/logs.js.map +1 -0
  35. package/dist/cli/main.js +221 -52
  36. package/dist/cli/main.js.map +1 -1
  37. package/dist/cli/prompter.d.ts +25 -0
  38. package/dist/cli/prompter.js +95 -0
  39. package/dist/cli/prompter.js.map +1 -0
  40. package/dist/cli/run.d.ts +15 -1
  41. package/dist/cli/run.js +22 -6
  42. package/dist/cli/run.js.map +1 -1
  43. package/dist/cli/status.d.ts +44 -0
  44. package/dist/cli/status.js +65 -0
  45. package/dist/cli/status.js.map +1 -0
  46. package/dist/cli/uninstall.d.ts +19 -0
  47. package/dist/cli/uninstall.js +16 -0
  48. package/dist/cli/uninstall.js.map +1 -0
  49. package/dist/cli/upgrade.d.ts +31 -0
  50. package/dist/cli/upgrade.js +39 -0
  51. package/dist/cli/upgrade.js.map +1 -0
  52. package/dist/core/entry.d.ts +2 -0
  53. package/dist/core/entry.js.map +1 -1
  54. package/dist/core/ports.d.ts +3 -0
  55. package/dist/core/run-pass.js +13 -2
  56. package/dist/core/run-pass.js.map +1 -1
  57. package/package.json +3 -3
  58. package/dist/cli/install.d.ts +0 -34
  59. package/dist/cli/install.js +0 -109
  60. package/dist/cli/install.js.map +0 -1
@@ -0,0 +1,16 @@
1
+ import type { ShipId, TrierarchEntryState } from '@aeolus-fleet/common';
2
+ import type { StatePort } from '../core/ports.js';
3
+ /** `aeolus-trierarch list`: the wanted entries, from the saved state. */
4
+ export interface ListedEntry {
5
+ readonly shipId: ShipId;
6
+ readonly state: TrierarchEntryState;
7
+ readonly harness: string;
8
+ readonly workspace: string;
9
+ readonly folder?: string;
10
+ /** When the entry took its state, ISO 8601. */
11
+ readonly since: string;
12
+ /** How often its session exited within the restart window. */
13
+ readonly restarts: number;
14
+ }
15
+ export declare function inspectList(state: StatePort): Promise<ListedEntry[]>;
16
+ export declare function describeList(entries: readonly ListedEntry[]): string;
@@ -0,0 +1,32 @@
1
+ function describeWorkspace(workspace) {
2
+ switch (workspace.kind) {
3
+ case 'worktree':
4
+ return `worktree ${workspace.repository}${workspace.ref === undefined ? '' : ` at ${workspace.ref}`}`;
5
+ case 'folder':
6
+ return `folder ${workspace.name}`;
7
+ }
8
+ }
9
+ export async function inspectList(state) {
10
+ return Object.values((await state.load()).entries).map((entry) => ({
11
+ shipId: entry.shipId,
12
+ state: entry.state,
13
+ harness: entry.harness,
14
+ workspace: describeWorkspace(entry.workspace),
15
+ ...(entry.folder !== undefined && { folder: entry.folder }),
16
+ since: entry.since,
17
+ restarts: entry.exits.length,
18
+ }));
19
+ }
20
+ const COLUMN_GAP = ' ';
21
+ export function describeList(entries) {
22
+ if (entries.length === 0) {
23
+ return 'No ship is on the list.';
24
+ }
25
+ const rows = [
26
+ ['SHIP', 'STATE', 'HARNESS', 'WORKSPACE', 'SINCE', 'RESTARTS'],
27
+ ...entries.map((entry) => [entry.shipId, entry.state, entry.harness, entry.workspace, entry.since, String(entry.restarts)]),
28
+ ];
29
+ const widths = rows[0]?.map((_, column) => Math.max(...rows.map((row) => row[column]?.length ?? 0))) ?? [];
30
+ return rows.map((row) => row.map((cell, column) => (column === row.length - 1 ? cell : cell.padEnd(widths[column] ?? 0))).join(COLUMN_GAP)).join('\n');
31
+ }
32
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/cli/list.ts"],"names":[],"mappings":"AAkBA,SAAS,iBAAiB,CAAC,SAA6B;IACtD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,UAAU;YACb,OAAO,YAAY,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC;QACxG,KAAK,QAAQ;YACX,OAAO,UAAU,SAAS,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAgB;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjE,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,SAAS,EAAE,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC3D,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;KAC7B,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,UAAU,YAAY,CAAC,OAA+B;IAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,yBAAyB,CAAC;IACnC,CAAC;IACD,MAAM,IAAI,GAAG;QACX,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC;QAC9D,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC5H,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3G,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `aeolus-trierarch logs`: the last lines of the trierarch's log, and with
3
+ * `--follow` each line written after, until it is stopped. The log is the file
4
+ * the service writes, `~/.aeolus/trierarch/logs/trierarch.log`.
5
+ */
6
+ export declare function tailLog(at: {
7
+ file: string;
8
+ lines: number;
9
+ }): Promise<string[]>;
10
+ /** Writes each whole line added to the log after it starts, checking every `intervalMs`, until `signal` aborts. */
11
+ export declare function followLog(at: {
12
+ file: string;
13
+ signal: AbortSignal;
14
+ intervalMs: number;
15
+ write: (line: string) => void;
16
+ }): Promise<void>;
@@ -0,0 +1,51 @@
1
+ import { open, readFile, stat } from 'node:fs/promises';
2
+ /**
3
+ * `aeolus-trierarch logs`: the last lines of the trierarch's log, and with
4
+ * `--follow` each line written after, until it is stopped. The log is the file
5
+ * the service writes, `~/.aeolus/trierarch/logs/trierarch.log`.
6
+ */
7
+ export async function tailLog(at) {
8
+ const text = await readFile(at.file, 'utf8').catch(() => '');
9
+ const lines = text.split('\n');
10
+ if (lines.at(-1) === '') {
11
+ lines.pop();
12
+ }
13
+ return lines.slice(-at.lines);
14
+ }
15
+ /** Writes each whole line added to the log after it starts, checking every `intervalMs`, until `signal` aborts. */
16
+ export async function followLog(at) {
17
+ const { file, signal, intervalMs, write } = at;
18
+ let offset = (await stat(file).catch(() => undefined))?.size ?? 0;
19
+ let partial = '';
20
+ // Asked afresh each time: a write may stop it.
21
+ const isStopped = () => signal.aborted;
22
+ while (!isStopped()) {
23
+ const size = (await stat(file).catch(() => undefined))?.size ?? 0;
24
+ // A log written anew from the start: follow it from there.
25
+ if (size < offset) {
26
+ offset = 0;
27
+ partial = '';
28
+ }
29
+ if (size > offset) {
30
+ const handle = await open(file, 'r');
31
+ try {
32
+ const buffer = Buffer.alloc(size - offset);
33
+ await handle.read(buffer, 0, buffer.length, offset);
34
+ offset = size;
35
+ const lines = (partial + buffer.toString('utf8')).split('\n');
36
+ partial = lines.pop() ?? '';
37
+ for (const line of lines) {
38
+ if (isStopped()) {
39
+ return;
40
+ }
41
+ write(line);
42
+ }
43
+ }
44
+ finally {
45
+ await handle.close();
46
+ }
47
+ }
48
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
49
+ }
50
+ }
51
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;;GAIG;AAEH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAmC;IAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QACxB,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,mHAAmH;AACnH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,EAA4F;IAC1H,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC/C,IAAI,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAClE,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,+CAA+C;IAC/C,MAAM,SAAS,GAAG,GAAY,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;IAChD,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;QAClE,2DAA2D;QAC3D,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC,CAAC;YACX,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;QACD,IAAI,IAAI,GAAG,MAAM,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;gBAC3C,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBACpD,MAAM,GAAG,IAAI,CAAC;gBACd,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC9D,OAAO,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,SAAS,EAAE,EAAE,CAAC;wBAChB,OAAO;oBACT,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
package/dist/cli/main.js CHANGED
@@ -1,75 +1,244 @@
1
1
  import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
2
3
  import { fileURLToPath } from 'node:url';
3
- import { TrierarchFileError } from '../adapters/files.js';
4
+ import { createClaudeCodeSetup } from '../adapters/claude-code-setup.js';
5
+ import { loadConfiguration, readCrewFile, TrierarchFileError } from '../adapters/files.js';
6
+ import { createJsonState } from '../adapters/json-state.js';
4
7
  import { trierarchPaths } from '../adapters/paths.js';
5
8
  import { createRestFleet } from '../adapters/rest-fleet.js';
9
+ import { runCommand } from '../adapters/run-command.js';
10
+ import { createService, serviceEnvironment } from '../adapters/service.js';
11
+ import { createTmux } from '../adapters/tmux.js';
12
+ import { runningVersion } from '../adapters/version.js';
13
+ import { createUninstall } from '../core/uninstall.js';
6
14
  import { configCheck } from './config-check.js';
7
15
  import { initTrierarch } from './init.js';
8
- import { install, serviceEnvironment } from './install.js';
16
+ import { describeList, inspectList } from './list.js';
17
+ import { followLog, tailLog } from './logs.js';
18
+ import { createTerminalPrompter } from './prompter.js';
9
19
  import { runTrierarch } from './run.js';
20
+ import { describeStatus, inspectStatus, leaseFrom } from './status.js';
21
+ import { uninstallTrierarch } from './uninstall.js';
22
+ import { PACKAGE, upgradeTrierarch } from './upgrade.js';
10
23
  export const USAGE = [
11
- 'Usage: aeolus-trierarch <command> [--config <path>]',
12
- ' init <fleetUrl> <shipId> <secret> register the trierarch\'s own ship (commissioned with fleet:crew) and write a configuration',
13
- ' config check check the configuration and print the effective flags per harness',
14
- ' run keep the wanted ships crewed until stopped',
15
- ' install [--no-load] run it under launchd (macOS) or systemd (Linux)',
24
+ 'Usage: aeolus-trierarch <command> [--config <path>] [--json]',
25
+ '',
26
+ 'Set up:',
27
+ " init [--fleet-url <url>] [--ship-id <shp_...>] [--secret <secret>] [--yes] the whole setup: registers the trierarch's own ship, writes the configuration, answers Claude Code's one-time questions and offers to install the service. Asks for what is missing; prefer typing the secret when asked, so it stays out of your shell history",
28
+ ' config check check the configuration and give the effective flags per harness',
29
+ '',
30
+ 'Look:',
31
+ ' status the service, the fleet and its own lease, caps in use, entries by state, kept worktrees and orphans',
32
+ ' list the wanted entries: ship, state, harness, workspace, since, restarts',
33
+ ' logs [--lines <n>] [--follow] the last lines of the log, and with --follow each new one',
34
+ '',
35
+ 'Run:',
36
+ ' start start the service',
37
+ ' stop stop the service (it starts again at the next login)',
38
+ ' restart restart the service, so it reads a changed configuration',
39
+ ' upgrade [version] install the given version, or the latest, and restart the service; sessions keep running',
40
+ ' install [--no-load] install the service: launchd on macOS, systemd on Linux',
41
+ ' uninstall remove the service and stop every session; deletes no worktree and none of its files',
42
+ ' run keep the wanted ships crewed until stopped (what the service runs)',
43
+ '',
44
+ '--json answers JSON, for a ship to read.',
16
45
  ].join('\n');
46
+ const VALUE_FLAGS = new Set(['--config', '--fleet-url', '--ship-id', '--secret', '--lines']);
47
+ const SWITCHES = new Set(['--json', '--yes', '--follow', '--no-load']);
48
+ const DEFAULT_LINES = 50;
49
+ const FOLLOW_INTERVAL_MS = 500;
50
+ /** The command words, flag values and switches of a command line; undefined for a flag it does not know. */
51
+ function parse(argv) {
52
+ const words = [];
53
+ const values = new Map();
54
+ const switches = new Set();
55
+ for (let index = 0; index < argv.length; index += 1) {
56
+ const arg = argv[index] ?? '';
57
+ if (!arg.startsWith('--')) {
58
+ words.push(arg);
59
+ continue;
60
+ }
61
+ const [name = '', inline] = arg.split(/=(.*)/s);
62
+ if (SWITCHES.has(name) && inline === undefined) {
63
+ switches.add(name);
64
+ }
65
+ else if (VALUE_FLAGS.has(name)) {
66
+ const value = inline ?? argv[(index += 1)];
67
+ if (value === undefined) {
68
+ return undefined;
69
+ }
70
+ values.set(name, value);
71
+ }
72
+ else {
73
+ return undefined;
74
+ }
75
+ }
76
+ return { words, values, switches };
77
+ }
78
+ function describeService(verb, status) {
79
+ return status.isRunning ? `The trierarch ${verb}: it runs${status.pid === undefined ? '' : ` as pid ${String(status.pid)}`}.` : `The trierarch ${verb}: it does not run.`;
80
+ }
17
81
  /** Runs one command line of `aeolus-trierarch`. */
18
82
  export async function main(argv, env = process.env) {
19
- const args = [...argv];
20
- const configAt = args.indexOf('--config');
21
- const config = configAt === -1 ? env.AEOLUS_TRIERARCH_CONFIG : args.splice(configAt, 2)[1];
83
+ const parsed = parse(argv);
84
+ if (parsed === undefined) {
85
+ return { output: USAGE, code: 2 };
86
+ }
87
+ const { words, values, switches } = parsed;
88
+ const isJson = switches.has('--json');
89
+ const config = values.get('--config') ?? env.AEOLUS_TRIERARCH_CONFIG;
22
90
  const homeDirectory = env.HOME ?? homedir();
23
91
  const paths = trierarchPaths({ homeDirectory, ...(config !== undefined && { config }) });
24
- const [command = '', ...rest] = args;
25
- try {
26
- switch (command) {
27
- case 'init': {
28
- const [fleetUrl, shipId, secret] = rest;
29
- if (fleetUrl === undefined || shipId === undefined || secret === undefined) {
30
- return { output: USAGE, code: 2 };
31
- }
32
- const said = await initTrierarch({ paths, crew: { fleetUrl, shipId, secret }, fleetAt: (url) => createRestFleet({ fleetUrl: url, crewToken: '' }) });
33
- return { output: said.join('\n'), code: 0 };
34
- }
35
- case 'config':
36
- return rest[0] === 'check' ? { output: await configCheck(paths), code: 0 } : { output: USAGE, code: 2 };
37
- case 'install': {
38
- const said = await install({
39
- platform: process.platform,
92
+ const serviceAt = () => createService({
93
+ platform: process.platform,
94
+ homeDirectory,
95
+ paths,
96
+ run: { node: process.execPath, script: fileURLToPath(new URL('../bin/aeolus-trierarch.js', import.meta.url)) },
97
+ environment: serviceEnvironment(env),
98
+ uid: process.getuid?.() ?? 0,
99
+ exec: (program, args) => runCommand(program, { args }),
100
+ now: () => new Date(),
101
+ });
102
+ const untilStopped = () => {
103
+ const stopping = new AbortController();
104
+ process.once('SIGINT', () => {
105
+ stopping.abort();
106
+ });
107
+ process.once('SIGTERM', () => {
108
+ stopping.abort();
109
+ });
110
+ return stopping.signal;
111
+ };
112
+ const inspect = async () => {
113
+ const crew = await readCrewFile(paths.crewToken);
114
+ const configuration = await loadConfiguration(paths.config);
115
+ const fleet = createRestFleet(crew);
116
+ const report = await inspectStatus({
117
+ configuration,
118
+ crew,
119
+ service: serviceAt(),
120
+ lease: leaseFrom(() => fleet.whoami()),
121
+ processes: createTmux(),
122
+ state: createJsonState(paths.state),
123
+ });
124
+ return { data: report, text: describeStatus(report) };
125
+ };
126
+ const commands = {
127
+ init: async () => {
128
+ // Questions go to stderr under --json, so stdout holds the JSON alone.
129
+ const prompter = createTerminalPrompter({ input: process.stdin, output: isJson ? process.stderr : process.stdout });
130
+ try {
131
+ const fleetUrl = values.get('--fleet-url');
132
+ const shipId = values.get('--ship-id');
133
+ const secret = values.get('--secret');
134
+ const report = await initTrierarch({
40
135
  homeDirectory,
41
136
  paths,
42
- run: { node: process.execPath, script: fileURLToPath(new URL('../bin/aeolus-trierarch.js', import.meta.url)) },
43
- environment: serviceEnvironment(env),
44
- isLoading: !rest.includes('--no-load'),
45
- uid: process.getuid?.() ?? 0,
137
+ flags: { ...(fleetUrl !== undefined && { fleetUrl }), ...(shipId !== undefined && { shipId }), ...(secret !== undefined && { secret }), isYes: switches.has('--yes') },
138
+ prompter,
139
+ fleetAt: (url) => createRestFleet({ fleetUrl: url, crewToken: '' }),
140
+ claudeCode: createClaudeCodeSetup({ homeDirectory }),
141
+ service: serviceAt(),
46
142
  });
47
- return { output: said.join('\n'), code: 0 };
143
+ return { data: report, text: report.said.join('\n') };
48
144
  }
49
- case 'run': {
50
- const stopping = new AbortController();
51
- process.once('SIGINT', () => {
52
- stopping.abort();
53
- });
54
- process.once('SIGTERM', () => {
55
- stopping.abort();
56
- });
57
- const logger = {
58
- info: (message) => process.stdout.write(`${new Date().toISOString()} ${message}\n`),
59
- warn: (message) => process.stderr.write(`${new Date().toISOString()} ${message}\n`),
60
- };
61
- await runTrierarch({ paths, homeDirectory, env, signal: stopping.signal, logger });
62
- return { output: 'aeolus-trierarch stopped.', code: 0 };
145
+ finally {
146
+ prompter.close();
63
147
  }
64
- default:
65
- return { output: USAGE, code: 2 };
66
- }
148
+ },
149
+ 'config check': async () => {
150
+ const { text, ...data } = await configCheck(paths);
151
+ return { data, text };
152
+ },
153
+ status: inspect,
154
+ upgrade: async () => {
155
+ const version = words[1];
156
+ const report = await upgradeTrierarch({
157
+ ...(version !== undefined && { version }),
158
+ installedVersion: runningVersion,
159
+ npm: {
160
+ latest: async () => (await runCommand('npm', { args: ['view', PACKAGE, 'version'] })).stdout,
161
+ install: (spec) => runCommand('npm', { args: ['install', '--global', spec] }),
162
+ },
163
+ service: serviceAt(),
164
+ });
165
+ if (!report.isUpgraded) {
166
+ return { data: report, text: report.said.join('\n') };
167
+ }
168
+ const status = await inspect();
169
+ return { data: { ...report, status: status.data }, text: [...report.said, '', status.text].join('\n') };
170
+ },
171
+ list: async () => {
172
+ const entries = await inspectList(createJsonState(paths.state));
173
+ return { data: entries, text: describeList(entries) };
174
+ },
175
+ logs: async () => {
176
+ const file = join(paths.logs, 'trierarch.log');
177
+ const lines = Number(values.get('--lines') ?? DEFAULT_LINES);
178
+ if (!Number.isInteger(lines) || lines < 0) {
179
+ throw new TrierarchFileError('--lines takes a whole number');
180
+ }
181
+ const tail = await tailLog({ file, lines });
182
+ if (!switches.has('--follow')) {
183
+ return { data: { file, lines: tail }, text: tail.length === 0 ? `No log lines yet in ${file}.` : tail.join('\n') };
184
+ }
185
+ const write = (line) => {
186
+ process.stdout.write(`${isJson ? JSON.stringify({ line }) : line}\n`);
187
+ };
188
+ tail.forEach(write);
189
+ await followLog({ file, signal: untilStopped(), intervalMs: FOLLOW_INTERVAL_MS, write });
190
+ return { data: undefined, text: '' };
191
+ },
192
+ start: async () => {
193
+ const service = serviceAt();
194
+ await service.start();
195
+ const status = await service.status();
196
+ return { data: status, text: describeService('started', status) };
197
+ },
198
+ stop: async () => {
199
+ const service = serviceAt();
200
+ await service.stop();
201
+ const status = await service.status();
202
+ return { data: status, text: `${describeService('stopped', status)} It starts again at the next login, or with aeolus-trierarch start.` };
203
+ },
204
+ restart: async () => {
205
+ const service = serviceAt();
206
+ await service.restart();
207
+ const status = await service.status();
208
+ return { data: status, text: describeService('restarted', status) };
209
+ },
210
+ install: async () => {
211
+ const service = serviceAt();
212
+ await (switches.has('--no-load') ? service.write() : service.install());
213
+ const status = await service.status();
214
+ return { data: status, text: `Installed ${status.file}. Logs: ${paths.logs}` };
215
+ },
216
+ uninstall: async () => {
217
+ const report = await uninstallTrierarch({ service: serviceAt(), uninstall: createUninstall({ processes: createTmux(), state: createJsonState(paths.state) }), home: paths.home });
218
+ return { data: report, text: report.said.join('\n') };
219
+ },
220
+ run: async () => {
221
+ const logger = {
222
+ info: (message) => process.stdout.write(`${new Date().toISOString()} ${message}\n`),
223
+ warn: (message) => process.stderr.write(`${new Date().toISOString()} ${message}\n`),
224
+ };
225
+ await runTrierarch({ paths, homeDirectory, env, signal: untilStopped(), logger });
226
+ return { data: { stopped: true }, text: 'aeolus-trierarch stopped.' };
227
+ },
228
+ };
229
+ // upgrade alone takes a word after it: the version.
230
+ const command = words[0] === 'upgrade' && words.length <= 2 ? commands.upgrade : commands[words.join(' ')];
231
+ if (command === undefined) {
232
+ return { output: USAGE, code: 2 };
233
+ }
234
+ try {
235
+ const { data, text } = await command();
236
+ return { output: isJson && data !== undefined ? JSON.stringify(data, null, 2) : text, code: 0 };
67
237
  }
68
238
  catch (error) {
69
- if (error instanceof TrierarchFileError) {
70
- return { output: error.message, code: 1 };
71
- }
72
- throw error;
239
+ // A refusal, a file it cannot use, or a program that failed (launchctl, systemctl): said, not thrown at the operator.
240
+ const message = error instanceof Error ? error.message : String(error);
241
+ return { output: isJson ? JSON.stringify({ error: message }) : message, code: 1 };
73
242
  }
74
243
  }
75
244
  //# sourceMappingURL=main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAsB,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,8DAA8D;IAC9D,EAAE;IACF,SAAS;IACT,gVAAgV;IAChV,0FAA0F;IAC1F,EAAE;IACF,OAAO;IACP,6HAA6H;IAC7H,8FAA8F;IAC9F,6FAA6F;IAC7F,EAAE;IACF,MAAM;IACN,2CAA2C;IAC3C,8EAA8E;IAC9E,kFAAkF;IAClF,kHAAkH;IAClH,iFAAiF;IACjF,8GAA8G;IAC9G,4FAA4F;IAC5F,EAAE;IACF,0CAA0C;CAC3C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAcb,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7F,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AACvE,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,4GAA4G;AAC5G,SAAS,KAAK,CAAC,IAAuB;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/C,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,IAAY,EAAE,MAAqB;IAC1D,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,IAAI,YAAY,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,iBAAiB,IAAI,oBAAoB,CAAC;AAC5K,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAuB,EAAE,MAAoD,OAAO,CAAC,GAAG;IACjH,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpC,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,uBAAuB,CAAC;IACrE,MAAM,aAAa,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,GAAG,EAAE,CACrB,aAAa,CAAC;QACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,aAAa;QACb,KAAK;QACL,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;QAC9G,WAAW,EAAE,kBAAkB,CAAC,GAAG,CAAC;QACpC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC;QAC5B,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;QACtD,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;KACtB,CAAC,CAAC;IACL,MAAM,YAAY,GAAG,GAAgB,EAAE;QACrC,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC3B,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,IAAqB,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,aAAa;YACb,IAAI;YACJ,OAAO,EAAE,SAAS,EAAE;YACpB,KAAK,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YACtC,SAAS,EAAE,UAAU,EAAE;YACvB,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;IACxD,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAwD;QACpE,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,uEAAuE;YACvE,MAAM,QAAQ,GAAG,sBAAsB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACpH,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;gBAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACvC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACtC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;oBACjC,aAAa;oBACb,KAAK;oBACL,KAAK,EAAE,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;oBACtK,QAAQ;oBACR,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;oBACnE,UAAU,EAAE,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC;oBACpD,OAAO,EAAE,SAAS,EAAE;iBACrB,CAAC,CAAC;gBACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,CAAC;oBAAS,CAAC;gBACT,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QACD,cAAc,EAAE,KAAK,IAAI,EAAE;YACzB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;YACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,CAAC;QACD,MAAM,EAAE,OAAO;QACf,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC;gBACpC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,CAAC;gBACzC,gBAAgB,EAAE,cAAc;gBAChC,GAAG,EAAE;oBACH,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM;oBAC5F,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC;iBAC9E;gBACD,OAAO,EAAE,SAAS,EAAE;aACrB,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;YAC/B,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1G,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC,CAAC;YAC7D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAuB,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrH,CAAC;YACD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;gBACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;YACxE,CAAC,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC,CAAC;YACzF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACvC,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;YAC5B,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;QACpE,CAAC;QACD,IAAI,EAAE,KAAK,IAAI,EAAE;YACf,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;YAC5B,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,SAAS,EAAE,MAAM,CAAC,qEAAqE,EAAE,CAAC;QAC5I,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;YAC5B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;YACtC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,MAAM,CAAC,IAAI,WAAW,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACjF,CAAC;QACD,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAClL,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,CAAC;QACD,GAAG,EAAE,KAAK,IAAI,EAAE;YACd,MAAM,MAAM,GAAG;gBACb,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,OAAO,IAAI,CAAC;gBAC3F,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,OAAO,IAAI,CAAC;aAC5F,CAAC;YACF,MAAM,YAAY,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAClF,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,CAAC;QACxE,CAAC;KACF,CAAC;IAEF,oDAAoD;IACpD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3G,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC;QACvC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAClG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sHAAsH;QACtH,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * How init asks the operator: a line of text, a secret never shown as it is
3
+ * typed, yes or no. Node's readline, no prompt library: the questions are
4
+ * few and plain.
5
+ */
6
+ export interface Prompter {
7
+ text(question: string, options?: {
8
+ default?: string;
9
+ }): Promise<string>;
10
+ /** Asks without showing what is typed, so a secret stays out of the screen, the scrollback and any transcript. */
11
+ secret(question: string): Promise<string>;
12
+ confirm(question: string, options: {
13
+ isDefault: boolean;
14
+ }): Promise<boolean>;
15
+ say(message: string): void;
16
+ }
17
+ export interface TerminalPrompter extends Prompter {
18
+ close(): void;
19
+ }
20
+ export declare function createTerminalPrompter(at: {
21
+ input: NodeJS.ReadableStream;
22
+ output: NodeJS.WritableStream & {
23
+ isTTY?: boolean;
24
+ };
25
+ }): TerminalPrompter;
@@ -0,0 +1,95 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { Writable } from 'node:stream';
3
+ const YES = new Set(['y', 'yes']);
4
+ const NO = new Set(['n', 'no']);
5
+ export function createTerminalPrompter(at) {
6
+ const { input, output } = at;
7
+ // What readline echoes goes through here, so a secret's keys can be kept off the screen.
8
+ let isMuted = false;
9
+ const echo = new Writable({
10
+ writev(chunks, done) {
11
+ if (!isMuted) {
12
+ for (const { chunk } of chunks) {
13
+ if (typeof chunk === 'string' || chunk instanceof Uint8Array) {
14
+ output.write(chunk);
15
+ }
16
+ }
17
+ }
18
+ done();
19
+ },
20
+ });
21
+ const lines = createInterface({ input, output: echo, terminal: output.isTTY === true });
22
+ const waiting = [];
23
+ const readers = [];
24
+ let hasEnded = false;
25
+ lines.on('line', (line) => {
26
+ const reader = readers.shift();
27
+ if (reader === undefined) {
28
+ waiting.push(line);
29
+ }
30
+ else {
31
+ reader.resolve(line);
32
+ }
33
+ });
34
+ lines.on('close', () => {
35
+ hasEnded = true;
36
+ for (const reader of readers.splice(0)) {
37
+ reader.reject(new Error('The input ended'));
38
+ }
39
+ });
40
+ const ask = async (question) => {
41
+ output.write(question);
42
+ const line = waiting.shift();
43
+ if (line !== undefined) {
44
+ return line;
45
+ }
46
+ try {
47
+ if (hasEnded) {
48
+ throw new Error('The input ended');
49
+ }
50
+ return await new Promise((resolve, reject) => {
51
+ readers.push({ resolve, reject });
52
+ });
53
+ }
54
+ catch {
55
+ throw new Error(`The input ended before an answer to: ${question.trim()}`);
56
+ }
57
+ };
58
+ const prompter = {
59
+ text: async (question, options = {}) => {
60
+ const answer = (await ask(`${question} ${options.default === undefined ? '' : `(${options.default}) `}`)).trim();
61
+ return answer === '' ? (options.default ?? '') : answer;
62
+ },
63
+ secret: async (question) => {
64
+ output.write(`${question} `);
65
+ isMuted = true;
66
+ try {
67
+ return (await ask('')).trim();
68
+ }
69
+ finally {
70
+ isMuted = false;
71
+ output.write('\n');
72
+ }
73
+ },
74
+ confirm: async (question, { isDefault }) => {
75
+ for (;;) {
76
+ const answer = (await ask(`${question} ${isDefault ? '[Y/n]' : '[y/N]'} `)).trim().toLowerCase();
77
+ if (answer === '') {
78
+ return isDefault;
79
+ }
80
+ if (YES.has(answer) || NO.has(answer)) {
81
+ return YES.has(answer);
82
+ }
83
+ prompter.say('Answer y or n.');
84
+ }
85
+ },
86
+ say: (message) => {
87
+ output.write(`${message}\n`);
88
+ },
89
+ close: () => {
90
+ lines.close();
91
+ },
92
+ };
93
+ return prompter;
94
+ }
95
+ //# sourceMappingURL=prompter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompter.js","sourceRoot":"","sources":["../../src/cli/prompter.ts"],"names":[],"mappings":"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"}
package/dist/cli/run.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { TrierarchPaths } from '../adapters/paths.js';
2
- import type { Logger } from '../core/ports.js';
2
+ import type { Delivery, Logger } from '../core/ports.js';
3
3
  /** How often the loop runs a pass: restarts, wakes and releases wait at most this long. */
4
4
  export declare const PASS_INTERVAL_MS = 5000;
5
5
  /**
@@ -17,3 +17,17 @@ export declare function runTrierarch(input: {
17
17
  info(message: string): void;
18
18
  };
19
19
  }): Promise<void>;
20
+ /**
21
+ * Receives and handles what came, and runs a pass at most every `intervalMs`,
22
+ * until `signal` stops it. The stop ends a receive the fleet still holds, and
23
+ * the wait after a failure, at once: a service manager that stops the
24
+ * trierarch sees it gone in a moment, not after the next long poll.
25
+ */
26
+ export declare function loop(at: {
27
+ receive: (signal: AbortSignal) => Promise<readonly Delivery[]>;
28
+ handle: (delivery: Delivery) => Promise<void>;
29
+ pass: () => Promise<void>;
30
+ signal: AbortSignal;
31
+ logger: Logger;
32
+ intervalMs: number;
33
+ }): Promise<void>;