@aeolus-fleet/trierarch 0.29.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +4 -2
  2. package/dist/adapters/appended-lines.d.ts +14 -0
  3. package/dist/adapters/appended-lines.js +30 -0
  4. package/dist/adapters/appended-lines.js.map +1 -0
  5. package/dist/adapters/claude-code-usage.d.ts +23 -0
  6. package/dist/adapters/claude-code-usage.js +123 -0
  7. package/dist/adapters/claude-code-usage.js.map +1 -0
  8. package/dist/adapters/clone-workspace.d.ts +2 -0
  9. package/dist/adapters/clone-workspace.js +10 -4
  10. package/dist/adapters/clone-workspace.js.map +1 -1
  11. package/dist/adapters/codex-usage.d.ts +14 -0
  12. package/dist/adapters/codex-usage.js +119 -0
  13. package/dist/adapters/codex-usage.js.map +1 -0
  14. package/dist/adapters/core-version.d.ts +1 -1
  15. package/dist/adapters/core-version.js +1 -1
  16. package/dist/adapters/files.d.ts +8 -13
  17. package/dist/adapters/files.js +12 -4
  18. package/dist/adapters/files.js.map +1 -1
  19. package/dist/adapters/folder-processes.d.ts +22 -0
  20. package/dist/adapters/folder-processes.js +90 -0
  21. package/dist/adapters/folder-processes.js.map +1 -0
  22. package/dist/adapters/git-workspace.d.ts +2 -0
  23. package/dist/adapters/git-workspace.js +12 -4
  24. package/dist/adapters/git-workspace.js.map +1 -1
  25. package/dist/adapters/json-state.js +4 -0
  26. package/dist/adapters/json-state.js.map +1 -1
  27. package/dist/adapters/machine.d.ts +27 -0
  28. package/dist/adapters/machine.js +74 -0
  29. package/dist/adapters/machine.js.map +1 -0
  30. package/dist/adapters/paths.d.ts +4 -0
  31. package/dist/adapters/paths.js +2 -0
  32. package/dist/adapters/paths.js.map +1 -1
  33. package/dist/adapters/plugin-update.js +4 -0
  34. package/dist/adapters/plugin-update.js.map +1 -1
  35. package/dist/adapters/rest-fleet.js +9 -0
  36. package/dist/adapters/rest-fleet.js.map +1 -1
  37. package/dist/adapters/runtime-adapters.d.ts +3 -0
  38. package/dist/adapters/runtime-adapters.js +3 -3
  39. package/dist/adapters/runtime-adapters.js.map +1 -1
  40. package/dist/adapters/trusted-clones.d.ts +14 -0
  41. package/dist/adapters/trusted-clones.js +45 -0
  42. package/dist/adapters/trusted-clones.js.map +1 -0
  43. package/dist/adapters/trusted-repositories-file.d.ts +36 -0
  44. package/dist/adapters/trusted-repositories-file.js +52 -0
  45. package/dist/adapters/trusted-repositories-file.js.map +1 -0
  46. package/dist/adapters/usage.d.ts +14 -0
  47. package/dist/adapters/usage.js +14 -0
  48. package/dist/adapters/usage.js.map +1 -0
  49. package/dist/cli/init.d.ts +2 -0
  50. package/dist/cli/init.js +26 -2
  51. package/dist/cli/init.js.map +1 -1
  52. package/dist/cli/main.js +4 -3
  53. package/dist/cli/main.js.map +1 -1
  54. package/dist/cli/run.d.ts +1 -1
  55. package/dist/cli/run.js +62 -6
  56. package/dist/cli/run.js.map +1 -1
  57. package/dist/cli/status.d.ts +3 -1
  58. package/dist/cli/status.js +2 -0
  59. package/dist/cli/status.js.map +1 -1
  60. package/dist/core/argo-reports.d.ts +6 -0
  61. package/dist/core/argo-reports.js +20 -0
  62. package/dist/core/argo-reports.js.map +1 -1
  63. package/dist/core/ask-for-trusted-repositories.d.ts +17 -0
  64. package/dist/core/ask-for-trusted-repositories.js +24 -0
  65. package/dist/core/ask-for-trusted-repositories.js.map +1 -0
  66. package/dist/core/check-settings.d.ts +2 -0
  67. package/dist/core/check-settings.js +5 -1
  68. package/dist/core/check-settings.js.map +1 -1
  69. package/dist/core/entry.d.ts +12 -0
  70. package/dist/core/entry.js.map +1 -1
  71. package/dist/core/handle-delivery.d.ts +8 -2
  72. package/dist/core/handle-delivery.js +23 -0
  73. package/dist/core/handle-delivery.js.map +1 -1
  74. package/dist/core/machine-load.d.ts +25 -0
  75. package/dist/core/machine-load.js +36 -0
  76. package/dist/core/machine-load.js.map +1 -0
  77. package/dist/core/ports.d.ts +47 -0
  78. package/dist/core/read-load.d.ts +21 -0
  79. package/dist/core/read-load.js +45 -0
  80. package/dist/core/read-load.js.map +1 -0
  81. package/dist/core/read-usage.d.ts +28 -0
  82. package/dist/core/read-usage.js +77 -0
  83. package/dist/core/read-usage.js.map +1 -0
  84. package/dist/core/reconciler.d.ts +9 -1
  85. package/dist/core/reconciler.js +18 -4
  86. package/dist/core/reconciler.js.map +1 -1
  87. package/dist/core/report-self.d.ts +8 -2
  88. package/dist/core/report-self.js +21 -7
  89. package/dist/core/report-self.js.map +1 -1
  90. package/dist/core/run-pass.d.ts +3 -1
  91. package/dist/core/run-pass.js +55 -7
  92. package/dist/core/run-pass.js.map +1 -1
  93. package/dist/core/token-cost.d.ts +15 -0
  94. package/dist/core/token-cost.js +38 -0
  95. package/dist/core/token-cost.js.map +1 -0
  96. package/dist/core/trusted-repositories.d.ts +28 -0
  97. package/dist/core/trusted-repositories.js +97 -0
  98. package/dist/core/trusted-repositories.js.map +1 -0
  99. package/package.json +3 -3
package/README.md CHANGED
@@ -12,7 +12,7 @@ npm install --global @aeolus-fleet/trierarch
12
12
 
13
13
  That gives the command `aeolus-trierarch`.
14
14
 
15
- 1. Join the machine through the trierarch plugin (`machines.join`): it commissions the trierarch's own ship, type `trierarch` with `crew:run`, and answers its starting prompt and a setup line, `npx @aeolus-fleet/trierarch init --fleet-url <url> --ship-id <id> --secret <secret>`, shown once.
15
+ 1. Join the machine through the trierarch plugin (`machines.join`): it commissions the trierarch's own ship, type `trierarch` with `crew:run`, and answers its starting prompt and a setup line, `npx @aeolus-fleet/trierarch init --fleet-url <url> --ship-id <id> --plugin-ship-id <its own ship> --secret <secret>`, shown once. The machine then takes the trusted repositories from that ship alone (docs/trierarch.md, "Trusted repositories"); on a machine set up before, run `aeolus-trierarch init --plugin-ship-id <id>` once to take them.
16
16
  2. Set up the machine with that line, or with `init` alone, which asks for what is missing:
17
17
 
18
18
  ```sh
@@ -37,7 +37,7 @@ That gives the command `aeolus-trierarch`.
37
37
 
38
38
  | Command | What it does |
39
39
  | --- | --- |
40
- | `aeolus-trierarch status` | The installed version, and the one the service runs when it differs (then it says to restart), the aeolus plugin version each configured harness uses (or that it has none), the configured repositories by name, the service (running, pid, since), the fleet and the trierarch's own lease, the caps in use, the entries by state, kept worktrees and orphans |
40
+ | `aeolus-trierarch status` | The installed version, and the one the service runs when it differs (then it says to restart), the aeolus plugin version each configured harness uses (or that it has none), the configured repositories by name, the service (running, pid, since), the fleet and the trierarch's own lease, the caps in use, the last pass (succeeded, or failing since when and why), the entries by state, kept worktrees and orphans |
41
41
  | `aeolus-trierarch list` | The ships it crews: ship, state, harness, workspace, since, restarts |
42
42
  | `aeolus-trierarch logs [--lines <n>] [--follow]` | The last lines of the log, and with `--follow` each new one: on macOS `~/.aeolus/trierarch/logs/trierarch.log`, where the launchd agent writes, with the log before it in `trierarch.log.1` (docs/trierarch.md says when it moves aside); on Linux the journal the systemd user unit writes to, read through `journalctl --user --unit aeolus-trierarch.service`. The log holds one JSON record per line: each action the loop takes for a ship (crew, launch, wake, report, release, confirm, forget, leave, stop) as `{ time, shipId, shipName, action, outcome, next }`, where `next` says what happens after a failure, or a message as `{ time, level, message }`. `logs` renders them as text, and `--json` gives the records as they are (a line that is no record as `{ line }`). `run` in a terminal writes the text |
43
43
  | `aeolus-trierarch add repository <name> <path>`, `aeolus-trierarch add folder <name> <path>` | Adds a repository to make worktrees of, or a folder to crew a ship in as it is, checked as init checks it, and trusts it for every configured harness in one step: adding a place is what trusts it. Then it restarts the service so the trierarch offers it, and waits until the new process says its version (at most 30 seconds); sessions keep running. A place written into `config.json` by hand is never offered and never crewed until it is added |
@@ -86,6 +86,8 @@ To stop the trierarch: `aeolus-trierarch stop`, or `aeolus-trierarch uninstall`
86
86
  - **folders**: by name, used as they are, one ship per folder, never removed.
87
87
  - **harnesses**: `claude-code`, `codex` or both: the flags every launch gets, and named options. A crew request's settings pick option values by name; they never add a flag or carry a path. There is no policy on which flags: put `--dangerously-skip-permissions` in `flags` if you want it. The trierarch never adds a flag by itself. With `--remote-control` and no name after it, each session is named `[<repository or folder>] <ship>`, such as `[aeolus-fleet] trial-1`, so it is easy to find among your remote-control sessions. Claude Code's `--permission-mode plan`, in `flags` or an option, is ignored: a crewed session runs without plan mode's tools, so it could never leave plan mode (#465); `config check` shows the command without it. For the same reason, when Claude Code's settings make `plan` the default mode and the flags name no permission mode, a launch adds `--permission-mode manual`, or `default` where the detected Claude Code's `--help` lists no `manual` mode (#505, #507, #517). It reads `permissions.defaultMode` where Claude Code does, the first that names one winning: the managed settings files (`managed-settings.json`, then `managed-settings.d/*.json`, in `/Library/Application Support/ClaudeCode` or `/etc/claude-code`), `--settings` in the flags (JSON, or a file, relative to the folder), then of the sources `--setting-sources` loads (none with `--restricted`) the folder's `.claude/settings.local.json`, its `.claude/settings.json` and the user's `settings.json` (in `CLAUDE_CONFIG_DIR` when set, else `~/.claude`). A plan default mode from server-managed settings or a macOS configuration profile is not overridden: those are an admin's deliberate policy, and are not read. `config check` shows the override as the launch adds it, and where the folder's settings decide, with when it applies.
88
88
 
89
+ - **prices** (optional): the price per model, in US dollars per million tokens of each kind, that the cost of a ship's tokens is estimated by in its report: `{ "claude-opus-5-5": { "input": 4, "output": 20, "cacheRead": 0.2, "cacheWrite": 8 } }`. It replaces a model's list price, which the trierarch carries for the current Claude and OpenAI models, or prices one it does not carry ([docs/trierarch.md](../../docs/trierarch.md#what-a-trierarch-reports)).
90
+
89
91
  `aeolus-trierarch init` writes caps, repositories, folders, and Claude Code's and Codex's flags, and detects each harness's models and effort levels into `detected.json` ([docs/trierarch.md](../../docs/trierarch.md#detected-options)). Options you write here replace the detected option of the same name whole, except `model`: model ids come from detection only, and a `model` here is ignored (#382). The example above narrows Claude Code's effort to two levels with a default, and takes the detected models as they are. Edit the file for options and `worktreeRoot`, then `aeolus-trierarch config check` and `aeolus-trierarch restart`.
90
92
 
91
93
  The trierarch finds the aeolus plugin in each offered harness's plugin cache (the newest version, looked up again at each use, so a plugin upgrade needs no service restart): Claude Code's under `~/.claude/plugins` (or `$CLAUDE_CONFIG_DIR/plugins`), Codex's under `~/.codex/plugins` (or `$CODEX_HOME/plugins`). Claude Code's settings and `.claude.json` follow `CLAUDE_CONFIG_DIR` the same way, as Claude Code's own do, and Codex's `config.toml` follows `CODEX_HOME`; init's summary names the files it wrote. Set `AEOLUS_PLUGIN_ROOT` and `AEOLUS_PLUGIN_DATA` (Claude Code), or `AEOLUS_CODEX_PLUGIN_ROOT` and `AEOLUS_CODEX_PLUGIN_DATA` (Codex), to point it elsewhere. `aeolus-trierarch install` carries these, `CLAUDE_CONFIG_DIR`, `CODEX_HOME`, `AEOLUS_TRIERARCH_CONFIG` and `PATH` into the service as they are set where it runs.
@@ -0,0 +1,14 @@
1
+ /** The lines a file gained since the last read, each written whole; `isFromStart` when the file was read from its start, as on the first read or after it shrank. */
2
+ export interface AppendedLines {
3
+ readonly lines: readonly string[];
4
+ readonly isFromStart: boolean;
5
+ }
6
+ /**
7
+ * Reads the lines a growing file appended since its last read (#353), so a
8
+ * transcript of many megabytes is not read whole every few minutes. A line
9
+ * not ended yet waits for the next read. A file that shrank is read again
10
+ * from its start.
11
+ */
12
+ export declare function createAppendedLines(): {
13
+ read(path: string): Promise<AppendedLines>;
14
+ };
@@ -0,0 +1,30 @@
1
+ import { open } from 'node:fs/promises';
2
+ /**
3
+ * Reads the lines a growing file appended since its last read (#353), so a
4
+ * transcript of many megabytes is not read whole every few minutes. A line
5
+ * not ended yet waits for the next read. A file that shrank is read again
6
+ * from its start.
7
+ */
8
+ export function createAppendedLines() {
9
+ const offsets = new Map();
10
+ return {
11
+ read: async (path) => {
12
+ const file = await open(path, 'r');
13
+ try {
14
+ const { size } = await file.stat();
15
+ const known = offsets.get(path) ?? 0;
16
+ const start = known > size ? 0 : known;
17
+ const buffer = Buffer.alloc(size - start);
18
+ await file.read(buffer, 0, buffer.length, start);
19
+ const end = buffer.lastIndexOf('\n');
20
+ offsets.set(path, start + end + 1);
21
+ const text = end < 0 ? '' : buffer.subarray(0, end).toString('utf8');
22
+ return { lines: text === '' ? [] : text.split('\n'), isFromStart: start === 0 };
23
+ }
24
+ finally {
25
+ await file.close();
26
+ }
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=appended-lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appended-lines.js","sourceRoot":"","sources":["../../src/adapters/appended-lines.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAQxC;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,OAAO;QACL,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACrC,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBACvC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;gBAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBACjD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;gBACnC,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACrE,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YAClF,CAAC;oBAAS,CAAC;gBACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { ShipId } from '@aeolus-fleet/common';
2
+ import type { ModelTokens, SubscriptionWindow } from '../core/ports.js';
3
+ import type { CommandResult } from './run-command.js';
4
+ export declare function createClaudeCodeUsage(deps: {
5
+ /** Claude Code's projects folder of the ship: the user's on the host, the ship's own home's in a container. */
6
+ projectsOf: (shipId: ShipId) => string;
7
+ /** When the ship's folder was made: what came before was another crew's. */
8
+ madeAt: (folder: string) => Promise<Date>;
9
+ run: (command: string, options: {
10
+ args: readonly string[];
11
+ cwd?: string;
12
+ timeoutMs?: number;
13
+ }) => Promise<CommandResult>;
14
+ /** A new empty folder to run the turn from, so no project's hooks or settings apply and it is never a ship; removed after. */
15
+ neutralFolder: () => Promise<string>;
16
+ program?: string;
17
+ }): {
18
+ tokensOf: (ship: {
19
+ shipId: ShipId;
20
+ folder: string;
21
+ }) => Promise<ModelTokens[]>;
22
+ subscription: () => Promise<SubscriptionWindow[] | undefined>;
23
+ };
@@ -0,0 +1,123 @@
1
+ import { readdir, rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { createAppendedLines } from './appended-lines.js';
5
+ import { CLAUDE_CODE_PROBE_TIMEOUT_MS } from './claude-code-detector.js';
6
+ /**
7
+ * What Claude Code says of its usage (#353). A ship's tokens come from the
8
+ * transcripts in its projects folder: its folder's conversations and their
9
+ * sub-agents', one line per content block, each line of a message carrying
10
+ * the message's whole usage, so each message counts once by its id. Its
11
+ * subscription comes from the rate limit event a print-mode turn streams,
12
+ * a short turn on the cheapest model, from an empty folder. Claude Code
13
+ * documents neither: the readers are tested on captured ones (test/logs).
14
+ */
15
+ const assistantLineSchema = z.object({
16
+ type: z.literal('assistant'),
17
+ timestamp: z.iso.datetime(),
18
+ message: z.object({
19
+ id: z.string(),
20
+ model: z.string(),
21
+ usage: z.object({ input_tokens: z.number(), output_tokens: z.number(), cache_read_input_tokens: z.number().optional(), cache_creation_input_tokens: z.number().optional() }),
22
+ }),
23
+ });
24
+ /** The model Claude Code names a message it made itself, such as an error, that no model answered. */
25
+ const SYNTHETIC_MODEL = '<synthetic>';
26
+ const rateLimitEventSchema = z.object({
27
+ type: z.literal('rate_limit_event'),
28
+ rate_limit_info: z.object({ unifiedWindows: z.record(z.string(), z.object({ utilization: z.number(), resetsAt: z.number() })) }),
29
+ });
30
+ /** Claude Code's windows by the name it gives them, in minutes. */
31
+ const WINDOW_MINUTES = { five_hour: 300, seven_day: 10_080 };
32
+ const PROBE_MODEL = 'haiku';
33
+ const PROBE_PROMPT = 'Reply OK';
34
+ const PERCENT = 100;
35
+ const MS_PER_SECOND = 1000;
36
+ /** A line's JSON; none for one that is not. */
37
+ function jsonOf(line) {
38
+ try {
39
+ return JSON.parse(line);
40
+ }
41
+ catch {
42
+ return undefined;
43
+ }
44
+ }
45
+ function plus(a, b) {
46
+ return a === undefined ? b : { input: a.input + b.input, output: a.output + b.output, cacheRead: a.cacheRead + b.cacheRead, cacheWrite: a.cacheWrite + b.cacheWrite };
47
+ }
48
+ /** The conversations Claude Code keeps of the folder: each `.jsonl` in its projects folder, and the sub-agents' of each. */
49
+ async function transcriptsIn(project) {
50
+ const entries = await readdir(project, { withFileTypes: true }).catch(() => []);
51
+ const own = entries.filter((entry) => entry.isFile() && entry.name.endsWith('.jsonl')).map((entry) => join(project, entry.name));
52
+ const subagents = await Promise.all(entries
53
+ .filter((entry) => entry.isDirectory())
54
+ .map(async (entry) => {
55
+ const folder = join(project, entry.name, 'subagents');
56
+ return (await readdir(folder).catch(() => [])).filter((name) => name.endsWith('.jsonl')).map((name) => join(folder, name));
57
+ }));
58
+ return [...own, ...subagents.flat()];
59
+ }
60
+ /** The windows a print-mode turn's stream says, from its last rate limit event; none when it says none. */
61
+ function windowsIn(stream) {
62
+ const events = stream
63
+ .split('\n')
64
+ .map((line) => rateLimitEventSchema.safeParse(jsonOf(line)))
65
+ .filter((event) => event.success);
66
+ const last = events.at(-1)?.data;
67
+ if (last === undefined) {
68
+ return undefined;
69
+ }
70
+ const windows = Object.entries(last.rate_limit_info.unifiedWindows).flatMap(([name, window]) => {
71
+ const minutes = WINDOW_MINUTES[name];
72
+ const usedPercent = Math.min(PERCENT, Math.max(0, Math.round(window.utilization * PERCENT * PERCENT) / PERCENT));
73
+ return minutes === undefined ? [] : [{ windowMinutes: minutes, usedPercent, resetsAt: new Date(window.resetsAt * MS_PER_SECOND) }];
74
+ });
75
+ return windows.length === 0 ? undefined : windows;
76
+ }
77
+ export function createClaudeCodeUsage(deps) {
78
+ const appended = createAppendedLines();
79
+ const transcripts = new Map();
80
+ const readTranscript = async (path, since) => {
81
+ const { lines, isFromStart } = await appended.read(path);
82
+ const totals = isFromStart ? { seen: new Set(), byModel: new Map() } : (transcripts.get(path) ?? { seen: new Set(), byModel: new Map() });
83
+ for (const line of lines) {
84
+ const parsed = assistantLineSchema.safeParse(jsonOf(line));
85
+ if (!parsed.success || parsed.data.message.model === SYNTHETIC_MODEL || totals.seen.has(parsed.data.message.id) || Date.parse(parsed.data.timestamp) < since.getTime()) {
86
+ continue;
87
+ }
88
+ const { id, model, usage } = parsed.data.message;
89
+ totals.seen.add(id);
90
+ totals.byModel.set(model, plus(totals.byModel.get(model), { input: usage.input_tokens, output: usage.output_tokens, cacheRead: usage.cache_read_input_tokens ?? 0, cacheWrite: usage.cache_creation_input_tokens ?? 0 }));
91
+ }
92
+ transcripts.set(path, totals);
93
+ return totals;
94
+ };
95
+ return {
96
+ tokensOf: async (ship) => {
97
+ const since = await deps.madeAt(ship.folder);
98
+ const project = join(deps.projectsOf(ship.shipId), ship.folder.replace(/[^a-zA-Z0-9]/gu, '-'));
99
+ const byModel = new Map();
100
+ for (const path of await transcriptsIn(project)) {
101
+ for (const [model, tokens] of (await readTranscript(path, since)).byModel) {
102
+ byModel.set(model, plus(byModel.get(model), tokens));
103
+ }
104
+ }
105
+ return [...byModel].sort(([a], [b]) => a.localeCompare(b)).map(([model, tokens]) => ({ model, tokens }));
106
+ },
107
+ subscription: async () => {
108
+ const folder = await deps.neutralFolder();
109
+ try {
110
+ const result = await deps.run(deps.program ?? 'claude', {
111
+ args: ['-p', '--model', PROBE_MODEL, '--max-turns', '1', '--output-format', 'stream-json', '--verbose', PROBE_PROMPT],
112
+ cwd: folder,
113
+ timeoutMs: CLAUDE_CODE_PROBE_TIMEOUT_MS,
114
+ });
115
+ return windowsIn(result.stdout);
116
+ }
117
+ finally {
118
+ await rm(folder, { recursive: true, force: true });
119
+ }
120
+ },
121
+ };
122
+ }
123
+ //# sourceMappingURL=claude-code-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-usage.js","sourceRoot":"","sources":["../../src/adapters/claude-code-usage.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import type { TrierarchConfiguration } from '@aeolus-fleet/common';
2
2
  import type { WorkspacePort } from '../core/ports.js';
3
+ import { type TrustedClones } from './trusted-clones.js';
3
4
  export declare function createCloneWorkspace(options: {
4
5
  configuration: TrierarchConfiguration;
5
6
  root: string;
7
+ clones?: TrustedClones;
6
8
  }): WorkspacePort;
@@ -2,6 +2,7 @@ import { mkdir, rm, stat } from 'node:fs/promises';
2
2
  import { join, relative, sep } from 'node:path';
3
3
  import { createGitWorkspace } from './git-workspace.js';
4
4
  import { runCommand } from './run-command.js';
5
+ import { clonedPath, cloneWhenMissing } from './trusted-clones.js';
5
6
  /**
6
7
  * Workspaces for sessions in containers (decision 0039; trierarch.md, "Session
7
8
  * runtime"): a per-ship clone of a configured repository in place of a
@@ -17,7 +18,7 @@ import { runCommand } from './run-command.js';
17
18
  */
18
19
  const REMOTE = 'origin';
19
20
  export function createCloneWorkspace(options) {
20
- const { configuration, root } = options;
21
+ const { configuration, root, clones } = options;
21
22
  const worktrees = createGitWorkspace(options);
22
23
  const git = async (args) => {
23
24
  const result = await runCommand('git', { args });
@@ -35,9 +36,13 @@ export function createCloneWorkspace(options) {
35
36
  return remote.status === 0 ? remote.stdout.trim() : (await git(['-C', repository, 'rev-parse', '--verify', `${ref}^{commit}`])).trim();
36
37
  };
37
38
  const exists = async (path) => (await stat(path).catch(() => undefined)) !== undefined;
38
- const isUnderRoot = (folder) => {
39
+ const isUnderRoot = async (folder) => {
39
40
  const [repository, ship, ...rest] = relative(root, folder).split(sep);
40
- return repository !== undefined && ship !== undefined && rest.length === 0 && configuration.repositories[repository] !== undefined && ship !== '' && ship !== '..';
41
+ if (repository === undefined || ship === undefined || rest.length > 0 || ship === '' || ship === '..') {
42
+ return false;
43
+ }
44
+ // A clone whose repository left the trusted repositories is still one the trierarch made.
45
+ return configuration.repositories[repository] !== undefined || (await clonedPath(clones, repository)) !== undefined;
41
46
  };
42
47
  return {
43
48
  ...worktrees,
@@ -50,6 +55,7 @@ export function createCloneWorkspace(options) {
50
55
  if (repository === undefined) {
51
56
  throw new Error(`The configuration has no repository ${workspace.repository}`);
52
57
  }
58
+ await cloneWhenMissing(clones, { repository: workspace.repository, path: repository });
53
59
  const folder = join(root, workspace.repository, shipName);
54
60
  // A clone a stop mid-crew left is used as it is.
55
61
  if (!(await exists(folder))) {
@@ -69,7 +75,7 @@ export function createCloneWorkspace(options) {
69
75
  return { folder };
70
76
  },
71
77
  remove: async (folder) => {
72
- if (!isUnderRoot(folder)) {
78
+ if (!(await isUnderRoot(folder))) {
73
79
  throw new Error(`${folder} is no clone under ${root}: the trierarch removes only what it made`);
74
80
  }
75
81
  await rm(folder, { recursive: true, force: true });
@@ -1 +1 @@
1
- {"version":3,"file":"clone-workspace.js","sourceRoot":"","sources":["../../src/adapters/clone-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAKhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,GAAG,QAAQ,CAAC;AACxB,MAAM,UAAU,oBAAoB,CAAC,OAAgE;IACnG,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IACxC,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,KAAK,EAAE,IAAuB,EAAmB,EAAE;QAC7D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC,CAAC;IACF,2HAA2H;IAC3H,MAAM,OAAO,GAAG,KAAK,EAAE,UAAkB,EAAE,GAAuB,EAAmB,EAAE;QACrF,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1F,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QACnJ,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzI,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,SAAS,CAAC;IACjH,MAAM,WAAW,GAAG,CAAC,MAAc,EAAW,EAAE;QAC9C,MAAM,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACtE,OAAO,UAAU,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC;IACrK,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,SAAS;QACZ,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzB,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;YACxC,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAChC,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,MAAM,UAAU,GAAG,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;YAC1E,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC1D,iDAAiD;YACjD,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnE,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAClF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;gBACxD,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChH,oGAAoG;gBACpG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;gBACtD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAClG,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;oBACzE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,MAAM,mBAAmB,MAAM,IAAI,CAAC,CAAC,CAAC;gBAC/H,CAAC;gBACD,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACvE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACvB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,sBAAsB,IAAI,2CAA2C,CAAC,CAAC;YAClG,CAAC;YACD,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"clone-workspace.js","sourceRoot":"","sources":["../../src/adapters/clone-workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { ShipId } from '@aeolus-fleet/common';
2
+ import type { ModelTokens, SubscriptionWindow } from '../core/ports.js';
3
+ export declare function createCodexUsage(deps: {
4
+ /** Codex's sessions folder: `sessions` in CODEX_HOME, or in `~/.codex`. */
5
+ sessions: string;
6
+ /** When the ship's folder was made: what came before was another crew's. */
7
+ madeAt: (folder: string) => Promise<Date>;
8
+ }): {
9
+ tokensOf: (ship: {
10
+ shipId: ShipId;
11
+ folder: string;
12
+ }) => Promise<ModelTokens[]>;
13
+ subscription: () => Promise<SubscriptionWindow[] | undefined>;
14
+ };
@@ -0,0 +1,119 @@
1
+ import { readdir, readFile, stat } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { createAppendedLines } from './appended-lines.js';
5
+ /**
6
+ * What Codex says of its usage (#353), from its session logs (rollout files
7
+ * under `sessions/<year>/<month>/<day>/`). A session log starts with the
8
+ * folder it ran in; each turn names its model, and each token count the
9
+ * session's total so far, so a turn's tokens are what the total grew by since
10
+ * the count before. Codex's input counts what it read from the cache: the
11
+ * input here is without it. Each token count also says how much of the
12
+ * subscription's windows is used: the newest log's last one is read. Codex
13
+ * documents no format for them: the reader is tested on a captured one (test/logs).
14
+ */
15
+ const metaSchema = z.object({ type: z.literal('session_meta'), payload: z.object({ timestamp: z.iso.datetime(), cwd: z.string() }) });
16
+ const turnSchema = z.object({ type: z.literal('turn_context'), payload: z.object({ model: z.string() }) });
17
+ const totalSchema = z.object({ input_tokens: z.number(), cached_input_tokens: z.number().optional(), cache_write_input_tokens: z.number().optional(), output_tokens: z.number() });
18
+ const tokenCountSchema = z.object({
19
+ type: z.literal('event_msg'),
20
+ payload: z.object({ type: z.literal('token_count'), info: z.object({ total_token_usage: totalSchema }).nullable().optional() }),
21
+ });
22
+ const windowSchema = z.object({ used_percent: z.number(), window_minutes: z.number(), resets_at: z.number() });
23
+ const rateLimitsSchema = z.object({
24
+ type: z.literal('event_msg'),
25
+ payload: z.object({ type: z.literal('token_count'), rate_limits: z.object({ primary: windowSchema.nullable().optional(), secondary: windowSchema.nullable().optional() }) }),
26
+ });
27
+ const PERCENT = 100;
28
+ const MS_PER_SECOND = 1000;
29
+ /** How many of the newest session logs are searched for the subscription's windows. */
30
+ const NEWEST_LOGS_SEARCHED = 10;
31
+ const NONE = { input_tokens: 0, cached_input_tokens: 0, cache_write_input_tokens: 0, output_tokens: 0 };
32
+ function jsonOf(line) {
33
+ try {
34
+ return JSON.parse(line);
35
+ }
36
+ catch {
37
+ return undefined;
38
+ }
39
+ }
40
+ function plus(a, b) {
41
+ return a === undefined ? b : { input: a.input + b.input, output: a.output + b.output, cacheRead: a.cacheRead + b.cacheRead, cacheWrite: a.cacheWrite + b.cacheWrite };
42
+ }
43
+ /** What the session's total grew by, input without what was read from or written to the cache. */
44
+ function grownBy(now, before) {
45
+ const cacheRead = (now.cached_input_tokens ?? 0) - (before.cached_input_tokens ?? 0);
46
+ const cacheWrite = (now.cache_write_input_tokens ?? 0) - (before.cache_write_input_tokens ?? 0);
47
+ return { input: Math.max(0, now.input_tokens - before.input_tokens - cacheRead - cacheWrite), output: now.output_tokens - before.output_tokens, cacheRead, cacheWrite };
48
+ }
49
+ function read(log, line) {
50
+ const json = jsonOf(line);
51
+ const meta = metaSchema.safeParse(json);
52
+ if (meta.success) {
53
+ log.folder = meta.data.payload.cwd;
54
+ log.startedAt = Date.parse(meta.data.payload.timestamp);
55
+ return;
56
+ }
57
+ const turn = turnSchema.safeParse(json);
58
+ if (turn.success) {
59
+ log.model = turn.data.payload.model;
60
+ return;
61
+ }
62
+ const total = tokenCountSchema.safeParse(json).data?.payload.info?.total_token_usage;
63
+ if (total !== undefined && log.model !== undefined) {
64
+ log.byModel.set(log.model, plus(log.byModel.get(log.model), grownBy(total, log.total)));
65
+ log.total = total;
66
+ }
67
+ }
68
+ export function createCodexUsage(deps) {
69
+ const appended = createAppendedLines();
70
+ const logs = new Map();
71
+ /** Every session log, oldest first, as their names start with when they started. */
72
+ const sessionLogs = async () => {
73
+ const names = await readdir(deps.sessions, { recursive: true }).catch(() => []);
74
+ return names
75
+ .filter((name) => /(^|\/)rollout-[^/]*\.jsonl$/u.test(name))
76
+ .map((name) => join(deps.sessions, name))
77
+ .sort((a, b) => a.localeCompare(b));
78
+ };
79
+ return {
80
+ tokensOf: async (ship) => {
81
+ const since = (await deps.madeAt(ship.folder)).getTime();
82
+ const byModel = new Map();
83
+ for (const path of await sessionLogs()) {
84
+ // A log not written since the folder was made is another crew's: never read.
85
+ if ((await stat(path)).mtimeMs < since) {
86
+ continue;
87
+ }
88
+ const { lines, isFromStart } = await appended.read(path);
89
+ const log = (isFromStart ? undefined : logs.get(path)) ?? { total: NONE, byModel: new Map() };
90
+ lines.forEach((line) => {
91
+ read(log, line);
92
+ });
93
+ logs.set(path, log);
94
+ if (log.folder === ship.folder && (log.startedAt ?? 0) >= since) {
95
+ for (const [model, tokens] of log.byModel) {
96
+ byModel.set(model, plus(byModel.get(model), tokens));
97
+ }
98
+ }
99
+ }
100
+ return [...byModel].sort(([a], [b]) => a.localeCompare(b)).map(([model, tokens]) => ({ model, tokens }));
101
+ },
102
+ subscription: async () => {
103
+ for (const path of (await sessionLogs()).slice(-NEWEST_LOGS_SEARCHED).reverse()) {
104
+ const last = (await readFile(path, 'utf8'))
105
+ .split('\n')
106
+ .map((line) => rateLimitsSchema.safeParse(jsonOf(line)).data?.payload.rate_limits)
107
+ .filter((limits) => limits !== undefined)
108
+ .at(-1);
109
+ if (last !== undefined) {
110
+ return [last.primary, last.secondary]
111
+ .filter((window) => window !== undefined && window !== null)
112
+ .map((window) => ({ windowMinutes: window.window_minutes, usedPercent: Math.min(PERCENT, Math.max(0, window.used_percent)), resetsAt: new Date(window.resets_at * MS_PER_SECOND) }));
113
+ }
114
+ }
115
+ return undefined;
116
+ },
117
+ };
118
+ }
119
+ //# sourceMappingURL=codex-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-usage.js","sourceRoot":"","sources":["../../src/adapters/codex-usage.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type VersionFetch } from '@aeolus-fleet/common';
2
2
  /** The oldest core the trierarch runs against (decision 0049, docs/compatibility.md). */
3
- export declare const MINIMUM_CORE_VERSION = "0.28.0";
3
+ export declare const MINIMUM_CORE_VERSION = "0.31.0";
4
4
  /** Stops the start when the fleet's core is older than the trierarch needs, or does not say its version. */
5
5
  export declare function requireCoreVersion(fleetUrl: string, fetch?: VersionFetch): Promise<void>;
@@ -1,7 +1,7 @@
1
1
  import { coreVersionRefusal } from '@aeolus-fleet/common';
2
2
  import { runningVersion } from './version.js';
3
3
  /** The oldest core the trierarch runs against (decision 0049, docs/compatibility.md). */
4
- export const MINIMUM_CORE_VERSION = '0.28.0';
4
+ export const MINIMUM_CORE_VERSION = '0.31.0';
5
5
  /** Stops the start when the fleet's core is older than the trierarch needs, or does not say its version. */
6
6
  export async function requireCoreVersion(fleetUrl, fetch = globalThis.fetch) {
7
7
  const refusal = await coreVersionRefusal({ packageName: 'trierarch', version: runningVersion(), minimum: MINIMUM_CORE_VERSION, fleetUrl, fetch });
@@ -1,18 +1,5 @@
1
1
  import { type ShipId } from '@aeolus-fleet/common';
2
2
  import { z } from 'zod';
3
- /**
4
- * The trierarch's own files: its configuration, written by the operator, and
5
- * its crew file, written by `init`: the fleet's URL and the trierarch's own
6
- * crew token, readable by its user only.
7
- */
8
- /**
9
- * The configuration as common states it, with each repository's read-only
10
- * checkouts (#1182): the configured repositories a session in that repository
11
- * gets beside its working folder, at the latest main. They are named, never a
12
- * path, so only a repository the machine already trusts is checked out. Kept
13
- * here rather than in common: only the trierarch reads its configuration, and
14
- * a crew request never names them.
15
- */
16
3
  export declare const trierarchConfigurationSchema: z.ZodObject<{
17
4
  $schema: z.ZodOptional<z.ZodString>;
18
5
  worktreeRoot: z.ZodOptional<z.ZodString>;
@@ -42,6 +29,12 @@ export declare const trierarchConfigurationSchema: z.ZodObject<{
42
29
  path: z.ZodString;
43
30
  checkouts: z.ZodOptional<z.ZodArray<z.ZodString>>;
44
31
  }, z.core.$strict>>;
32
+ prices: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
33
+ input: z.ZodNumber;
34
+ output: z.ZodNumber;
35
+ cacheRead: z.ZodNumber;
36
+ cacheWrite: z.ZodNumber;
37
+ }, z.core.$strict>>>;
45
38
  }, z.core.$strict>;
46
39
  export type TrierarchConfiguration = z.infer<typeof trierarchConfigurationSchema>;
47
40
  /** A file the trierarch cannot use, with why, for the operator to read. */
@@ -58,6 +51,8 @@ export declare function loadConfiguration(path: string): Promise<TrierarchConfig
58
51
  export interface CrewFile {
59
52
  readonly fleetUrl: string;
60
53
  readonly shipId?: ShipId;
54
+ /** The trierarch plugin's ship, the one ship the trusted repositories are taken from (aeolus-fleet#384); none on a machine set up before. */
55
+ readonly pluginShipId?: ShipId;
61
56
  readonly crewToken: string;
62
57
  }
63
58
  export declare function writeCrewFile(path: string, crew: CrewFile & {
@@ -13,10 +13,16 @@ import { z } from 'zod';
13
13
  * gets beside its working folder, at the latest main. They are named, never a
14
14
  * path, so only a repository the machine already trusts is checked out. Kept
15
15
  * here rather than in common: only the trierarch reads its configuration, and
16
- * a crew request never names them.
16
+ * a crew request never names them. With them, the price table the cost of a
17
+ * ship's tokens is estimated by (#353): per model, in US dollars per million
18
+ * tokens of each kind, in place of its list price or for a model with none.
17
19
  */
20
+ const priceSchema = z.number().nonnegative();
18
21
  export const trierarchConfigurationSchema = commonConfigurationSchema
19
- .extend({ repositories: z.record(trierarchNameSchema, z.strictObject({ path: z.string().min(1), checkouts: z.array(trierarchNameSchema).optional() })) })
22
+ .extend({
23
+ repositories: z.record(trierarchNameSchema, z.strictObject({ path: z.string().min(1), checkouts: z.array(trierarchNameSchema).optional() })),
24
+ prices: z.record(z.string().min(1), z.strictObject({ input: priceSchema, output: priceSchema, cacheRead: priceSchema, cacheWrite: priceSchema })).optional(),
25
+ })
20
26
  .superRefine((configuration, context) => {
21
27
  for (const [repository, { checkouts = [] }] of Object.entries(configuration.repositories)) {
22
28
  checkouts.forEach((checkout, index) => {
@@ -73,7 +79,8 @@ export async function loadConfiguration(path) {
73
79
  }
74
80
  export async function writeCrewFile(path, crew) {
75
81
  await mkdir(dirname(path), { recursive: true, mode: 0o700 });
76
- await writeFile(path, `fleetUrl=${crew.fleetUrl}\nshipId=${crew.shipId}\ncrewToken=${crew.crewToken}\n`, { mode: 0o600 });
82
+ const plugin = crew.pluginShipId === undefined ? '' : `pluginShipId=${crew.pluginShipId}\n`;
83
+ await writeFile(path, `fleetUrl=${crew.fleetUrl}\nshipId=${crew.shipId}\n${plugin}crewToken=${crew.crewToken}\n`, { mode: 0o600 });
77
84
  await chmod(path, 0o600);
78
85
  }
79
86
  export async function readCrewFile(path) {
@@ -91,7 +98,8 @@ export async function readCrewFile(path) {
91
98
  throw new TrierarchFileError(`The crew file at ${path} lacks its fleetUrl or crewToken line: run aeolus-trierarch init again`);
92
99
  }
93
100
  const shipId = idSchema('ship').safeParse(field('shipId'));
94
- return { fleetUrl, ...(shipId.success && { shipId: shipId.data }), crewToken };
101
+ const pluginShipId = idSchema('ship').safeParse(field('pluginShipId'));
102
+ return { fleetUrl, ...(shipId.success && { shipId: shipId.data }), ...(pluginShipId.success && { pluginShipId: pluginShipId.data }), crewToken };
95
103
  }
96
104
  const runningFileSchema = z.object({ pid: z.int().positive(), version: z.string() });
97
105
  /** Written by `run` as it starts: an upgrade replaces the installed files, so only the process itself knows the version it runs. */
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/adapters/files.ts"],"names":[],"mappings":"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"}
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;;;;GAIG;AAEH;;;;;;;;;GASG;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC;AAE7C,MAAM,CAAC,MAAM,4BAA4B,GAAG,yBAAyB;KAClE,MAAM,CAAC;IACN,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC5I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC7J,CAAC;KACD,WAAW,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE;IACtC,KAAK,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1F,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;YACpC,MAAM,IAAI,GAAG,CAAC,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAC9D,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,yDAAyD,EAAE,CAAC,CAAC;YAC5H,CAAC;iBAAM,IAAI,CAAC,CAAC,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrD,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,yCAAyC,EAAE,CAAC,CAAC;YAC5G,CAAC;iBAAM,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;gBACjD,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,iBAAiB,EAAE,CAAC,CAAC;YACpF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAGL,2EAA2E;AAC3E,MAAM,OAAO,kBAAmB,SAAQ,KAAK;CAAG;AAEhD,4IAA4I;AAC5I,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,OAAO,EAAE,sBAAsB;QAC/B,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QAC9B,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE;KACzD,CAAC;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,uBAAuB;IACrC,OAAO,CAAC,CAAC,YAAY,CAAC,4BAA4B,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,uBAAuB,IAAI,mCAAmC,CAAC,CAAC;IAC/F,CAAC;IACD,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,IAAI,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrI,CAAC;IACD,MAAM,MAAM,GAAG,4BAA4B,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,kBAAkB,CAAC,wBAAwB,IAAI,mBAAmB,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,IAAmC;IACnF,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,YAAY,IAAI,CAAC;IAC5F,MAAM,SAAS,CAAC,IAAI,EAAE,YAAY,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,MAAM,KAAK,MAAM,aAAa,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnI,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,oBAAoB,IAAI,mCAAmC,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAsB,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtG,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,IAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACtD,MAAM,IAAI,kBAAkB,CAAC,oBAAoB,IAAI,wEAAwE,CAAC,CAAC;IACjI,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IACvE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,OAAO,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC;AACnJ,CAAC;AAQD,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAErF,oIAAoI;AACpI,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAoB;IACvE,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}