@aeolus-fleet/trierarch 0.26.1 → 0.27.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/dist/adapters/caller-check.d.ts +32 -0
- package/dist/adapters/caller-check.js +151 -0
- package/dist/adapters/caller-check.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +1 -1
- package/dist/adapters/claude-code.js +13 -1
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/codex.d.ts +1 -1
- package/dist/adapters/codex.js +13 -1
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/container.d.ts +7 -3
- package/dist/adapters/container.js +23 -3
- package/dist/adapters/container.js.map +1 -1
- package/dist/adapters/harnesses.d.ts +1 -1
- package/dist/adapters/held-command.d.ts +13 -0
- package/dist/adapters/held-command.js +16 -0
- package/dist/adapters/held-command.js.map +1 -0
- package/dist/adapters/json-state.js +1 -0
- package/dist/adapters/json-state.js.map +1 -1
- package/dist/adapters/paths.d.ts +2 -0
- package/dist/adapters/paths.js +1 -0
- package/dist/adapters/paths.js.map +1 -1
- package/dist/adapters/plugin-identity.d.ts +6 -1
- package/dist/adapters/plugin-identity.js +15 -15
- package/dist/adapters/plugin-identity.js.map +1 -1
- package/dist/adapters/rest-fleet.js +27 -4
- package/dist/adapters/rest-fleet.js.map +1 -1
- package/dist/adapters/runtime-adapters.d.ts +2 -1
- package/dist/adapters/runtime-adapters.js +1 -1
- package/dist/adapters/runtime-adapters.js.map +1 -1
- package/dist/adapters/ship-sockets.d.ts +32 -0
- package/dist/adapters/ship-sockets.js +147 -0
- package/dist/adapters/ship-sockets.js.map +1 -0
- package/dist/adapters/stop-turn.d.ts +13 -0
- package/dist/adapters/stop-turn.js +26 -0
- package/dist/adapters/stop-turn.js.map +1 -0
- package/dist/adapters/tmux.d.ts +15 -1
- package/dist/adapters/tmux.js +50 -2
- package/dist/adapters/tmux.js.map +1 -1
- package/dist/cli/run.js +20 -2
- package/dist/cli/run.js.map +1 -1
- package/dist/core/argo-reports.d.ts +13 -2
- package/dist/core/argo-reports.js +9 -1
- package/dist/core/argo-reports.js.map +1 -1
- package/dist/core/entry.d.ts +5 -2
- package/dist/core/entry.js.map +1 -1
- package/dist/core/ports.d.ts +56 -8
- package/dist/core/reconciler.d.ts +17 -5
- package/dist/core/reconciler.js +25 -9
- package/dist/core/reconciler.js.map +1 -1
- package/dist/core/run-pass.d.ts +3 -1
- package/dist/core/run-pass.js +77 -18
- package/dist/core/run-pass.js.map +1 -1
- package/package.json +3 -3
|
@@ -24,6 +24,11 @@ export interface PluginHandOver {
|
|
|
24
24
|
shipId: ShipId;
|
|
25
25
|
folder: string;
|
|
26
26
|
}) => Promise<string | undefined>;
|
|
27
|
+
/** The same for a forced message, handed over first (decision 0040). */
|
|
28
|
+
readonly forceOverLine: (session: {
|
|
29
|
+
shipId: ShipId;
|
|
30
|
+
folder: string;
|
|
31
|
+
}) => Promise<string | undefined>;
|
|
27
32
|
}
|
|
28
33
|
/**
|
|
29
34
|
* A session's identity and turn, through the aeolus plugin's own
|
|
@@ -32,4 +37,4 @@ export interface PluginHandOver {
|
|
|
32
37
|
* data folder goes along, so the script moves an identity an older plugin
|
|
33
38
|
* kept there.
|
|
34
39
|
*/
|
|
35
|
-
export declare function createPluginIdentity(plugin: AeolusPlugin): Pick<HarnessPort, 'prepareIdentity' | '
|
|
40
|
+
export declare function createPluginIdentity(plugin: AeolusPlugin): Pick<HarnessPort, 'prepareIdentity' | 'hasIdentity' | 'removeIdentity' | 'turnOf' | 'isHolding' | 'sessionDied' | 'startProblem'> & PluginHandOver;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { access
|
|
1
|
+
import { access } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { runCommand } from './run-command.js';
|
|
4
4
|
/** Runs the plugin's own `aeolus-identity.sh` for the folder, with the plugin's data and crews folders, and its input on stdin when there is one. */
|
|
@@ -9,6 +9,11 @@ export async function runIdentity(plugin, at) {
|
|
|
9
9
|
async function runPush(plugin, at) {
|
|
10
10
|
return runCommand('bash', { args: [`${await plugin.root()}/scripts/aeolus-push.sh`, ...at.args], env: { AEOLUS_FOLDER: at.folder, AEOLUS_DATA: plugin.data, AEOLUS_CREWS: plugin.crews } });
|
|
11
11
|
}
|
|
12
|
+
/** The line a hand-over printed to type into the session, or none when it handed nothing. */
|
|
13
|
+
function lineOf(handed) {
|
|
14
|
+
const line = handed.stdout.trim();
|
|
15
|
+
return handed.status === 0 && line !== '' ? line : undefined;
|
|
16
|
+
}
|
|
12
17
|
/** The states of a store entry the trierarch hands over (#756): received, handed and not confirmed, or to hand once more. */
|
|
13
18
|
const TO_HAND = new Set(['received', 'handed', 'onceMore']);
|
|
14
19
|
/**
|
|
@@ -21,22 +26,19 @@ const TO_HAND = new Set(['received', 'handed', 'onceMore']);
|
|
|
21
26
|
export function createPluginIdentity(plugin) {
|
|
22
27
|
const identity = (folder, args) => runIdentity(plugin, { folder, args });
|
|
23
28
|
return {
|
|
24
|
-
// The
|
|
25
|
-
|
|
29
|
+
// The identity names the ship's socket and holds no crew token: the trierarch keeps it (decision 0026).
|
|
30
|
+
// The token goes on stdin, never on the command line (#822), for the plugin to keep its lease.
|
|
31
|
+
prepareIdentity: async ({ folder, identity: crew, crewToken }) => {
|
|
26
32
|
const written = await runIdentity(plugin, {
|
|
27
33
|
folder,
|
|
28
|
-
args: ['write', '--wake-by', 'trierarch', crew.fleetUrl, crew.shipId, crew.shipName, ...(crew.squadron === undefined ? [] : [crew.squadron])],
|
|
29
|
-
input:
|
|
34
|
+
args: ['write', '--wake-by', 'trierarch', '--socket', crew.socket, crew.fleetUrl, crew.shipId, crew.shipName, ...(crew.squadron === undefined ? [] : [crew.squadron])],
|
|
35
|
+
input: crewToken,
|
|
30
36
|
});
|
|
31
37
|
if (written.status !== 0) {
|
|
32
38
|
throw new Error(`aeolus-identity.sh write failed: ${written.stderr.trim()}`);
|
|
33
39
|
}
|
|
34
40
|
},
|
|
35
|
-
|
|
36
|
-
const path = (await identity(folder, ['path'])).stdout.trim();
|
|
37
|
-
const text = await readFile(path, 'utf8').catch(() => '');
|
|
38
|
-
return /^crewToken=(.+)$/m.exec(text)?.[1];
|
|
39
|
-
},
|
|
41
|
+
hasIdentity: async ({ folder }) => (await identity(folder, ['show'])).status === 0,
|
|
40
42
|
removeIdentity: async ({ folder }) => {
|
|
41
43
|
await identity(folder, ['delete']);
|
|
42
44
|
},
|
|
@@ -48,11 +50,9 @@ export function createPluginIdentity(plugin) {
|
|
|
48
50
|
// The store keeps one line per entry: its delivery id, its state and when.
|
|
49
51
|
isHolding: async ({ folder }) => (await identity(folder, ['store'])).stdout.split('\n').some((line) => TO_HAND.has(line.split(' ')[1] ?? '')),
|
|
50
52
|
// Exit 0 hands a message over and prints its line; anything else hands nothing.
|
|
51
|
-
handOverLine: async ({ folder }) => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return handed.status === 0 && line !== '' ? line : undefined;
|
|
55
|
-
},
|
|
53
|
+
handOverLine: async ({ folder }) => lineOf(await runPush(plugin, { folder, args: ['hand'] })),
|
|
54
|
+
// The plugin marks the stop before it hands over, so a stopped turn is not taken as one that died.
|
|
55
|
+
forceOverLine: async ({ folder }) => lineOf(await runPush(plugin, { folder, args: ['force'] })),
|
|
56
56
|
// The identity script stands for the scripts: a session cannot start without them (#827).
|
|
57
57
|
startProblem: async () => {
|
|
58
58
|
const scripts = join(await plugin.root(), 'scripts');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-identity.js","sourceRoot":"","sources":["../../src/adapters/plugin-identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"plugin-identity.js","sourceRoot":"","sources":["../../src/adapters/plugin-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { setTimeout as wait } from 'node:timers/promises';
|
|
2
|
-
import { assignedCrewRequestsOutputSchema, busyWaitMs, clearRequestsOutputSchema, FLEET_BUSY_WAITS_MS, giveBackCrewRequestOutputSchema, idSchema, MARKDOWN_CONTENT_TYPE, receivedDeliverySchema, shipDetailOutputSchema } from '@aeolus-fleet/common';
|
|
2
|
+
import { assignedCrewRequestsOutputSchema, busyWaitMs, clearRequestsOutputSchema, FLEET_BUSY_WAITS_MS, giveBackCrewRequestOutputSchema, idSchema, inboxOutputSchema, MARKDOWN_CONTENT_TYPE, receivedDeliverySchema, shipDetailOutputSchema } from '@aeolus-fleet/common';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { runningVersion } from './version.js';
|
|
5
5
|
/**
|
|
@@ -135,7 +135,30 @@ export function createRestFleet(options) {
|
|
|
135
135
|
answers: z.object({ messageId: idSchema('message') }),
|
|
136
136
|
});
|
|
137
137
|
},
|
|
138
|
-
|
|
138
|
+
reportToOwner: async ({ ownerShipId, text, idempotencyKey }) => {
|
|
139
|
+
try {
|
|
140
|
+
await call({
|
|
141
|
+
path: '/ship/send',
|
|
142
|
+
body: { selector: { kind: 'ship', shipId: ownerShipId }, payload: text, contentType: MARKDOWN_CONTENT_TYPE, model: TRIERARCH_SELF.model, idempotencyKey },
|
|
143
|
+
answers: z.object({ messageId: idSchema('message') }),
|
|
144
|
+
});
|
|
145
|
+
return { kind: 'sent' };
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
if (error instanceof FleetRefusal) {
|
|
149
|
+
return { kind: 'refused', code: error.code, message: error.said };
|
|
150
|
+
}
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
assignedRequests: async () => (await call({ path: '/fleet/assignedCrewRequests', answers: assignedCrewRequestsOutputSchema })).map(({ shipId, settings, settingsVersion, status, isFinal, ownerShipId, ownerName }) => ({
|
|
155
|
+
shipId,
|
|
156
|
+
settings,
|
|
157
|
+
settingsVersion,
|
|
158
|
+
status,
|
|
159
|
+
isFinal,
|
|
160
|
+
owner: ownerShipId === null || ownerName === null ? null : { shipId: ownerShipId, name: ownerName },
|
|
161
|
+
})),
|
|
139
162
|
writeStatus: async (shipId, { status, attempt, startedAt }) => {
|
|
140
163
|
await call({ path: '/fleet/reportCrewStatus', body: { shipId, status, attempt, startedAt: startedAt?.toISOString() ?? null }, answers: z.unknown() });
|
|
141
164
|
},
|
|
@@ -160,8 +183,8 @@ export function createRestFleet(options) {
|
|
|
160
183
|
},
|
|
161
184
|
inbox: async (crewToken) => {
|
|
162
185
|
try {
|
|
163
|
-
const { waiting } = await call({ path: '/ship/inbox', crewToken, body: {}, answers:
|
|
164
|
-
return { kind: 'waiting', count: waiting };
|
|
186
|
+
const { waiting, forced } = await call({ path: '/ship/inbox', crewToken, body: {}, answers: inboxOutputSchema });
|
|
187
|
+
return { kind: 'waiting', count: waiting, forced };
|
|
165
188
|
}
|
|
166
189
|
catch (error) {
|
|
167
190
|
if (error instanceof FleetRefusal && (error.code === 'LEASE_ENDED' || error.code === 'UNAUTHORIZED')) {
|
|
@@ -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":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { TrierarchConfiguration } from '@aeolus-fleet/common';
|
|
2
2
|
import type { SessionRuntime, WorkspacePort } from '../core/ports.js';
|
|
3
|
+
import type { SessionRoots } from './caller-check.js';
|
|
3
4
|
import type { TrierarchPaths } from './paths.js';
|
|
4
5
|
/** What runs the sessions, where their workspaces go, and, in containers, where each ship's home is kept. */
|
|
5
6
|
export interface RuntimeAdapters {
|
|
6
|
-
readonly sessions: SessionRuntime;
|
|
7
|
+
readonly sessions: SessionRuntime & SessionRoots;
|
|
7
8
|
readonly workspace: WorkspacePort;
|
|
8
9
|
/** The homes of the ships, one each, for sessions in containers; none on the host, where every session shares the user's. */
|
|
9
10
|
readonly shipHomes?: {
|
|
@@ -21,7 +21,7 @@ export function runtimeAdaptersOf(at) {
|
|
|
21
21
|
}
|
|
22
22
|
const clones = createCloneWorkspace({ configuration, root });
|
|
23
23
|
return {
|
|
24
|
-
sessions: createContainerRuntime({ binary: runtime.binary, image: `${SESSION_IMAGE}:${version}`, tokenFile: paths.modelToken, homes: paths.homes, memory: runtime.memory, cpus: runtime.cpus, launch }),
|
|
24
|
+
sessions: createContainerRuntime({ binary: runtime.binary, image: `${SESSION_IMAGE}:${version}`, tokenFile: paths.modelToken, homes: paths.homes, sockets: paths.sockets, memory: runtime.memory, cpus: runtime.cpus, launch }),
|
|
25
25
|
// The container mounts the folder at the path it is given, where the plugin inside keys it by `pwd -P` as the host's does: one path for both, the real one.
|
|
26
26
|
workspace: { ...clones, prepare: async (at) => ({ folder: await realpath((await clones.prepare(at)).folder) }) },
|
|
27
27
|
shipHomes: { homes: paths.homes, managedSettings },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-adapters.js","sourceRoot":"","sources":["../../src/adapters/runtime-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-adapters.js","sourceRoot":"","sources":["../../src/adapters/runtime-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAM5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,yFAAyF;AACzF,MAAM,aAAa,GAAG,wCAAwC,CAAC;AAU/D;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAyI;IACzK,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC;IACtE,MAAM,IAAI,GAAG,aAAa,CAAC,YAAY,IAAI,KAAK,CAAC,SAAS,CAAC;IAC3D,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;IAClC,IAAI,OAAO,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACtG,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAO;QACL,QAAQ,EAAE,sBAAsB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,aAAa,IAAI,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;QAC/N,4JAA4J;QAC5J,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;QAChH,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE;KACnD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Socket } from 'node:net';
|
|
2
|
+
import type { ShipId } from '@aeolus-fleet/common';
|
|
3
|
+
/**
|
|
4
|
+
* The socket of each ship the trierarch crews (decision 0026): a session holds
|
|
5
|
+
* no fleet credential, so its fleet calls come over a Unix socket of its
|
|
6
|
+
* ship's own, `<root>/<ship id>/fleet.sock`, in a folder only the trierarch's
|
|
7
|
+
* user opens (a container mounts that folder). The trierarch adds the ship's
|
|
8
|
+
* crew token, read at each call so a new crew reaches the same socket, and
|
|
9
|
+
* forwards the call unchanged; the fleet's answer goes back unchanged, a 503
|
|
10
|
+
* included. It answers only a caller of the ship's own session or of the
|
|
11
|
+
* trierarch (the caller check), and checks only the path (the ship API and the ship protocol,
|
|
12
|
+
* never register or deregister) and the size, and logs one line per call
|
|
13
|
+
* without the body. It queues nothing: when the fleet gives no answer, the
|
|
14
|
+
* session gets none either.
|
|
15
|
+
*/
|
|
16
|
+
/** The most a call's body may hold: a 64 KB payload with the JSON around it. */
|
|
17
|
+
export declare const SHIP_CALL_MAX_BYTES: number;
|
|
18
|
+
export interface ShipSockets {
|
|
19
|
+
/** Opens the ship's socket, or keeps the one open; answers its path. */
|
|
20
|
+
open(shipId: ShipId): Promise<string>;
|
|
21
|
+
/** Closes the ship's socket and removes its file: a call then gets no answer. */
|
|
22
|
+
close(shipId: ShipId): Promise<void>;
|
|
23
|
+
closeAll(): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
export declare function createShipSockets(options: {
|
|
26
|
+
root: string;
|
|
27
|
+
fleetUrl: string;
|
|
28
|
+
crewTokenOf: (shipId: ShipId) => Promise<string | undefined>;
|
|
29
|
+
/** Whether the process at the other end of the connection may call the ship's socket. */
|
|
30
|
+
mayCall: (shipId: ShipId, connection: Socket) => Promise<boolean>;
|
|
31
|
+
log: (line: string) => void;
|
|
32
|
+
}): ShipSockets;
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { chmod, mkdir, rm } from 'node:fs/promises';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* The socket of each ship the trierarch crews (decision 0026): a session holds
|
|
6
|
+
* no fleet credential, so its fleet calls come over a Unix socket of its
|
|
7
|
+
* ship's own, `<root>/<ship id>/fleet.sock`, in a folder only the trierarch's
|
|
8
|
+
* user opens (a container mounts that folder). The trierarch adds the ship's
|
|
9
|
+
* crew token, read at each call so a new crew reaches the same socket, and
|
|
10
|
+
* forwards the call unchanged; the fleet's answer goes back unchanged, a 503
|
|
11
|
+
* included. It answers only a caller of the ship's own session or of the
|
|
12
|
+
* trierarch (the caller check), and checks only the path (the ship API and the ship protocol,
|
|
13
|
+
* never register or deregister) and the size, and logs one line per call
|
|
14
|
+
* without the body. It queues nothing: when the fleet gives no answer, the
|
|
15
|
+
* session gets none either.
|
|
16
|
+
*/
|
|
17
|
+
/** The most a call's body may hold: a 64 KB payload with the JSON around it. */
|
|
18
|
+
export const SHIP_CALL_MAX_BYTES = 128 * 1024;
|
|
19
|
+
const SOCKET_FILE = 'fleet.sock';
|
|
20
|
+
/** A ship call is one word under the ship API: `/api/v1/ship/send`. */
|
|
21
|
+
const SHIP_CALL = /^\/api\/v1\/ship\/([A-Za-z]+)$/;
|
|
22
|
+
/** The calls that make or end a crew: only the trierarch makes them, never a session. */
|
|
23
|
+
const CREW_CALLS = new Set(['register', 'deregister']);
|
|
24
|
+
/** The ship protocol, which a session reads at each start (`aeolus-fleet.sh protocol`). */
|
|
25
|
+
const PROTOCOL = '/api/v1/openapi.json';
|
|
26
|
+
/** Whether the socket forwards a call to this path: the ship API but crewing, and the protocol. */
|
|
27
|
+
function isForwarded(method, path) {
|
|
28
|
+
if (method === 'GET' && path === PROTOCOL) {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const call = SHIP_CALL.exec(path)?.[1];
|
|
32
|
+
return call !== undefined && !CREW_CALLS.has(call);
|
|
33
|
+
}
|
|
34
|
+
/** The body of a call, or too large once it passes the bound. */
|
|
35
|
+
function bodyOf(incoming) {
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
const chunks = [];
|
|
38
|
+
let size = 0;
|
|
39
|
+
incoming.on('data', (chunk) => {
|
|
40
|
+
size += chunk.length;
|
|
41
|
+
if (size > SHIP_CALL_MAX_BYTES) {
|
|
42
|
+
resolve('too large');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
chunks.push(chunk);
|
|
46
|
+
});
|
|
47
|
+
incoming.on('end', () => {
|
|
48
|
+
resolve(Buffer.concat(chunks));
|
|
49
|
+
});
|
|
50
|
+
incoming.on('error', reject);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
function refuse(response, refusal) {
|
|
54
|
+
const { status, message } = refusal;
|
|
55
|
+
response.writeHead(status, { 'content-type': 'application/json', connection: 'close' });
|
|
56
|
+
response.end(JSON.stringify({ code: status === 403 ? 'FORBIDDEN' : 'PAYLOAD_TOO_LARGE', message }));
|
|
57
|
+
}
|
|
58
|
+
export function createShipSockets(options) {
|
|
59
|
+
const servers = new Map();
|
|
60
|
+
const handle = async (shipId, call) => {
|
|
61
|
+
const { incoming, response } = call;
|
|
62
|
+
const method = incoming.method ?? 'GET';
|
|
63
|
+
const path = incoming.url ?? '';
|
|
64
|
+
const said = (outcome) => {
|
|
65
|
+
options.log(`${shipId} ${method} ${path} ${outcome}`);
|
|
66
|
+
};
|
|
67
|
+
if (!(await options.mayCall(shipId, incoming.socket))) {
|
|
68
|
+
refuse(response, { status: 403, message: "This socket answers only its ship's own session" });
|
|
69
|
+
said('403');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (!isForwarded(method, path)) {
|
|
73
|
+
refuse(response, { status: 403, message: 'This socket forwards only ship calls, never register or deregister' });
|
|
74
|
+
said('403');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const body = await bodyOf(incoming);
|
|
78
|
+
if (body === 'too large') {
|
|
79
|
+
refuse(response, { status: 413, message: `A call is at most ${String(SHIP_CALL_MAX_BYTES)} bytes` });
|
|
80
|
+
said('413');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const crewToken = await options.crewTokenOf(shipId);
|
|
84
|
+
const contentType = incoming.headers['content-type'];
|
|
85
|
+
let answer;
|
|
86
|
+
try {
|
|
87
|
+
answer = await fetch(`${options.fleetUrl}${path}`, {
|
|
88
|
+
method,
|
|
89
|
+
headers: { ...(crewToken !== undefined && { authorization: `Bearer ${crewToken}` }), ...(contentType !== undefined && { 'content-type': contentType }) },
|
|
90
|
+
...(method !== 'GET' && method !== 'HEAD' && { body }),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// No answer from the fleet: none for the session either, as when it calls a fleet that is down.
|
|
95
|
+
response.socket?.destroy();
|
|
96
|
+
said('no answer');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const answered = Buffer.from(await answer.arrayBuffer());
|
|
100
|
+
const answeredType = answer.headers.get('content-type');
|
|
101
|
+
response.writeHead(answer.status, answeredType === null ? {} : { 'content-type': answeredType });
|
|
102
|
+
response.end(answered);
|
|
103
|
+
said(String(answer.status));
|
|
104
|
+
};
|
|
105
|
+
const close = async (shipId) => {
|
|
106
|
+
const open = servers.get(shipId);
|
|
107
|
+
servers.delete(shipId);
|
|
108
|
+
if (open !== undefined) {
|
|
109
|
+
open.server.closeAllConnections();
|
|
110
|
+
await new Promise((resolve) => open.server.close(() => { resolve(); }));
|
|
111
|
+
}
|
|
112
|
+
await rm(join(options.root, shipId, SOCKET_FILE), { force: true });
|
|
113
|
+
};
|
|
114
|
+
return {
|
|
115
|
+
open: async (shipId) => {
|
|
116
|
+
const open = servers.get(shipId);
|
|
117
|
+
if (open !== undefined) {
|
|
118
|
+
return open.path;
|
|
119
|
+
}
|
|
120
|
+
const folder = join(options.root, shipId);
|
|
121
|
+
await mkdir(folder, { recursive: true, mode: 0o700 });
|
|
122
|
+
await chmod(folder, 0o700);
|
|
123
|
+
const path = join(folder, SOCKET_FILE);
|
|
124
|
+
// A socket file left by a trierarch that stopped: nothing listens on it any more.
|
|
125
|
+
await rm(path, { force: true });
|
|
126
|
+
const server = createServer((incoming, response) => {
|
|
127
|
+
void handle(shipId, { incoming, response }).catch(() => {
|
|
128
|
+
response.socket?.destroy();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
await new Promise((resolve, reject) => {
|
|
132
|
+
server.once('error', reject);
|
|
133
|
+
server.listen(path, () => {
|
|
134
|
+
server.off('error', reject);
|
|
135
|
+
resolve();
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
servers.set(shipId, { server, path });
|
|
139
|
+
return path;
|
|
140
|
+
},
|
|
141
|
+
close,
|
|
142
|
+
closeAll: async () => {
|
|
143
|
+
await Promise.all([...servers.keys()].map(close));
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=ship-sockets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-sockets.js","sourceRoot":"","sources":["../../src/adapters/ship-sockets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ShipId } from '@aeolus-fleet/common';
|
|
2
|
+
import type { SessionRuntime } from '../core/ports.js';
|
|
3
|
+
/**
|
|
4
|
+
* Stops a session's busy turn for a forced message (decision 0040), as a
|
|
5
|
+
* person does with Escape, then waits for the screen to settle: once it holds
|
|
6
|
+
* still between two reads, the harness takes a new prompt, so the line typed
|
|
7
|
+
* next starts the forced turn instead of joining the stopped one.
|
|
8
|
+
*/
|
|
9
|
+
export declare function stopTurn(sessions: Pick<SessionRuntime, 'interrupt' | 'screen'>, at: {
|
|
10
|
+
shipId: ShipId;
|
|
11
|
+
pollMs?: number;
|
|
12
|
+
mostMs?: number;
|
|
13
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { setTimeout as wait } from 'node:timers/promises';
|
|
2
|
+
/** How often the screen is read while it settles after the stop. */
|
|
3
|
+
const SETTLE_POLL_MS = 250;
|
|
4
|
+
/** The longest the screen may take to settle: a screen that keeps changing never holds the pass longer. */
|
|
5
|
+
const SETTLE_MOST_MS = 5000;
|
|
6
|
+
/**
|
|
7
|
+
* Stops a session's busy turn for a forced message (decision 0040), as a
|
|
8
|
+
* person does with Escape, then waits for the screen to settle: once it holds
|
|
9
|
+
* still between two reads, the harness takes a new prompt, so the line typed
|
|
10
|
+
* next starts the forced turn instead of joining the stopped one.
|
|
11
|
+
*/
|
|
12
|
+
export async function stopTurn(sessions, at) {
|
|
13
|
+
const { shipId, pollMs = SETTLE_POLL_MS, mostMs = SETTLE_MOST_MS } = at;
|
|
14
|
+
await sessions.interrupt(shipId);
|
|
15
|
+
const until = Date.now() + mostMs;
|
|
16
|
+
let shown = await sessions.screen(shipId);
|
|
17
|
+
while (Date.now() < until) {
|
|
18
|
+
await wait(pollMs);
|
|
19
|
+
const now = await sessions.screen(shipId);
|
|
20
|
+
if (now === shown) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
shown = now;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=stop-turn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stop-turn.js","sourceRoot":"","sources":["../../src/adapters/stop-turn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAM1D,oEAAoE;AACpE,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,2GAA2G;AAC3G,MAAM,cAAc,GAAG,IAAI,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAsD,EACtD,EAAwD;IAExD,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,MAAM,GAAG,cAAc,EAAE,GAAG,EAAE,CAAC;IACxE,MAAM,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;IAClC,IAAI,KAAK,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/adapters/tmux.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { SessionRuntime } from '../core/ports.js';
|
|
2
|
+
import type { SessionRoots } from './caller-check.js';
|
|
2
3
|
export declare const TMUX_SERVER = "aeolus-trierarch";
|
|
3
4
|
/** 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. */
|
|
4
5
|
export declare function sessionsLaunch(at: {
|
|
@@ -15,8 +16,21 @@ export declare function sessionsLaunch(at: {
|
|
|
15
16
|
* the trierarch stops. Under a systemd unit it starts in a scope of its own
|
|
16
17
|
* (`systemd-run --scope`), so it is not left over in the service's control
|
|
17
18
|
* group on a restart (#537), and the unit's stop leaves it alone (#479).
|
|
19
|
+
*
|
|
20
|
+
* A tmux server takes its global environment from the process that starts
|
|
21
|
+
* it, and every session gets it. Anything else may start the server on the
|
|
22
|
+
* trierarch's socket, such as a ship's session after a `tmux kill-server`
|
|
23
|
+
* (#881), so before each start the server's global environment is set back
|
|
24
|
+
* to the trierarch's own: a variable the trierarch has not is removed, one it
|
|
25
|
+
* has with another value is set to its own (#883).
|
|
26
|
+
*
|
|
27
|
+
* A session's command runs without the `TMUX` and `TMUX_PANE` tmux gives
|
|
28
|
+
* its pane: they name the trierarch's server, so a bare `tmux kill-server` in
|
|
29
|
+
* a session, such as a test script's, would end every ship's session (#880).
|
|
30
|
+
* A bare tmux in a session reaches its user's default server instead.
|
|
18
31
|
*/
|
|
19
32
|
export declare function createTmux(options?: {
|
|
20
33
|
server?: string;
|
|
21
34
|
launch?: readonly string[];
|
|
22
|
-
|
|
35
|
+
environment?: Readonly<Record<string, string | undefined>>;
|
|
36
|
+
}): SessionRuntime & SessionRoots;
|
package/dist/adapters/tmux.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { setTimeout as wait } from 'node:timers/promises';
|
|
2
2
|
import { idSchema } from '@aeolus-fleet/common';
|
|
3
|
+
import { heldCommand } from './held-command.js';
|
|
3
4
|
import { runCommand } from './run-command.js';
|
|
4
5
|
const PREFIX = 'trierarch-';
|
|
5
6
|
export const TMUX_SERVER = 'aeolus-trierarch';
|
|
7
|
+
/** What a session's command runs through: without the variables that name the trierarch's tmux server (#880). */
|
|
8
|
+
const WITHOUT_THE_SERVER = ['env', '-u', 'TMUX', '-u', 'TMUX_PANE', '--'];
|
|
6
9
|
/** How many lines back a screen is read: the launch window's first prompt fits well within. */
|
|
7
10
|
const SCREEN_LINES = 200;
|
|
8
11
|
/** 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. */
|
|
@@ -22,10 +25,23 @@ function sessionName(shipId) {
|
|
|
22
25
|
* the trierarch stops. Under a systemd unit it starts in a scope of its own
|
|
23
26
|
* (`systemd-run --scope`), so it is not left over in the service's control
|
|
24
27
|
* group on a restart (#537), and the unit's stop leaves it alone (#479).
|
|
28
|
+
*
|
|
29
|
+
* A tmux server takes its global environment from the process that starts
|
|
30
|
+
* it, and every session gets it. Anything else may start the server on the
|
|
31
|
+
* trierarch's socket, such as a ship's session after a `tmux kill-server`
|
|
32
|
+
* (#881), so before each start the server's global environment is set back
|
|
33
|
+
* to the trierarch's own: a variable the trierarch has not is removed, one it
|
|
34
|
+
* has with another value is set to its own (#883).
|
|
35
|
+
*
|
|
36
|
+
* A session's command runs without the `TMUX` and `TMUX_PANE` tmux gives
|
|
37
|
+
* its pane: they name the trierarch's server, so a bare `tmux kill-server` in
|
|
38
|
+
* a session, such as a test script's, would end every ship's session (#880).
|
|
39
|
+
* A bare tmux in a session reaches its user's default server instead.
|
|
25
40
|
*/
|
|
26
41
|
export function createTmux(options = {}) {
|
|
27
42
|
const server = options.server ?? TMUX_SERVER;
|
|
28
43
|
const launch = options.launch ?? [];
|
|
44
|
+
const environment = options.environment ?? process.env;
|
|
29
45
|
const tmux = async (args) => runCommand('tmux', { args: ['-L', server, ...args] });
|
|
30
46
|
const must = async (args) => {
|
|
31
47
|
const result = await tmux(args);
|
|
@@ -34,6 +50,28 @@ export function createTmux(options = {}) {
|
|
|
34
50
|
}
|
|
35
51
|
return result.stdout;
|
|
36
52
|
};
|
|
53
|
+
/** Sets the running server's global environment back to the trierarch's own; with no server running there is nothing to set. */
|
|
54
|
+
const resetEnvironment = async () => {
|
|
55
|
+
const shown = await tmux(['show-environment', '-g']);
|
|
56
|
+
if (shown.status !== 0) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const line of shown.stdout.split('\n')) {
|
|
60
|
+
// A line `-NAME` is a variable removed already; `NAME=value` one the server holds.
|
|
61
|
+
const separator = line.indexOf('=');
|
|
62
|
+
if (line === '' || line.startsWith('-') || separator < 1) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const variable = line.slice(0, separator);
|
|
66
|
+
const own = environment[variable];
|
|
67
|
+
if (own === undefined) {
|
|
68
|
+
await must(['set-environment', '-g', '-u', variable]);
|
|
69
|
+
}
|
|
70
|
+
else if (own !== line.slice(separator + 1)) {
|
|
71
|
+
await must(['set-environment', '-g', variable, own]);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
37
75
|
return {
|
|
38
76
|
list: async () => {
|
|
39
77
|
const result = await tmux(['list-panes', '-a', '-F', '#{session_name} #{pane_dead}']);
|
|
@@ -55,6 +93,7 @@ export function createTmux(options = {}) {
|
|
|
55
93
|
start: async ({ shipId, folder, command, env = {} }) => {
|
|
56
94
|
const name = sessionName(shipId);
|
|
57
95
|
await tmux(['kill-session', '-t', `=${name}`]);
|
|
96
|
+
await resetEnvironment();
|
|
58
97
|
// 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.
|
|
59
98
|
// The one command that starts the server when none runs yet.
|
|
60
99
|
const [program, ...args] = [...launch, 'tmux', '-L', server, 'new-session', '-d', '-s', name, '-c', folder, '-x', '200', '-y', '50'];
|
|
@@ -63,8 +102,8 @@ export function createTmux(options = {}) {
|
|
|
63
102
|
throw new Error(`tmux new-session failed: ${started.stderr.trim()}`);
|
|
64
103
|
}
|
|
65
104
|
await must(['set-option', '-w', '-t', `=${name}:`, 'remain-on-exit', 'on']);
|
|
66
|
-
const
|
|
67
|
-
await must(['respawn-pane', '-k', '-t', `=${name}:`, '-c', folder, ...
|
|
105
|
+
const sessionVariables = Object.entries(env).flatMap(([variable, value]) => ['-e', `${variable}=${value}`]);
|
|
106
|
+
await must(['respawn-pane', '-k', '-t', `=${name}:`, '-c', folder, ...sessionVariables, '--', ...WITHOUT_THE_SERVER, ...heldCommand(command)]);
|
|
68
107
|
},
|
|
69
108
|
type: async ({ shipId, text, settleMs }) => {
|
|
70
109
|
const target = `=${sessionName(shipId)}:`;
|
|
@@ -74,10 +113,19 @@ export function createTmux(options = {}) {
|
|
|
74
113
|
}
|
|
75
114
|
await must(['send-keys', '-t', target, 'Enter']);
|
|
76
115
|
},
|
|
116
|
+
interrupt: async (shipId) => {
|
|
117
|
+
await must(['send-keys', '-t', `=${sessionName(shipId)}:`, 'Escape']);
|
|
118
|
+
},
|
|
77
119
|
screen: async (shipId) => {
|
|
78
120
|
const result = await tmux(['capture-pane', '-p', '-J', '-S', `-${String(SCREEN_LINES)}`, '-t', `=${sessionName(shipId)}:`]);
|
|
79
121
|
return result.status === 0 ? result.stdout : '';
|
|
80
122
|
},
|
|
123
|
+
// The pane's process: the session's command and all it starts run under it.
|
|
124
|
+
sessionRootOf: async (shipId) => {
|
|
125
|
+
const result = await tmux(['display-message', '-p', '-t', `=${sessionName(shipId)}:`, '#{pane_pid}']);
|
|
126
|
+
const pid = Number(result.stdout.trim());
|
|
127
|
+
return result.status === 0 && Number.isInteger(pid) && pid > 1 ? pid : undefined;
|
|
128
|
+
},
|
|
81
129
|
};
|
|
82
130
|
}
|
|
83
131
|
//# sourceMappingURL=tmux.js.map
|