@aeolus-fleet/trierarch 0.33.1 → 0.34.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.
- package/README.md +7 -4
- package/dist/adapters/claude-code-setup.d.ts +11 -0
- package/dist/adapters/claude-code-setup.js +60 -0
- package/dist/adapters/claude-code-setup.js.map +1 -1
- package/dist/adapters/claude-code.d.ts +21 -18
- package/dist/adapters/claude-code.js +46 -36
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/codex-setup.d.ts +2 -0
- package/dist/adapters/codex-setup.js +6 -0
- package/dist/adapters/codex-setup.js.map +1 -1
- package/dist/adapters/codex.d.ts +2 -0
- package/dist/adapters/codex.js +31 -3
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/container.d.ts +36 -15
- package/dist/adapters/container.js +72 -93
- package/dist/adapters/container.js.map +1 -1
- package/dist/adapters/copilot-detector.d.ts +13 -0
- package/dist/adapters/copilot-detector.js +62 -0
- package/dist/adapters/copilot-detector.js.map +1 -0
- package/dist/adapters/copilot.d.ts +79 -0
- package/dist/adapters/copilot.js +187 -0
- package/dist/adapters/copilot.js.map +1 -0
- package/dist/adapters/detectors.js +6 -0
- package/dist/adapters/detectors.js.map +1 -1
- package/dist/adapters/files.d.ts +16 -0
- package/dist/adapters/files.js +5 -0
- package/dist/adapters/files.js.map +1 -1
- package/dist/adapters/harnesses.d.ts +3 -2
- package/dist/adapters/harnesses.js +21 -9
- package/dist/adapters/harnesses.js.map +1 -1
- package/dist/adapters/hold-runtime.d.ts +19 -5
- package/dist/adapters/hold-runtime.js +23 -10
- package/dist/adapters/hold-runtime.js.map +1 -1
- package/dist/adapters/hold.d.ts +12 -0
- package/dist/adapters/hold.js +66 -31
- package/dist/adapters/hold.js.map +1 -1
- package/dist/adapters/json-state.js +4 -0
- package/dist/adapters/json-state.js.map +1 -1
- package/dist/adapters/key-files.d.ts +16 -0
- package/dist/adapters/key-files.js +28 -0
- package/dist/adapters/key-files.js.map +1 -0
- package/dist/adapters/key-states.d.ts +21 -0
- package/dist/adapters/key-states.js +43 -0
- package/dist/adapters/key-states.js.map +1 -0
- package/dist/adapters/model-logins.d.ts +21 -0
- package/dist/adapters/model-logins.js +48 -0
- package/dist/adapters/model-logins.js.map +1 -0
- package/dist/adapters/model-proxy.d.ts +32 -0
- package/dist/adapters/model-proxy.js +171 -0
- package/dist/adapters/model-proxy.js.map +1 -0
- package/dist/adapters/paths.d.ts +4 -0
- package/dist/adapters/paths.js +2 -0
- package/dist/adapters/paths.js.map +1 -1
- package/dist/adapters/plugin.d.ts +11 -8
- package/dist/adapters/plugin.js +47 -13
- package/dist/adapters/plugin.js.map +1 -1
- package/dist/adapters/proxy-runtime.d.ts +31 -0
- package/dist/adapters/proxy-runtime.js +100 -0
- package/dist/adapters/proxy-runtime.js.map +1 -0
- package/dist/adapters/proxy-tokens.d.ts +25 -0
- package/dist/adapters/proxy-tokens.js +67 -0
- package/dist/adapters/proxy-tokens.js.map +1 -0
- package/dist/adapters/runtime-adapters.d.ts +11 -6
- package/dist/adapters/runtime-adapters.js +25 -11
- package/dist/adapters/runtime-adapters.js.map +1 -1
- package/dist/adapters/service.d.ts +1 -1
- package/dist/adapters/service.js +2 -2
- package/dist/adapters/service.js.map +1 -1
- package/dist/adapters/trust.d.ts +2 -1
- package/dist/adapters/trust.js +4 -1
- package/dist/adapters/trust.js.map +1 -1
- package/dist/adapters/vendor-answers.d.ts +6 -0
- package/dist/adapters/vendor-answers.js +38 -0
- package/dist/adapters/vendor-answers.js.map +1 -0
- package/dist/adapters/vendor-key-check.d.ts +23 -0
- package/dist/adapters/vendor-key-check.js +36 -0
- package/dist/adapters/vendor-key-check.js.map +1 -0
- package/dist/bin/aeolus-trierarch.js +7 -2
- package/dist/bin/aeolus-trierarch.js.map +1 -1
- package/dist/cli/add.d.ts +2 -2
- package/dist/cli/config-check.js +1 -1
- package/dist/cli/config-check.js.map +1 -1
- package/dist/cli/hold.js +13 -4
- package/dist/cli/hold.js.map +1 -1
- package/dist/cli/login.d.ts +72 -0
- package/dist/cli/login.js +114 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/main.js +85 -5
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/proxy.d.ts +2 -0
- package/dist/cli/proxy.js +58 -0
- package/dist/cli/proxy.js.map +1 -0
- package/dist/cli/run.js +30 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/upgrade.d.ts +2 -2
- package/dist/cli/upgrade.js +2 -2
- package/dist/core/argo-reports.d.ts +10 -0
- package/dist/core/argo-reports.js +17 -0
- package/dist/core/argo-reports.js.map +1 -1
- package/dist/core/check-session-runtime.js +3 -1
- package/dist/core/check-session-runtime.js.map +1 -1
- package/dist/core/check-settings.d.ts +2 -0
- package/dist/core/check-settings.js +6 -1
- package/dist/core/check-settings.js.map +1 -1
- package/dist/core/entry.d.ts +12 -0
- package/dist/core/entry.js.map +1 -1
- package/dist/core/login.d.ts +28 -0
- package/dist/core/login.js +14 -0
- package/dist/core/login.js.map +1 -0
- package/dist/core/ports.d.ts +33 -1
- package/dist/core/reconciler.d.ts +5 -0
- package/dist/core/reconciler.js +12 -7
- package/dist/core/reconciler.js.map +1 -1
- package/dist/core/report-self.js +9 -3
- package/dist/core/report-self.js.map +1 -1
- package/dist/core/run-pass.d.ts +6 -1
- package/dist/core/run-pass.js +81 -13
- package/dist/core/run-pass.js.map +1 -1
- package/package.json +1 -2
- package/dist/adapters/claude-code-screen.d.ts +0 -1
- package/dist/adapters/claude-code-screen.js +0 -22
- package/dist/adapters/claude-code-screen.js.map +0 -1
- package/dist/adapters/held-command.d.ts +0 -13
- package/dist/adapters/held-command.js +0 -16
- package/dist/adapters/held-command.js.map +0 -1
- package/dist/adapters/launch-screen.d.ts +0 -14
- package/dist/adapters/launch-screen.js +0 -5
- package/dist/adapters/launch-screen.js.map +0 -1
- package/dist/adapters/stop-turn.d.ts +0 -13
- package/dist/adapters/stop-turn.js +0 -26
- package/dist/adapters/stop-turn.js.map +0 -1
- package/dist/adapters/tmux.d.ts +0 -13
- package/dist/adapters/tmux.js +0 -33
- package/dist/adapters/tmux.js.map +0 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { TrierarchConfiguration } from '@aeolus-fleet/common';
|
|
2
|
+
import type { AdapterFlag, HarnessPort, SessionRuntime } from '../core/ports.js';
|
|
3
|
+
import { type CommandPart } from './command-line.js';
|
|
4
|
+
import { type AeolusPlugin } from './plugin-identity.js';
|
|
5
|
+
/**
|
|
6
|
+
* The GitHub Copilot CLI as a harness (docs/architecture.md, "First
|
|
7
|
+
* adapters"; design harnesses/cursor-copilot, CC3, CC4, CC6, CC10), headless:
|
|
8
|
+
* one `copilot -p` per turn in the folder, as Codex runs one `codex exec`, its
|
|
9
|
+
* output as JSON lines, every tool allowed and its question tool off, so a
|
|
10
|
+
* turn asks nothing. Every later turn resumes the session by the id the last
|
|
11
|
+
* turn's result named; a restart too, since `--continue` takes the latest
|
|
12
|
+
* session of the machine, whatever its folder (Copilot CLI 1.0.105). Between
|
|
13
|
+
* turns no Copilot process runs. Copilot signs in with the machine's own
|
|
14
|
+
* login, which the hold's clean environment leaves alone: no GitHub token
|
|
15
|
+
* reaches a session, and no API key (CC6). The identity and the turn marker
|
|
16
|
+
* go through the aeolus-fleet plugin Copilot installed, whose hooks run in
|
|
17
|
+
* `copilot -p` as in a terminal (S3).
|
|
18
|
+
*
|
|
19
|
+
* A failure before the model call (no login, a refused model, a session it
|
|
20
|
+
* cannot resume) fires no hook and writes no JSON line, only its error on
|
|
21
|
+
* stderr and exit status 1: the hold keeps Copilot's stderr lines among the
|
|
22
|
+
* events, wrapped as `aeolus.stderr`, and the launch window reads them as it
|
|
23
|
+
* reads `session.error`, which a failed model call writes.
|
|
24
|
+
*/
|
|
25
|
+
/** The Copilot CLI builds whose hook roles the aeolus-fleet plugin is proven on (design harnesses/cursor-copilot, S3). */
|
|
26
|
+
export declare const COPILOT_PROVEN_VERSIONS: readonly string[];
|
|
27
|
+
/** The prompt of a restarted session: Copilot has no wake command, so the start context and the crew-a-ship skill say the rest. */
|
|
28
|
+
export declare const WAKE_PROMPT = "Aeolus started this session again: go on crewing this folder's Aeolus ship as the crew-a-ship skill says.";
|
|
29
|
+
/** The line the hold writes for each line Copilot writes on stderr, so the launch window reads what Copilot says before any event. */
|
|
30
|
+
export declare const STDERR_EVENT = "aeolus.stderr";
|
|
31
|
+
export declare const COPILOT_ADAPTER_FLAGS: readonly AdapterFlag[];
|
|
32
|
+
/** The flags of Copilot that are risky: beyond every tool, which every launch allows, they open every path and every URL (#326). */
|
|
33
|
+
export declare const COPILOT_RISKY_FLAGS: readonly string[];
|
|
34
|
+
/** `copilot`, the configured flags, JSON output, every tool allowed and no question tool, then the session to resume when there is one, and the prompt last as the value of --prompt, so it never reads as a flag. */
|
|
35
|
+
export declare function copilotCommandLine(at: {
|
|
36
|
+
flags: readonly string[];
|
|
37
|
+
prompt: string;
|
|
38
|
+
sessionId?: string;
|
|
39
|
+
program?: string;
|
|
40
|
+
}): CommandPart[];
|
|
41
|
+
/** The command of a later turn (CC4): the session's start command, resuming the session by the id given, with the line as its prompt. */
|
|
42
|
+
export declare function copilotTurnCommand(at: {
|
|
43
|
+
start: readonly string[];
|
|
44
|
+
sessionId: string;
|
|
45
|
+
line: string;
|
|
46
|
+
}): string[];
|
|
47
|
+
/** The line the hold keeps for a line Copilot wrote on stderr. */
|
|
48
|
+
export declare function copilotStderrEvent(line: string): string;
|
|
49
|
+
/** The session id a line of Copilot's output names: its result's; none for any other line. */
|
|
50
|
+
export declare function copilotSessionIdOf(line: string): string | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Why Copilot's start failed, from its last error (headless H13): the model it
|
|
53
|
+
* refused when that is the model it launched with (or any, when it launched
|
|
54
|
+
* with none), or else the error's message. Tested on output captured from
|
|
55
|
+
* Copilot CLI 1.0.105 (test/logs).
|
|
56
|
+
*/
|
|
57
|
+
export declare function copilotErrorIn(at: {
|
|
58
|
+
events: readonly string[];
|
|
59
|
+
model?: string;
|
|
60
|
+
}): {
|
|
61
|
+
kind: 'refused';
|
|
62
|
+
model: string;
|
|
63
|
+
} | {
|
|
64
|
+
kind: 'cause';
|
|
65
|
+
cause: string;
|
|
66
|
+
} | undefined;
|
|
67
|
+
export declare function createCopilotHarness(options: {
|
|
68
|
+
configuration: TrierarchConfiguration;
|
|
69
|
+
plugin: AeolusPlugin;
|
|
70
|
+
sessions: Pick<SessionRuntime, 'start' | 'send' | 'interrupt' | 'events'>;
|
|
71
|
+
/** Copilot's version as detection last found it, read each time: a build its plugin is not proven on is not offered (CC3). */
|
|
72
|
+
detectedVersion: () => string | undefined;
|
|
73
|
+
/** Whether sessions run in containers, where Copilot is not proven (CC10). */
|
|
74
|
+
isInContainer: boolean;
|
|
75
|
+
/** The trierarch's COPILOT_HOME, which its sessions get so they use the login and plugin it found; none when it has none. */
|
|
76
|
+
copilotHome?: string;
|
|
77
|
+
/** The program to run; `copilot` unless a test runs another. */
|
|
78
|
+
command?: string;
|
|
79
|
+
}): HarnessPort;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { effectiveFlags } from '../core/effective-flags.js';
|
|
3
|
+
import { firstPromptOf, wakePromptOf } from '../core/no-terminal-questions.js';
|
|
4
|
+
import { LAUNCH_VARIABLE } from './claude-code.js';
|
|
5
|
+
import { partsWithWords, wordsOf } from './command-line.js';
|
|
6
|
+
import { parsedLine } from './hold-protocol.js';
|
|
7
|
+
import { createLaunchMarks } from './launch-marker.js';
|
|
8
|
+
import { createPluginIdentity } from './plugin-identity.js';
|
|
9
|
+
/**
|
|
10
|
+
* The GitHub Copilot CLI as a harness (docs/architecture.md, "First
|
|
11
|
+
* adapters"; design harnesses/cursor-copilot, CC3, CC4, CC6, CC10), headless:
|
|
12
|
+
* one `copilot -p` per turn in the folder, as Codex runs one `codex exec`, its
|
|
13
|
+
* output as JSON lines, every tool allowed and its question tool off, so a
|
|
14
|
+
* turn asks nothing. Every later turn resumes the session by the id the last
|
|
15
|
+
* turn's result named; a restart too, since `--continue` takes the latest
|
|
16
|
+
* session of the machine, whatever its folder (Copilot CLI 1.0.105). Between
|
|
17
|
+
* turns no Copilot process runs. Copilot signs in with the machine's own
|
|
18
|
+
* login, which the hold's clean environment leaves alone: no GitHub token
|
|
19
|
+
* reaches a session, and no API key (CC6). The identity and the turn marker
|
|
20
|
+
* go through the aeolus-fleet plugin Copilot installed, whose hooks run in
|
|
21
|
+
* `copilot -p` as in a terminal (S3).
|
|
22
|
+
*
|
|
23
|
+
* A failure before the model call (no login, a refused model, a session it
|
|
24
|
+
* cannot resume) fires no hook and writes no JSON line, only its error on
|
|
25
|
+
* stderr and exit status 1: the hold keeps Copilot's stderr lines among the
|
|
26
|
+
* events, wrapped as `aeolus.stderr`, and the launch window reads them as it
|
|
27
|
+
* reads `session.error`, which a failed model call writes.
|
|
28
|
+
*/
|
|
29
|
+
/** The Copilot CLI builds whose hook roles the aeolus-fleet plugin is proven on (design harnesses/cursor-copilot, S3). */
|
|
30
|
+
export const COPILOT_PROVEN_VERSIONS = ['1.0.105'];
|
|
31
|
+
/** The prompt of a restarted session: Copilot has no wake command, so the start context and the crew-a-ship skill say the rest. */
|
|
32
|
+
export const WAKE_PROMPT = "Aeolus started this session again: go on crewing this folder's Aeolus ship as the crew-a-ship skill says.";
|
|
33
|
+
/** Added to every launch, as mechanism: the turn's events as JSON lines, which the hold keeps (headless H13). */
|
|
34
|
+
const JSON_OUTPUT = '--output-format=json';
|
|
35
|
+
/** Added to every launch: `copilot -p` runs no tool without it. Running every tool without asking is the mode a session the trierarch runs is in (decision 0016). */
|
|
36
|
+
const ALLOW_ALL_TOOLS = '--allow-all-tools';
|
|
37
|
+
/** Added to every launch: Copilot's question tool waits for an answer nobody gives; the session asks over the fleet instead (#460). */
|
|
38
|
+
const NO_ASK_USER = '--no-ask-user';
|
|
39
|
+
const PROMPT = '--prompt=';
|
|
40
|
+
const RESUME = '--resume=';
|
|
41
|
+
/** The variable Copilot reads its configuration folder from, which the trierarch found its plugin in. */
|
|
42
|
+
const COPILOT_HOME_VARIABLE = 'COPILOT_HOME';
|
|
43
|
+
/** The line the hold writes for each line Copilot writes on stderr, so the launch window reads what Copilot says before any event. */
|
|
44
|
+
export const STDERR_EVENT = 'aeolus.stderr';
|
|
45
|
+
export const COPILOT_ADAPTER_FLAGS = [
|
|
46
|
+
{ flag: JSON_OUTPUT, when: 'always' },
|
|
47
|
+
{ flag: ALLOW_ALL_TOOLS, when: 'always' },
|
|
48
|
+
{ flag: NO_ASK_USER, when: 'always' },
|
|
49
|
+
];
|
|
50
|
+
/** The flags of Copilot that are risky: beyond every tool, which every launch allows, they open every path and every URL (#326). */
|
|
51
|
+
export const COPILOT_RISKY_FLAGS = ['--allow-all', '--yolo', '--allow-all-paths', '--allow-all-urls'];
|
|
52
|
+
/** `copilot`, the configured flags, JSON output, every tool allowed and no question tool, then the session to resume when there is one, and the prompt last as the value of --prompt, so it never reads as a flag. */
|
|
53
|
+
export function copilotCommandLine(at) {
|
|
54
|
+
return partsWithWords([
|
|
55
|
+
{ words: [at.program ?? 'copilot'] },
|
|
56
|
+
{ words: at.flags, source: 'configuration' },
|
|
57
|
+
{ words: [JSON_OUTPUT], source: 'adapter' },
|
|
58
|
+
{ words: [ALLOW_ALL_TOOLS], source: 'adapter' },
|
|
59
|
+
{ words: [NO_ASK_USER], source: 'adapter' },
|
|
60
|
+
{ words: [...(at.sessionId === undefined ? [] : [`${RESUME}${at.sessionId}`]), `${PROMPT}${at.prompt}`] },
|
|
61
|
+
]);
|
|
62
|
+
}
|
|
63
|
+
/** The command of a later turn (CC4): the session's start command, resuming the session by the id given, with the line as its prompt. */
|
|
64
|
+
export function copilotTurnCommand(at) {
|
|
65
|
+
const words = at.start.filter((word) => !word.startsWith(RESUME) && !word.startsWith(PROMPT));
|
|
66
|
+
return [...words, `${RESUME}${at.sessionId}`, `${PROMPT}${at.line}`];
|
|
67
|
+
}
|
|
68
|
+
/** The line the hold keeps for a line Copilot wrote on stderr. */
|
|
69
|
+
export function copilotStderrEvent(line) {
|
|
70
|
+
return JSON.stringify({ type: STDERR_EVENT, line });
|
|
71
|
+
}
|
|
72
|
+
/** The result that ends each `copilot -p`, the only event naming the session. */
|
|
73
|
+
const resultSchema = z.object({ type: z.literal('result'), sessionId: z.string().min(1) });
|
|
74
|
+
/** The session id a line of Copilot's output names: its result's; none for any other line. */
|
|
75
|
+
export function copilotSessionIdOf(line) {
|
|
76
|
+
return resultSchema.safeParse(parsedLine(line)).data?.sessionId;
|
|
77
|
+
}
|
|
78
|
+
const sessionErrorSchema = z.object({ type: z.literal('session.error'), data: z.object({ message: z.string() }) });
|
|
79
|
+
const stderrSchema = z.object({ type: z.literal(STDERR_EVENT), line: z.string() });
|
|
80
|
+
/** How Copilot CLI 1.0.105 refuses a model this login may not use, before any turn. */
|
|
81
|
+
const REFUSED_MODEL = /^Model "([^"]+)" from --model flag is not available\.$/u;
|
|
82
|
+
/** How Copilot starts the error it writes on stderr. */
|
|
83
|
+
const ERROR_PREFIX = 'Error: ';
|
|
84
|
+
/** The last error in Copilot's events: a session error, or the error it wrote on stderr; none without one. */
|
|
85
|
+
function lastErrorIn(events) {
|
|
86
|
+
for (const line of [...events].reverse()) {
|
|
87
|
+
const event = parsedLine(line);
|
|
88
|
+
const sessionError = sessionErrorSchema.safeParse(event);
|
|
89
|
+
if (sessionError.success) {
|
|
90
|
+
return sessionError.data.data.message;
|
|
91
|
+
}
|
|
92
|
+
const stderr = stderrSchema.safeParse(event).data?.line;
|
|
93
|
+
if (stderr?.startsWith(ERROR_PREFIX) === true) {
|
|
94
|
+
return stderr.slice(ERROR_PREFIX.length);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Why Copilot's start failed, from its last error (headless H13): the model it
|
|
101
|
+
* refused when that is the model it launched with (or any, when it launched
|
|
102
|
+
* with none), or else the error's message. Tested on output captured from
|
|
103
|
+
* Copilot CLI 1.0.105 (test/logs).
|
|
104
|
+
*/
|
|
105
|
+
export function copilotErrorIn(at) {
|
|
106
|
+
const error = lastErrorIn(at.events);
|
|
107
|
+
if (error === undefined) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
const refused = REFUSED_MODEL.exec(error)?.[1];
|
|
111
|
+
return refused !== undefined && (at.model === undefined || refused === at.model) ? { kind: 'refused', model: refused } : { kind: 'cause', cause: error };
|
|
112
|
+
}
|
|
113
|
+
/** The session the last turn in the events named, which a restart resumes; none when no turn named one. */
|
|
114
|
+
function lastSessionIn(events) {
|
|
115
|
+
return [...events].reverse().map(copilotSessionIdOf).find((id) => id !== undefined);
|
|
116
|
+
}
|
|
117
|
+
export function createCopilotHarness(options) {
|
|
118
|
+
const { configuration, plugin, sessions } = options;
|
|
119
|
+
const marks = createLaunchMarks(plugin);
|
|
120
|
+
const { handOverLine, forceOverLine, ...identity } = createPluginIdentity(plugin);
|
|
121
|
+
const proven = COPILOT_PROVEN_VERSIONS.map((version) => `Copilot CLI ${version}`).join(', ');
|
|
122
|
+
return {
|
|
123
|
+
...identity,
|
|
124
|
+
launch: async ({ shipId, folder, harness, options: picked, isFirstStart, launchId, login, firstPrompt }) => {
|
|
125
|
+
const settings = configuration.harnesses[harness];
|
|
126
|
+
if (settings === undefined) {
|
|
127
|
+
throw new Error(`The configuration has no harness ${harness}`);
|
|
128
|
+
}
|
|
129
|
+
if (login !== 'subscription') {
|
|
130
|
+
throw new Error("Copilot signs in with this computer's own login (copilot login): it runs on no API key");
|
|
131
|
+
}
|
|
132
|
+
const prompt = isFirstStart && firstPrompt !== undefined ? firstPromptOf(firstPrompt) : wakePromptOf(WAKE_PROMPT);
|
|
133
|
+
// Read before the start, which clears the session's events.
|
|
134
|
+
const sessionId = isFirstStart ? undefined : lastSessionIn(await sessions.events(shipId));
|
|
135
|
+
const command = copilotCommandLine({ flags: effectiveFlags(settings, picked), prompt, ...(sessionId !== undefined && { sessionId }), ...(options.command !== undefined && { program: options.command }) });
|
|
136
|
+
await marks.clear(folder);
|
|
137
|
+
const env = { [LAUNCH_VARIABLE]: launchId, ...(options.copilotHome !== undefined && { [COPILOT_HOME_VARIABLE]: options.copilotHome }) };
|
|
138
|
+
await sessions.start({ shipId, folder, command: wordsOf(command), harness, env });
|
|
139
|
+
},
|
|
140
|
+
handOver: async (session) => {
|
|
141
|
+
const line = await handOverLine(session);
|
|
142
|
+
if (line === undefined) {
|
|
143
|
+
return 'nothing';
|
|
144
|
+
}
|
|
145
|
+
await sessions.send({ shipId: session.shipId, line: wakePromptOf(line) });
|
|
146
|
+
return 'handed';
|
|
147
|
+
},
|
|
148
|
+
forceOver: async ({ shipId, folder, isTurnBusy }) => {
|
|
149
|
+
const line = await forceOverLine({ shipId, folder });
|
|
150
|
+
if (line === undefined) {
|
|
151
|
+
return 'nothing';
|
|
152
|
+
}
|
|
153
|
+
if (isTurnBusy) {
|
|
154
|
+
await sessions.interrupt(shipId);
|
|
155
|
+
}
|
|
156
|
+
await sessions.send({ shipId, line: wakePromptOf(line) });
|
|
157
|
+
return 'handed';
|
|
158
|
+
},
|
|
159
|
+
marksLaunches: () => marks.isMarking(),
|
|
160
|
+
notOfferedReason: async () => {
|
|
161
|
+
// The trierarch's upgrade installs no Copilot plugin: the reason says Copilot's own command.
|
|
162
|
+
if ((await plugin.root().catch(() => undefined)) === undefined) {
|
|
163
|
+
return 'its aeolus-fleet plugin is not installed for Copilot: copilot plugin install aeolus-fleet@aeolus-fleet';
|
|
164
|
+
}
|
|
165
|
+
if (options.isInContainer) {
|
|
166
|
+
return 'Copilot is not proven in a container: the container runtime runs claude-code only';
|
|
167
|
+
}
|
|
168
|
+
const version = options.detectedVersion();
|
|
169
|
+
if (version === undefined) {
|
|
170
|
+
return `its Copilot CLI version is not detected yet: the hooks of its aeolus-fleet plugin are proven on ${proven}`;
|
|
171
|
+
}
|
|
172
|
+
return COPILOT_PROVEN_VERSIONS.includes(version) ? undefined : `Copilot CLI ${version} is not proven: the hooks of its aeolus-fleet plugin are proven on ${proven}`;
|
|
173
|
+
},
|
|
174
|
+
// The marker says what the session did (#490); what Copilot says before any hook runs, a refused model or login, is read from its output (headless H13).
|
|
175
|
+
launchSeen: async ({ shipId, folder, launchId, model }) => {
|
|
176
|
+
const error = copilotErrorIn({ events: await sessions.events(shipId), ...(model !== undefined && { model }) });
|
|
177
|
+
if (error?.kind === 'refused') {
|
|
178
|
+
return { kind: 'refused', model: error.model };
|
|
179
|
+
}
|
|
180
|
+
if ((await marks.read({ folder, launchId }))?.isActive === true) {
|
|
181
|
+
return { kind: 'active' };
|
|
182
|
+
}
|
|
183
|
+
return { kind: 'none', ...(error !== undefined && { cause: error.cause }) };
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=copilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../src/adapters/copilot.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { tmpdir } from 'node:os';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { createClaudeCodeDetector } from './claude-code-detector.js';
|
|
5
5
|
import { createCodexDetector } from './codex-detector.js';
|
|
6
|
+
import { createCopilotDetector } from './copilot-detector.js';
|
|
6
7
|
import { runCommand } from './run-command.js';
|
|
7
8
|
/** The detector of each harness this trierarch has an adapter for (#365), running the real CLIs. */
|
|
8
9
|
export function createDetectors(at) {
|
|
@@ -19,6 +20,11 @@ export function createDetectors(at) {
|
|
|
19
20
|
// As for Claude Code: a new empty folder per detection, so a probe is never a ship.
|
|
20
21
|
neutralFolder: () => mkdtemp(join(tmpdir(), 'aeolus-trierarch-probe-')),
|
|
21
22
|
}),
|
|
23
|
+
copilot: createCopilotDetector({
|
|
24
|
+
run: runCommand,
|
|
25
|
+
// Copilot's settings where Copilot keeps them: in COPILOT_HOME when it is set.
|
|
26
|
+
readSettings: () => readFile(join(at.env.COPILOT_HOME ?? join(at.homeDirectory, '.copilot'), 'settings.json'), 'utf8').catch(() => undefined),
|
|
27
|
+
}),
|
|
22
28
|
};
|
|
23
29
|
}
|
|
24
30
|
//# sourceMappingURL=detectors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../src/adapters/detectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,oGAAoG;AACpG,MAAM,UAAU,eAAe,CAAC,EAAgF;IAC9G,OAAO;QACL,aAAa,EAAE,wBAAwB,CAAC;YACtC,GAAG,EAAE,UAAU;YACf,gHAAgH;YAChH,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC;SACxE,CAAC;QACF,KAAK,EAAE,mBAAmB,CAAC;YACzB,GAAG,EAAE,UAAU;YACf,mFAAmF;YACnF,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YACrI,oFAAoF;YACpF,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC;SACxE,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"detectors.js","sourceRoot":"","sources":["../../src/adapters/detectors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,oGAAoG;AACpG,MAAM,UAAU,eAAe,CAAC,EAAgF;IAC9G,OAAO;QACL,aAAa,EAAE,wBAAwB,CAAC;YACtC,GAAG,EAAE,UAAU;YACf,gHAAgH;YAChH,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC;SACxE,CAAC;QACF,KAAK,EAAE,mBAAmB,CAAC;YACzB,GAAG,EAAE,UAAU;YACf,mFAAmF;YACnF,UAAU,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;YACrI,oFAAoF;YACpF,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC;SACxE,CAAC;QACF,OAAO,EAAE,qBAAqB,CAAC;YAC7B,GAAG,EAAE,UAAU;YACf,+EAA+E;YAC/E,YAAY,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,UAAU,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;SAC9I,CAAC;KACH,CAAC;AACJ,CAAC"}
|
package/dist/adapters/files.d.ts
CHANGED
|
@@ -35,6 +35,22 @@ export declare const trierarchConfigurationSchema: z.ZodObject<{
|
|
|
35
35
|
cacheRead: z.ZodNumber;
|
|
36
36
|
cacheWrite: z.ZodNumber;
|
|
37
37
|
}, z.core.$strict>>>;
|
|
38
|
+
logins: z.ZodOptional<z.ZodObject<{
|
|
39
|
+
default: z.ZodOptional<z.ZodObject<{
|
|
40
|
+
'claude-code': z.ZodOptional<z.ZodEnum<{
|
|
41
|
+
apiKey: "apiKey";
|
|
42
|
+
subscription: "subscription";
|
|
43
|
+
}>>;
|
|
44
|
+
codex: z.ZodOptional<z.ZodEnum<{
|
|
45
|
+
apiKey: "apiKey";
|
|
46
|
+
subscription: "subscription";
|
|
47
|
+
}>>;
|
|
48
|
+
}, z.core.$strict>>;
|
|
49
|
+
ships: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodEnum<{
|
|
50
|
+
apiKey: "apiKey";
|
|
51
|
+
subscription: "subscription";
|
|
52
|
+
}>>>;
|
|
53
|
+
}, z.core.$strict>>;
|
|
38
54
|
}, z.core.$strict>;
|
|
39
55
|
export type TrierarchConfiguration = z.infer<typeof trierarchConfigurationSchema>;
|
|
40
56
|
/** A file the trierarch cannot use, with why, for the operator to read. */
|
package/dist/adapters/files.js
CHANGED
|
@@ -2,6 +2,7 @@ import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
|
2
2
|
import { dirname } from 'node:path';
|
|
3
3
|
import { idSchema, trierarchConfigurationSchema as commonConfigurationSchema, trierarchNameSchema } from '@aeolus-fleet/common';
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
+
import { LOGINS } from '../core/login.js';
|
|
5
6
|
import { withoutRemoteControl } from '../core/remote-control.js';
|
|
6
7
|
/**
|
|
7
8
|
* The trierarch's own files: its configuration, written by the operator, and
|
|
@@ -17,12 +18,16 @@ import { withoutRemoteControl } from '../core/remote-control.js';
|
|
|
17
18
|
* a crew request never names them. With them, the price table the cost of a
|
|
18
19
|
* ship's tokens is estimated by (#353): per model, in US dollars per million
|
|
19
20
|
* tokens of each kind, in place of its list price or for a model with none.
|
|
21
|
+
* And which login each session runs on (api keys K5): a default per harness
|
|
22
|
+
* and a login per ship name, never a key or a path.
|
|
20
23
|
*/
|
|
21
24
|
const priceSchema = z.number().nonnegative();
|
|
25
|
+
const loginSchema = z.enum(LOGINS);
|
|
22
26
|
export const trierarchConfigurationSchema = commonConfigurationSchema
|
|
23
27
|
.extend({
|
|
24
28
|
repositories: z.record(trierarchNameSchema, z.strictObject({ path: z.string().min(1), checkouts: z.array(trierarchNameSchema).optional() })),
|
|
25
29
|
prices: z.record(z.string().min(1), z.strictObject({ input: priceSchema, output: priceSchema, cacheRead: priceSchema, cacheWrite: priceSchema })).optional(),
|
|
30
|
+
logins: z.strictObject({ default: z.strictObject({ 'claude-code': loginSchema.optional(), codex: loginSchema.optional() }).optional(), ships: z.record(z.string().min(1), loginSchema).optional() }).optional(),
|
|
26
31
|
})
|
|
27
32
|
.superRefine((configuration, context) => {
|
|
28
33
|
for (const [repository, { checkouts = [] }] of Object.entries(configuration.repositories)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/adapters/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,4BAA4B,IAAI,yBAAyB,EAAE,mBAAmB,EAAe,MAAM,sBAAsB,CAAC;AAC7I,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE;;;;GAIG;AAEH
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/adapters/files.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,12 +21,11 @@ export declare function commandLinesOf(at: {
|
|
|
21
21
|
flags: readonly string[];
|
|
22
22
|
files: HarnessFiles;
|
|
23
23
|
permissionModes: readonly string[] | undefined;
|
|
24
|
-
isHeadless: boolean;
|
|
25
24
|
}): Promise<CommandLines | undefined>;
|
|
26
25
|
/**
|
|
27
26
|
* The adapters of the harnesses the configuration offers, by name, each with
|
|
28
27
|
* the aeolus-fleet plugin its harness installed. A plugin is looked for only for a
|
|
29
|
-
* harness on offer, so a machine without Codex needs no
|
|
28
|
+
* harness on offer, so a machine without Codex or Copilot needs no plugin for it. A
|
|
30
29
|
* configured harness this trierarch has no adapter for is refused at start,
|
|
31
30
|
* so no request for it is ever crewed.
|
|
32
31
|
*/
|
|
@@ -43,6 +42,8 @@ export declare function createHarnesses(at: {
|
|
|
43
42
|
homes: string;
|
|
44
43
|
managedSettings: string;
|
|
45
44
|
};
|
|
45
|
+
/** Where sessions on an API key reach the model proxy (headless H16); none on a machine with no proxy. */
|
|
46
|
+
proxyUrl?: () => Promise<string | undefined>;
|
|
46
47
|
}): Promise<{
|
|
47
48
|
harnesses: Record<string, HarnessPort>;
|
|
48
49
|
plugins: Record<string, AeolusPlugin>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import { CLAUDE_CODE_ADAPTER_FLAGS, CLAUDE_CODE_RISKY_FLAGS, claudeCodeCommandLine, claudeCodeSettingsDefaultMode, createClaudeCodeHarness
|
|
2
|
+
import { CLAUDE_CODE_ADAPTER_FLAGS, CLAUDE_CODE_RISKY_FLAGS, claudeCodeCommandLine, claudeCodeSettingsDefaultMode, createClaudeCodeHarness } from './claude-code.js';
|
|
3
3
|
import { createClaudeCodeSetup } from './claude-code-setup.js';
|
|
4
4
|
import { createCodexSetup } from './codex-setup.js';
|
|
5
5
|
import { CODEX_ADAPTER_FLAGS, CODEX_RISKY_FLAGS, codexCommandLine, createCodexHarness, WAKE_PROMPT as CODEX_WAKE_PROMPT } from './codex.js';
|
|
6
|
+
import { COPILOT_ADAPTER_FLAGS, COPILOT_RISKY_FLAGS, copilotCommandLine, createCopilotHarness, WAKE_PROMPT as COPILOT_WAKE_PROMPT } from './copilot.js';
|
|
6
7
|
import { firstPromptOf, wakePromptOf } from '../core/no-terminal-questions.js';
|
|
7
8
|
import { findAeolusPlugin } from './plugin.js';
|
|
8
9
|
/** What the settings' first prompt stands for where config check shows a command line. */
|
|
@@ -12,9 +13,9 @@ const ADAPTERS = {
|
|
|
12
13
|
'claude-code': {
|
|
13
14
|
adapterFlags: CLAUDE_CODE_ADAPTER_FLAGS,
|
|
14
15
|
riskyFlags: CLAUDE_CODE_RISKY_FLAGS,
|
|
15
|
-
commandLines: async (flags, { files, permissionModes
|
|
16
|
+
commandLines: async (flags, { files, permissionModes }) => {
|
|
16
17
|
const defaultPermissionMode = await claudeCodeSettingsDefaultMode(files.claudeCode, { flags });
|
|
17
|
-
const commandLine = (isFirstStart) => claudeCodeCommandLine({ flags,
|
|
18
|
+
const commandLine = (isFirstStart) => claudeCodeCommandLine({ flags, isFirstStart, defaultPermissionMode, permissionModes });
|
|
18
19
|
return { firstStart: commandLine(true), restart: commandLine(false) };
|
|
19
20
|
},
|
|
20
21
|
},
|
|
@@ -26,6 +27,12 @@ const ADAPTERS = {
|
|
|
26
27
|
return Promise.resolve({ firstStart: commandLine(true), restart: commandLine(false) });
|
|
27
28
|
},
|
|
28
29
|
},
|
|
30
|
+
copilot: {
|
|
31
|
+
adapterFlags: COPILOT_ADAPTER_FLAGS,
|
|
32
|
+
riskyFlags: COPILOT_RISKY_FLAGS,
|
|
33
|
+
// A restart resumes the session its last turn named, which config check cannot know: it shows the restart without it.
|
|
34
|
+
commandLines: (flags) => Promise.resolve({ firstStart: copilotCommandLine({ flags, prompt: firstPromptOf(FIRST_PROMPT) }), restart: copilotCommandLine({ flags, prompt: wakePromptOf(COPILOT_WAKE_PROMPT) }) }),
|
|
35
|
+
},
|
|
29
36
|
};
|
|
30
37
|
/** The flags each configured harness's adapter adds itself, for describe. */
|
|
31
38
|
export function adapterFlagsOf(configuration) {
|
|
@@ -37,26 +44,31 @@ export function riskyFlagsOf(configuration) {
|
|
|
37
44
|
}
|
|
38
45
|
/** What a harness launches with the given flags, on a first start and a restart, headless or in a terminal, for config check; undefined without an adapter. */
|
|
39
46
|
export async function commandLinesOf(at) {
|
|
40
|
-
return ADAPTERS[at.harness]?.commandLines(at.flags, { files: at.files, permissionModes: at.permissionModes
|
|
47
|
+
return ADAPTERS[at.harness]?.commandLines(at.flags, { files: at.files, permissionModes: at.permissionModes });
|
|
41
48
|
}
|
|
42
49
|
/**
|
|
43
50
|
* The adapters of the harnesses the configuration offers, by name, each with
|
|
44
51
|
* the aeolus-fleet plugin its harness installed. A plugin is looked for only for a
|
|
45
|
-
* harness on offer, so a machine without Codex needs no
|
|
52
|
+
* harness on offer, so a machine without Codex or Copilot needs no plugin for it. A
|
|
46
53
|
* configured harness this trierarch has no adapter for is refused at start,
|
|
47
54
|
* so no request for it is ever crewed.
|
|
48
55
|
*/
|
|
49
56
|
export async function createHarnesses(at) {
|
|
50
|
-
const { configuration, homeDirectory, env, managedSettings, detected, sessions, shipHomes } = at;
|
|
57
|
+
const { configuration, homeDirectory, env, managedSettings, detected, sessions, shipHomes, proxyUrl } = at;
|
|
51
58
|
const harnesses = {};
|
|
52
59
|
const plugins = {};
|
|
53
60
|
for (const name of Object.keys(configuration.harnesses)) {
|
|
54
|
-
if (name !== 'claude-code' && name !== 'codex') {
|
|
55
|
-
throw new Error(`This trierarch has no adapter for the harness ${name}: it offers claude-code and
|
|
61
|
+
if (name !== 'claude-code' && name !== 'codex' && name !== 'copilot') {
|
|
62
|
+
throw new Error(`This trierarch has no adapter for the harness ${name}: it offers claude-code, codex and copilot`);
|
|
56
63
|
}
|
|
57
64
|
const plugin = await findAeolusPlugin({ homeDirectory, env, harness: name });
|
|
58
65
|
plugins[name] = plugin;
|
|
59
|
-
|
|
66
|
+
if (name === 'copilot') {
|
|
67
|
+
// Copilot runs on the host only (CC10): with homes for containers, the machine does not offer it.
|
|
68
|
+
harnesses[name] = createCopilotHarness({ configuration, plugin, sessions, detectedVersion: () => detected().copilot?.version, isInContainer: shipHomes !== undefined, ...(env.COPILOT_HOME !== undefined && { copilotHome: env.COPILOT_HOME }) });
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
harnesses[name] = name === 'codex' ? createCodexHarness({ configuration, plugin, sessions, setup: createCodexSetup(), ...(proxyUrl !== undefined && { proxyUrl }) }) : createClaudeCodeHarness({ configuration, plugin, sessions, ...(proxyUrl !== undefined && { proxyUrl }), permissionModes: () => detected()['claude-code']?.permissionModes, projects: join(env.CLAUDE_CONFIG_DIR ?? join(homeDirectory, '.claude'), 'projects'), setup: createClaudeCodeSetup({ homeDirectory, managedSettings, ...(env.CLAUDE_CONFIG_DIR !== undefined && { configDirectory: env.CLAUDE_CONFIG_DIR }) }), ...(shipHomes !== undefined && { shipHomes }) });
|
|
60
72
|
}
|
|
61
73
|
return { harnesses, plugins };
|
|
62
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/adapters/harnesses.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,
|
|
1
|
+
{"version":3,"file":"harnesses.js","sourceRoot":"","sources":["../../src/adapters/harnesses.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import type { SessionRuntime } from '../core/ports.js';
|
|
2
2
|
import type { SessionRoots } from './caller-check.js';
|
|
3
|
-
|
|
3
|
+
import { type HoldFiles } from './hold-protocol.js';
|
|
4
|
+
/** What a session runtime's start is given. */
|
|
5
|
+
export type SessionStart = Parameters<SessionRuntime['start']>[0];
|
|
6
|
+
/** What a hold runs for a session: the command, and the environment it is given on top of the hold's own few (H10). */
|
|
7
|
+
export interface HeldCommand {
|
|
8
|
+
readonly command: readonly string[];
|
|
9
|
+
readonly env: Readonly<Record<string, string>>;
|
|
10
|
+
}
|
|
11
|
+
/** What a session's start goes through: a systemd scope of its own under a systemd unit, which sets INVOCATION_ID, so a restart or upgrade of the service ends no session (#479, #537). It expands no variable in the command: systemd 259 would turn a $$ of it into $. */
|
|
4
12
|
export declare function sessionsLaunch(at: {
|
|
5
13
|
platform: string;
|
|
6
14
|
env: Readonly<Record<string, string | undefined>>;
|
|
@@ -17,8 +25,12 @@ export declare function sessionsLaunch(at: {
|
|
|
17
25
|
* A hold that answers runs; one that started since the machine did and no
|
|
18
26
|
* longer answers has exited, kept so the exit is seen with its events; one
|
|
19
27
|
* from before the machine started is gone. A hold another version started is
|
|
20
|
-
* listed as such (H19)
|
|
21
|
-
*
|
|
28
|
+
* listed as such (H19). What runs beside the holds, as a container runtime's
|
|
29
|
+
* containers, is stopped with its ship's hold, and listed as of another
|
|
30
|
+
* version for a ship no hold holds: an older trierarch started it.
|
|
31
|
+
*
|
|
32
|
+
* A hold runs the session's command itself, unless the runtime holds it
|
|
33
|
+
* otherwise: a container runtime's hold runs the runtime's run of it (H18).
|
|
22
34
|
*/
|
|
23
35
|
export declare function createHoldRuntime(options: {
|
|
24
36
|
/** The sessions folder: a folder per ship, with its hold's files. */
|
|
@@ -29,8 +41,10 @@ export declare function createHoldRuntime(options: {
|
|
|
29
41
|
platform: string;
|
|
30
42
|
/** What a hold's start goes through: a systemd scope of its own under a systemd unit (see sessionsLaunch). */
|
|
31
43
|
launch?: readonly string[];
|
|
32
|
-
/**
|
|
33
|
-
|
|
44
|
+
/** What runs beside the holds, one per ship: stopped first when its ship's hold stops, and listed as of another version for a ship no hold holds. */
|
|
45
|
+
beside?: Pick<SessionRuntime, 'list' | 'stop'>;
|
|
46
|
+
/** What the hold runs for a session, once the ship's last session is stopped and its folder is new; the session's command and environment unless given. */
|
|
47
|
+
heldAs?: (session: SessionStart, files: HoldFiles) => Promise<HeldCommand>;
|
|
34
48
|
/** When the machine started. */
|
|
35
49
|
bootedAt?: () => Date;
|
|
36
50
|
}): SessionRuntime & SessionRoots;
|