@aeolus-fleet/trierarch 0.22.0 → 0.24.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 (64) hide show
  1. package/README.md +3 -3
  2. package/dist/adapters/capped-log.d.ts +23 -0
  3. package/dist/adapters/capped-log.js +74 -0
  4. package/dist/adapters/capped-log.js.map +1 -0
  5. package/dist/adapters/claude-code-screen.d.ts +1 -5
  6. package/dist/adapters/claude-code-screen.js +8 -13
  7. package/dist/adapters/claude-code-screen.js.map +1 -1
  8. package/dist/adapters/claude-code.d.ts +2 -0
  9. package/dist/adapters/claude-code.js +22 -4
  10. package/dist/adapters/claude-code.js.map +1 -1
  11. package/dist/adapters/codex-plugin-data.d.ts +11 -0
  12. package/dist/adapters/codex-plugin-data.js +44 -0
  13. package/dist/adapters/codex-plugin-data.js.map +1 -0
  14. package/dist/adapters/codex-screen.d.ts +1 -7
  15. package/dist/adapters/codex-screen.js +9 -13
  16. package/dist/adapters/codex-screen.js.map +1 -1
  17. package/dist/adapters/codex-session-log.d.ts +8 -0
  18. package/dist/adapters/codex-session-log.js +45 -0
  19. package/dist/adapters/codex-session-log.js.map +1 -0
  20. package/dist/adapters/codex.js +33 -5
  21. package/dist/adapters/codex.js.map +1 -1
  22. package/dist/adapters/json-state.js +2 -0
  23. package/dist/adapters/json-state.js.map +1 -1
  24. package/dist/adapters/launch-marker.d.ts +33 -0
  25. package/dist/adapters/launch-marker.js +39 -0
  26. package/dist/adapters/launch-marker.js.map +1 -0
  27. package/dist/adapters/launch-screen.d.ts +7 -17
  28. package/dist/adapters/launch-screen.js +3 -18
  29. package/dist/adapters/launch-screen.js.map +1 -1
  30. package/dist/adapters/plugin-identity.d.ts +15 -2
  31. package/dist/adapters/plugin-identity.js +8 -2
  32. package/dist/adapters/plugin-identity.js.map +1 -1
  33. package/dist/adapters/plugin-update.d.ts +41 -0
  34. package/dist/adapters/plugin-update.js +141 -0
  35. package/dist/adapters/plugin-update.js.map +1 -0
  36. package/dist/adapters/plugin.d.ts +8 -1
  37. package/dist/adapters/plugin.js +14 -6
  38. package/dist/adapters/plugin.js.map +1 -1
  39. package/dist/adapters/running-processes.d.ts +10 -0
  40. package/dist/adapters/running-processes.js +28 -0
  41. package/dist/adapters/running-processes.js.map +1 -0
  42. package/dist/adapters/tmux.d.ts +2 -1
  43. package/dist/adapters/tmux.js +3 -2
  44. package/dist/adapters/tmux.js.map +1 -1
  45. package/dist/cli/main.js +27 -9
  46. package/dist/cli/main.js.map +1 -1
  47. package/dist/cli/run.js +2 -1
  48. package/dist/cli/run.js.map +1 -1
  49. package/dist/cli/upgrade.d.ts +34 -1
  50. package/dist/cli/upgrade.js +105 -6
  51. package/dist/cli/upgrade.js.map +1 -1
  52. package/dist/core/check-settings.d.ts +10 -0
  53. package/dist/core/check-settings.js +9 -1
  54. package/dist/core/check-settings.js.map +1 -1
  55. package/dist/core/entry.d.ts +4 -0
  56. package/dist/core/entry.js.map +1 -1
  57. package/dist/core/ports.d.ts +12 -12
  58. package/dist/core/reconciler.d.ts +8 -7
  59. package/dist/core/reconciler.js +39 -30
  60. package/dist/core/reconciler.js.map +1 -1
  61. package/dist/core/run-pass.d.ts +2 -0
  62. package/dist/core/run-pass.js +40 -25
  63. package/dist/core/run-pass.js.map +1 -1
  64. package/package.json +11 -4
package/README.md CHANGED
@@ -27,7 +27,7 @@ That gives the command `aeolus-trierarch`.
27
27
  - the folders it may crew a ship in as they are, by name and path. It trusts each one, so a session there starts with no trust question;
28
28
  - the caps: how many ships it takes, how many sessions run at once.
29
29
 
30
- It writes `~/.aeolus/trierarch/config.json`, with `config.schema.json` beside it so an editor checks it. When the configuration offers Codex, it answers Codex's one-time questions ahead too, through `codex app-server` as Codex's own dialogs do: it trusts each configured repository and folder in `~/.codex/config.toml` (a repository covers its worktrees), and trusts the aeolus plugin's hooks, without which a Codex session marks no turn and is never woken. A plugin update can change the hooks: the trierarch trusts the new or changed ones again before every Codex launch. When the configuration offers Claude Code, it answers Claude Code's one-time questions ahead, so a session nobody watches never waits on one, and otherwise leaves Claude Code's files alone: it trusts the worktree root in `~/.claude.json`, each configured repository and each configured folder (on every run, so a place added since is trusted too), completes Claude Code's onboarding there without asking (each launch completes it again), and, when the sessions skip permissions, offers to accept bypass permissions mode in `~/.claude/settings.json`. Then it offers to install and start the service: a launchd agent on macOS (`~/Library/LaunchAgents/dev.aeolus-fleet.trierarch.plist`), a systemd user unit on Linux (`aeolus-trierarch.service`), started at login and again whenever it stops.
30
+ It writes `~/.aeolus/trierarch/config.json`, with `config.schema.json` beside it so an editor checks it. When the configuration offers Codex, it answers Codex's one-time questions ahead too, through `codex app-server` as Codex's own dialogs do: it trusts each configured repository and folder in `~/.codex/config.toml` (a repository covers its worktrees), and trusts the aeolus plugin's hooks, without which a Codex session marks no turn and is never woken. A plugin update can change the hooks: `aeolus-trierarch upgrade` trusts the new or changed ones, and the trierarch trusts them again before every Codex launch. When the configuration offers Claude Code, it answers Claude Code's one-time questions ahead, so a session nobody watches never waits on one, and otherwise leaves Claude Code's files alone: it trusts the worktree root in `~/.claude.json`, each configured repository and each configured folder (on every run, so a place added since is trusted too), completes Claude Code's onboarding there without asking (each launch completes it again), and, when the sessions skip permissions, offers to accept bypass permissions mode in `~/.claude/settings.json`. Then it offers to install and start the service: a launchd agent on macOS (`~/Library/LaunchAgents/dev.aeolus-fleet.trierarch.plist`), a systemd user unit on Linux (`aeolus-trierarch.service`), started at login and again whenever it stops.
31
31
 
32
32
  Without a terminal, pass everything as flags and take every default with `--yes`: `aeolus-trierarch init --fleet-url https://fleet.example.com --ship-id shp_... --secret aeolus_sk_v1_... --yes`. Prefer the prompt: a secret in a flag lands in your shell history.
33
33
 
@@ -39,12 +39,12 @@ That gives the command `aeolus-trierarch`.
39
39
  | --- | --- |
40
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 |
41
41
  | `aeolus-trierarch list` | The ships it crews: ship, state, harness, workspace, since, restarts |
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; 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 |
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 |
44
44
  | `aeolus-trierarch config check` | Checks the configuration and gives the flags each harness launches with, and each option value's flags. Then the command each harness launches on a first start and on a restart, with each flag marked `(configuration)` or `(adapter)` when the adapter adds it itself (`--no-daemon` for Codex, `--continue` on a Claude Code restart, the remote-control session name, `--permission-mode manual` (or `default`) where Claude Code's settings make plan the default mode, with when it applies where the folder's settings decide) |
45
45
  | `aeolus-trierarch detect` | Detects again what each configured harness offers (its models, and effort where its CLI has a flag for it) and keeps it in `~/.aeolus/trierarch/detected.json`, then gives per harness its version, each option's values and when its models were last confirmed. Restart the trierarch so it reads them ([docs/trierarch.md](../../docs/trierarch.md#detected-options)) |
46
46
  | `aeolus-trierarch start`, `stop`, `restart` | The service. `stop` returns once the trierarch has exited; a stopped one starts again at the next login. `start` and `restart` return once the new process says its version (at most 30 seconds). Restart it after you change the configuration |
47
- | `aeolus-trierarch upgrade [version]` | Installs the given version, or the latest on npm, globally and pinned to it. Then the version it installs rewrites the service's file as its `init` does, and it stops the old process and starts the new one, waits until the new one says its version (at most 30 seconds), and shows `status`. Sessions keep running: the new process takes them over. If the install fails, the old version keeps running. Where npm's global folder is not yours to write (a system Node install), it installs nothing and says what to run instead: `sudo npm install --global @aeolus-fleet/trierarch@<version>`, then `aeolus-trierarch install` when the service is installed. It never upgrades on its own |
47
+ | `aeolus-trierarch upgrade [version]` | Installs the given version, or the latest on npm, globally and pinned to it. Then the version it installs rewrites the service's file as its `init` does, and it stops the old process and starts the new one, waits until the new one says its version (at most 30 seconds), and shows `status`. Sessions keep running: the new process takes them over. If the install fails, the old version keeps running. Where npm's global folder is not yours to write (a system Node install), it installs nothing and says what to run instead: `sudo npm install --global @aeolus-fleet/trierarch@<version>`, then `aeolus-trierarch upgrade <version>` when the configuration offers a harness, which updates the aeolus plugin, then `aeolus-trierarch install` when the service is installed. It also updates the aeolus plugin for each harness the configuration offers to the plugin of the version it upgrades to, from that release's tag (from main for releases up to 0.22.0), even when the trierarch is on its version already, before the restart. After the install, the version it installed runs that step, as its own `upgrade <version>`, so one run ends with the plugin step of the version it upgrades to: Codex's version folders that running Codex sessions use stay beside the new one, and those none uses any more are removed, and the plugin's new or changed Codex hooks are trusted. A plugin that could not be updated is said, and upgrade exits 1. On a trierarch machine this is the only supported way to update the plugin: not `codex plugin marketplace upgrade`, nor Claude Code's own update. A trierarch up to 0.22.0 has no plugin step: upgrading from it, run upgrade once more with the new version. It never upgrades on its own |
48
48
  | `aeolus-trierarch install [--no-load]` | Installs the service; over a running one it waits for the old process to exit, then loads it again, and returns once the new process says its version (at most 30 seconds). With `--no-load` it only writes its file |
49
49
  | `aeolus-trierarch uninstall` | Removes the service and stops every session. It deletes nothing else: it lists the worktrees it leaves, and keeps its own files under `~/.aeolus/trierarch/` |
50
50
  | `aeolus-trierarch run` | What the service runs: keeps the ships assigned to it crewed until stopped |
@@ -0,0 +1,23 @@
1
+ import type { LogStream } from './log.js';
2
+ /**
3
+ * The trierarch's log file capped, by the rule the aeolus plugin's log follows
4
+ * (plugins/aeolus/README.md, "The log"): before a record, a log that reached
5
+ * 1 MiB moves aside as `trierarch.log.1`, replacing an older one, and the
6
+ * record starts a new log. On macOS launchd writes the log: it opened the file
7
+ * for appending as the trierarch's stdout and stderr and keeps it open, so a
8
+ * renamed log would take its writes along. The log moves aside as a copy, and
9
+ * the file launchd holds is emptied: appending, its next write starts the new
10
+ * log. The records are written synchronously, so none falls between the copy
11
+ * and the emptying. On Linux the journal caps the log itself.
12
+ */
13
+ /** The log's size limit in bytes: the trierarch keeps at most about twice it. */
14
+ export declare const LOG_MAX_BYTES: number;
15
+ /** A stream that writes each record to the log through `stream`, moving the log aside first once it is full. A log it cannot move aside is written on. */
16
+ export declare function cappedLogStream(at: {
17
+ file: string;
18
+ stream: LogStream;
19
+ now: () => Date;
20
+ maxBytes?: number;
21
+ }): LogStream;
22
+ /** Whether a file descriptor is open on the log file, as the trierarch's stdout is under launchd. */
23
+ export declare function isWritingTo(descriptor: number, file: string): boolean;
@@ -0,0 +1,74 @@
1
+ import { copyFileSync, fstatSync, mkdirSync, rmdirSync, statSync, truncateSync } from 'node:fs';
2
+ /**
3
+ * The trierarch's log file capped, by the rule the aeolus plugin's log follows
4
+ * (plugins/aeolus/README.md, "The log"): before a record, a log that reached
5
+ * 1 MiB moves aside as `trierarch.log.1`, replacing an older one, and the
6
+ * record starts a new log. On macOS launchd writes the log: it opened the file
7
+ * for appending as the trierarch's stdout and stderr and keeps it open, so a
8
+ * renamed log would take its writes along. The log moves aside as a copy, and
9
+ * the file launchd holds is emptied: appending, its next write starts the new
10
+ * log. The records are written synchronously, so none falls between the copy
11
+ * and the emptying. On Linux the journal caps the log itself.
12
+ */
13
+ /** The log's size limit in bytes: the trierarch keeps at most about twice it. */
14
+ export const LOG_MAX_BYTES = 1024 * 1024;
15
+ /** A lock older than this was left by a writer stopped while moving the log aside. */
16
+ const STALE_LOCK_MS = 60 * 1000;
17
+ const sizeOf = (file) => statSync(file, { throwIfNoEntry: false })?.size ?? 0;
18
+ /**
19
+ * Moves the log aside once it reached its limit. One writer moves it: another
20
+ * finding the lock taken appends on, and the one holding the lock looks at the
21
+ * size again, so a log just moved aside by another is not moved twice.
22
+ */
23
+ function moveAsideWhenFull(at) {
24
+ const { file, maxBytes, now } = at;
25
+ if (sizeOf(file) < maxBytes) {
26
+ return;
27
+ }
28
+ const lock = `${file}.lock`;
29
+ const taken = statSync(lock, { throwIfNoEntry: false });
30
+ if (taken !== undefined && now().getTime() - taken.mtimeMs > STALE_LOCK_MS) {
31
+ rmdirSync(lock);
32
+ }
33
+ try {
34
+ mkdirSync(lock);
35
+ }
36
+ catch {
37
+ return;
38
+ }
39
+ try {
40
+ if (sizeOf(file) >= maxBytes) {
41
+ copyFileSync(file, `${file}.1`);
42
+ truncateSync(file, 0);
43
+ }
44
+ }
45
+ finally {
46
+ rmdirSync(lock);
47
+ }
48
+ }
49
+ /** A stream that writes each record to the log through `stream`, moving the log aside first once it is full. A log it cannot move aside is written on. */
50
+ export function cappedLogStream(at) {
51
+ const { file, stream, now, maxBytes = LOG_MAX_BYTES } = at;
52
+ return {
53
+ isTerminal: stream.isTerminal,
54
+ write: (text) => {
55
+ try {
56
+ moveAsideWhenFull({ file, maxBytes, now });
57
+ }
58
+ catch {
59
+ // A full disk or a changed permission must not stop the trierarch: the record is written all the same.
60
+ }
61
+ stream.write(text);
62
+ },
63
+ };
64
+ }
65
+ /** Whether a file descriptor is open on the log file, as the trierarch's stdout is under launchd. */
66
+ export function isWritingTo(descriptor, file) {
67
+ const log = statSync(file, { throwIfNoEntry: false });
68
+ if (log === undefined) {
69
+ return false;
70
+ }
71
+ const open = fstatSync(descriptor);
72
+ return open.dev === log.dev && open.ino === log.ino;
73
+ }
74
+ //# sourceMappingURL=capped-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capped-log.js","sourceRoot":"","sources":["../../src/adapters/capped-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAIhG;;;;;;;;;;GAUG;AAEH,iFAAiF;AACjF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,sFAAsF;AACtF,MAAM,aAAa,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhC,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;AAE9F;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,EAAuD;IAChF,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,IAAI,OAAO,CAAC;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,KAAK,KAAK,SAAS,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,aAAa,EAAE,CAAC;QAC3E,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;YAChC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,0JAA0J;AAC1J,MAAM,UAAU,eAAe,CAAC,EAA2E;IACzG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,aAAa,EAAE,GAAG,EAAE,CAAC;IAC3D,OAAO;QACL,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YACd,IAAI,CAAC;gBACH,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,uGAAuG;YACzG,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,WAAW,CAAC,UAAkB,EAAE,IAAY;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IACtD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACnC,OAAO,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC;AACtD,CAAC"}
@@ -1,5 +1 @@
1
- import type { LaunchSeen } from '../core/ports.js';
2
- export declare function claudeCodeLaunchSeen(at: {
3
- screen: string;
4
- model?: string;
5
- }): LaunchSeen;
1
+ export declare function claudeCodeScreenStoppedAt(screen: string): string | undefined;
@@ -1,17 +1,12 @@
1
- import { launchSeenWith } from './launch-screen.js';
1
+ import { screenStoppedAt } from './launch-screen.js';
2
2
  /**
3
- * Claude Code's screen in a session's launch window (#382), as Claude Code
4
- * 2.1.295 writes it: the one place its texts are matched, tested on screens
5
- * captured from real sessions (test/screens). Its first-run screens (#403)
6
- * show on a machine where it never ran by hand, and each waits for a key.
7
- * It marks a tool call with ⏺ on macOS and with ● on Linux (#487), so any
8
- * single mark that is no letter, digit or space counts as that marker (#489),
9
- * except ❯, which marks the prompt it was given.
3
+ * Claude Code's screens that stop a session before its hooks run, as Claude
4
+ * Code 2.1.295 writes them: the one place its texts are matched, tested on
5
+ * screens captured from real sessions (test/screens). Its first-run screens
6
+ * (#403) show on a machine where it never ran by hand, and each waits for a
7
+ * key. Activity and a refused model come from the launch marker (#490).
10
8
  */
11
9
  const CLAUDE_CODE_TEXTS = {
12
- // A tool call collapsed once done ("Ran 1 shell command", "Read 1 file", "Called aeolus"), under way ("⏺ Reading 1 file…"), or shown whole ("⏺ Bash(echo hi)").
13
- activity: /^ {2}(?:Ran|Read|Wrote|Edited|Updated|Searched for|Listed|Fetched) \d+ |^ {2}Called \S+|^[^\s\p{L}\p{N}❯] (?:Running|Reading|Calling|Writing|Editing|Updating|Searching|Listing|Fetching) |^[^\s\p{L}\p{N}❯] [A-Za-z][\w-]*\(/mu,
14
- refused: /There's an issue with the selected model \(([^()\s]+)\)/gu,
15
10
  screens: [
16
11
  { name: 'theme picker', text: /Choose the text style that looks best with your terminal/u },
17
12
  { name: 'login method question', text: /Select login method:/u },
@@ -21,7 +16,7 @@ const CLAUDE_CODE_TEXTS = {
21
16
  { name: 'fullscreen renderer offer', text: /Try the new fullscreen renderer\?/u },
22
17
  ],
23
18
  };
24
- export function claudeCodeLaunchSeen(at) {
25
- return launchSeenWith(CLAUDE_CODE_TEXTS, at);
19
+ export function claudeCodeScreenStoppedAt(screen) {
20
+ return screenStoppedAt(CLAUDE_CODE_TEXTS, screen);
26
21
  }
27
22
  //# sourceMappingURL=claude-code-screen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-screen.js","sourceRoot":"","sources":["../../src/adapters/claude-code-screen.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAoB,MAAM,oBAAoB,CAAC;AAEtE;;;;;;;;GAQG;AACH,MAAM,iBAAiB,GAAgB;IACrC,gKAAgK;IAChK,QAAQ,EACN,iOAAiO;IACnO,OAAO,EAAE,2DAA2D;IACpE,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,2DAA2D,EAAE;QAC3F,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE;QAChE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,qBAAqB,EAAE;QACvD,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,mDAAmD,EAAE;QAC5F,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,0DAA0D,EAAE;QACxG,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,oCAAoC,EAAE;KAClF;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,EAAsC;IACzE,OAAO,cAAc,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"claude-code-screen.js","sourceRoot":"","sources":["../../src/adapters/claude-code-screen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAoB,MAAM,oBAAoB,CAAC;AAEvE;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAgB;IACrC,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,2DAA2D,EAAE;QAC3F,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,uBAAuB,EAAE;QAChE,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,qBAAqB,EAAE;QACvD,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,mDAAmD,EAAE;QAC5F,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE,0DAA0D,EAAE;QACxG,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,oCAAoC,EAAE;KAClF;CACF,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,MAAc;IACtD,OAAO,eAAe,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
@@ -25,6 +25,8 @@ import type { Tmux } from './tmux.js';
25
25
  * files.
26
26
  */
27
27
  export declare const WAKE_PROMPT = "/aeolus:wake";
28
+ /** The variable a session's launch id is passed in, for the plugin's hooks to mark that launch (#490). */
29
+ export declare const LAUNCH_VARIABLE = "AEOLUS_LAUNCH";
28
30
  export declare const CLAUDE_CODE_ADAPTER_FLAGS: readonly AdapterFlag[];
29
31
  /** Claude Code's flag that runs every tool without asking; it asks once per user to accept that (#403). */
30
32
  export declare const SKIP_PERMISSIONS = "--dangerously-skip-permissions";
@@ -1,10 +1,11 @@
1
1
  import { readdir } from 'node:fs/promises';
2
2
  import { join } from 'node:path';
3
- import { claudeCodeLaunchSeen } from './claude-code-screen.js';
3
+ import { claudeCodeScreenStoppedAt } from './claude-code-screen.js';
4
4
  import { SETTING_SOURCES } from './claude-code-setup.js';
5
5
  import { partsWithWords, wordsOf } from './command-line.js';
6
6
  import { effectiveFlags } from '../core/effective-flags.js';
7
7
  import { firstPromptOf, wakePromptOf } from '../core/no-terminal-questions.js';
8
+ import { createLaunchMarks } from './launch-marker.js';
8
9
  import { createPluginIdentity } from './plugin-identity.js';
9
10
  /**
10
11
  * Claude Code as a harness (docs/architecture.md, "First adapters"): `claude`
@@ -27,6 +28,8 @@ import { createPluginIdentity } from './plugin-identity.js';
27
28
  * files.
28
29
  */
29
30
  export const WAKE_PROMPT = '/aeolus:wake';
31
+ /** The variable a session's launch id is passed in, for the plugin's hooks to mark that launch (#490). */
32
+ export const LAUNCH_VARIABLE = 'AEOLUS_LAUNCH';
30
33
  const REMOTE_CONTROL = '--remote-control';
31
34
  const CONTINUE = '--continue';
32
35
  const END_OF_FLAGS = '--';
@@ -131,9 +134,10 @@ async function hasConversation(projects, folder) {
131
134
  }
132
135
  export function createClaudeCodeHarness(options) {
133
136
  const { configuration, plugin, sessions } = options;
137
+ const marks = createLaunchMarks(plugin);
134
138
  return {
135
139
  ...createPluginIdentity(plugin),
136
- launch: async ({ shipId, shipName, folder, workspace, harness, options: picked, isFirstStart, firstPrompt }) => {
140
+ launch: async ({ shipId, shipName, folder, workspace, harness, options: picked, isFirstStart, launchId, firstPrompt }) => {
137
141
  const settings = configuration.harnesses[harness];
138
142
  if (settings === undefined) {
139
143
  throw new Error(`The configuration has no harness ${harness}`);
@@ -150,12 +154,26 @@ export function createClaudeCodeHarness(options) {
150
154
  ...(options.command !== undefined && { program: options.command }),
151
155
  });
152
156
  await options.setup.completeOnboarding();
153
- await sessions.start({ shipId, folder, command: wordsOf(command) });
157
+ await marks.clear(folder);
158
+ await sessions.start({ shipId, folder, command: wordsOf(command), env: { [LAUNCH_VARIABLE]: launchId } });
154
159
  },
155
160
  wake: async ({ shipId }) => {
156
161
  await sessions.type({ shipId, text: wakePromptOf(WAKE_PROMPT) });
157
162
  },
158
- launchSeen: async ({ shipId, model }) => claudeCodeLaunchSeen({ screen: await sessions.screen(shipId), ...(model !== undefined && { model }) }),
163
+ marksLaunches: () => marks.isMarking(),
164
+ // The marker says what the session did; the screen only names one that stopped it before its hooks ran (#490).
165
+ launchSeen: async ({ shipId, folder, launchId, model }) => {
166
+ const marker = await marks.read({ folder, launchId });
167
+ if (marker?.refused !== undefined) {
168
+ const refused = model ?? marker.refused.model;
169
+ return { kind: 'refused', ...(refused !== undefined && { model: refused }) };
170
+ }
171
+ if (marker?.isActive === true) {
172
+ return { kind: 'active' };
173
+ }
174
+ const screen = marker?.isStarted === true ? undefined : claudeCodeScreenStoppedAt(await sessions.screen(shipId));
175
+ return { kind: 'none', ...(screen !== undefined && { screen }) };
176
+ },
159
177
  };
160
178
  }
161
179
  //# sourceMappingURL=claude-code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Whether Codex keeps the aeolus plugin's data folder, which holds its log
3
+ * and the crew identities not yet moved to ~/.aeolus/crews (decision 0015),
4
+ * when its aeolus-fleet marketplace is removed (#660).
5
+ * Trierarch upgrade removes that marketplace to point it elsewhere, so it asks
6
+ * first: the Codex given installs an aeolus plugin of its own from a local
7
+ * aeolus-fleet marketplace in a throwaway CODEX_HOME, a mark goes in the
8
+ * plugin's data folder, and the marketplace is removed. The real Codex home
9
+ * is never touched. Throws, saying what Codex said, when Codex cannot run it.
10
+ */
11
+ export declare function codexKeepsPluginData(codex: string): Promise<boolean>;
@@ -0,0 +1,44 @@
1
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { PLUGIN_DATA_FOLDER } from './plugin.js';
5
+ import { runCommand } from './run-command.js';
6
+ /**
7
+ * Whether Codex keeps the aeolus plugin's data folder, which holds its log
8
+ * and the crew identities not yet moved to ~/.aeolus/crews (decision 0015),
9
+ * when its aeolus-fleet marketplace is removed (#660).
10
+ * Trierarch upgrade removes that marketplace to point it elsewhere, so it asks
11
+ * first: the Codex given installs an aeolus plugin of its own from a local
12
+ * aeolus-fleet marketplace in a throwaway CODEX_HOME, a mark goes in the
13
+ * plugin's data folder, and the marketplace is removed. The real Codex home
14
+ * is never touched. Throws, saying what Codex said, when Codex cannot run it.
15
+ */
16
+ export async function codexKeepsPluginData(codex) {
17
+ const folder = await mkdtemp(join(tmpdir(), 'aeolus-codex-plugin-data-'));
18
+ try {
19
+ const marketplace = join(folder, 'marketplace');
20
+ const codexHome = join(folder, 'codex-home');
21
+ await mkdir(join(marketplace, '.agents', 'plugins'), { recursive: true });
22
+ await mkdir(join(marketplace, 'plugins', 'aeolus', '.codex-plugin'), { recursive: true });
23
+ await mkdir(codexHome);
24
+ await writeFile(join(marketplace, '.agents', 'plugins', 'marketplace.json'), JSON.stringify({ name: 'aeolus-fleet', plugins: [{ name: 'aeolus', source: { source: 'local', path: './plugins/aeolus' }, policy: { installation: 'AVAILABLE', authentication: 'ON_INSTALL' } }] }));
25
+ await writeFile(join(marketplace, 'plugins', 'aeolus', '.codex-plugin', 'plugin.json'), JSON.stringify({ name: 'aeolus', version: '0.0.0', description: 'The aeolus plugin data proof of aeolus-trierarch.' }));
26
+ const run = async (args) => {
27
+ const result = await runCommand(codex, { args, env: { CODEX_HOME: codexHome } });
28
+ if (result.status !== 0) {
29
+ throw new Error(`codex ${args.join(' ')} failed: ${`${result.stdout}${result.stderr}`.trim()}`);
30
+ }
31
+ };
32
+ await run(['plugin', 'marketplace', 'add', marketplace]);
33
+ await run(['plugin', 'add', 'aeolus@aeolus-fleet']);
34
+ const data = join(codexHome, 'plugins', 'data', PLUGIN_DATA_FOLDER);
35
+ await mkdir(data, { recursive: true });
36
+ await writeFile(join(data, 'mark'), 'kept\n');
37
+ await run(['plugin', 'marketplace', 'remove', 'aeolus-fleet']);
38
+ return (await readFile(join(data, 'mark'), 'utf8').catch(() => undefined)) === 'kept\n';
39
+ }
40
+ finally {
41
+ await rm(folder, { recursive: true, force: true });
42
+ }
43
+ }
44
+ //# sourceMappingURL=codex-plugin-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-plugin-data.js","sourceRoot":"","sources":["../../src/adapters/codex-plugin-data.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1 @@
1
- import type { LaunchSeen } from '../core/ports.js';
2
- /** The Codex version the texts above were checked on, the version its screens in test/screens were captured on (#594). */
3
- export declare const CODEX_SCREENS_CHECKED_ON = "0.162.1";
4
- export declare function codexLaunchSeen(at: {
5
- screen: string;
6
- model?: string;
7
- }): LaunchSeen;
1
+ export declare function codexScreenStoppedAt(screen: string): string | undefined;
@@ -1,23 +1,19 @@
1
- import { launchSeenWith } from './launch-screen.js';
1
+ import { screenStoppedAt } from './launch-screen.js';
2
2
  /**
3
- * Codex's screen in a session's launch window (#382), as Codex 0.162.1
4
- * writes it: the one place its texts are matched, tested on screens captured
5
- * from real sessions (test/screens). "• Working" shows even with no tool
6
- * call, so it is no activity. codex-setup answers its folder trust and hooks
7
- * review screens ahead; they are named here for when one still shows (#602).
3
+ * Codex's screen in a session's launch window, as Codex 0.162.1 writes it:
4
+ * the one place its texts are matched, tested on screens captured from real
5
+ * sessions (test/screens). Activity comes from the launch marker and a refused
6
+ * model from Codex's session log (#490).
7
+ * codex-setup answers its folder trust and hooks review screens ahead; they
8
+ * are named here for when one still shows (#602).
8
9
  */
9
10
  const CODEX_TEXTS = {
10
- // A tool call done: "• Ran echo hi", "• Explored", "• Called aeolus.whoami", "• Edited file.ts".
11
- activity: /^• (?:Ran \S|Explored$|Called \S|Edited \S)/mu,
12
- refused: /"type":"invalid_request_error","message":"The '([^']+)' model is not supported/gu,
13
11
  screens: [
14
12
  { name: 'folder trust question', text: /^ {2}Trust this folder\?/mu },
15
13
  { name: 'hooks review', text: /^ {2}Hooks need review$/mu },
16
14
  ],
17
15
  };
18
- /** The Codex version the texts above were checked on, the version its screens in test/screens were captured on (#594). */
19
- export const CODEX_SCREENS_CHECKED_ON = '0.162.1';
20
- export function codexLaunchSeen(at) {
21
- return launchSeenWith(CODEX_TEXTS, at);
16
+ export function codexScreenStoppedAt(screen) {
17
+ return screenStoppedAt(CODEX_TEXTS, screen);
22
18
  }
23
19
  //# sourceMappingURL=codex-screen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-screen.js","sourceRoot":"","sources":["../../src/adapters/codex-screen.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAoB,MAAM,oBAAoB,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,WAAW,GAAgB;IAC/B,iGAAiG;IACjG,QAAQ,EAAE,+CAA+C;IACzD,OAAO,EAAE,kFAAkF;IAC3F,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,4BAA4B,EAAE;QACrE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,2BAA2B,EAAE;KAC5D;CACF,CAAC;AAEF,0HAA0H;AAC1H,MAAM,CAAC,MAAM,wBAAwB,GAAG,SAAS,CAAC;AAElD,MAAM,UAAU,eAAe,CAAC,EAAsC;IACpE,OAAO,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"codex-screen.js","sourceRoot":"","sources":["../../src/adapters/codex-screen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAoB,MAAM,oBAAoB,CAAC;AAEvE;;;;;;;GAOG;AACH,MAAM,WAAW,GAAgB;IAC/B,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,4BAA4B,EAAE;QACrE,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,2BAA2B,EAAE;KAC5D;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,OAAO,eAAe,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The model refused, when the log refuses the one it launched with (or any,
3
+ * when it launched with none, so Codex's own default).
4
+ */
5
+ export declare function codexModelRefusedIn(at: {
6
+ log: string;
7
+ model?: string;
8
+ }): string | undefined;
@@ -0,0 +1,45 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Codex's own session log (its rollout file, the transcript its hooks name),
4
+ * read for a refused model: Codex has no hook for a failed turn (#490). A
5
+ * refusal is a turn that completed with Codex's invalid request error naming
6
+ * a model it does not support. Codex documents no format for the log, so the
7
+ * reader is tested on logs captured from real sessions (test/logs), and a
8
+ * recapture on a changed format fails there.
9
+ */
10
+ const failedTurnSchema = z.object({
11
+ type: z.literal('event_msg'),
12
+ payload: z.object({ type: z.literal('task_complete'), error: z.object({ message: z.string() }) }),
13
+ });
14
+ /** The API error a failed turn carries, as JSON text in its message. */
15
+ const invalidRequestSchema = z.object({ error: z.object({ type: z.literal('invalid_request_error'), message: z.string() }) });
16
+ const NOT_SUPPORTED = /^The '([^']+)' model is not supported/u;
17
+ /** A line's JSON; none for a line Codex has not written in full yet. */
18
+ function jsonOf(text) {
19
+ try {
20
+ return JSON.parse(text);
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
26
+ /** The model a failed turn says was not supported; none for a turn that failed for another reason or did not fail. */
27
+ function refusedIn(line) {
28
+ const turn = failedTurnSchema.safeParse(jsonOf(line));
29
+ if (!turn.success) {
30
+ return undefined;
31
+ }
32
+ const request = invalidRequestSchema.safeParse(jsonOf(turn.data.payload.error.message));
33
+ return request.success ? NOT_SUPPORTED.exec(request.data.error.message)?.[1] : undefined;
34
+ }
35
+ /**
36
+ * The model refused, when the log refuses the one it launched with (or any,
37
+ * when it launched with none, so Codex's own default).
38
+ */
39
+ export function codexModelRefusedIn(at) {
40
+ return at.log
41
+ .split('\n')
42
+ .map(refusedIn)
43
+ .find((id) => id !== undefined && (at.model === undefined || id === at.model));
44
+ }
45
+ //# sourceMappingURL=codex-session-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-session-log.js","sourceRoot":"","sources":["../../src/adapters/codex-session-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;GAOG;AAEH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;CAClG,CAAC,CAAC;AAEH,wEAAwE;AACxE,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AAE9H,MAAM,aAAa,GAAG,wCAAwC,CAAC;AAE/D,wEAAwE;AACxE,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,sHAAsH;AACtH,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,IAAI,GAAG,gBAAgB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAmC;IACrE,OAAO,EAAE,CAAC,GAAG;SACV,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,SAAS,CAAC;SACd,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACnF,CAAC"}
@@ -1,7 +1,11 @@
1
- import { CODEX_SCREENS_CHECKED_ON, codexLaunchSeen } from './codex-screen.js';
1
+ import { readFile } from 'node:fs/promises';
2
+ import { LAUNCH_VARIABLE } from './claude-code.js';
3
+ import { codexScreenStoppedAt } from './codex-screen.js';
4
+ import { codexModelRefusedIn } from './codex-session-log.js';
2
5
  import { partsWithWords, wordsOf } from './command-line.js';
3
6
  import { effectiveFlags } from '../core/effective-flags.js';
4
7
  import { firstPromptOf, wakePromptOf } from '../core/no-terminal-questions.js';
8
+ import { createLaunchMarks } from './launch-marker.js';
5
9
  import { createPluginIdentity } from './plugin-identity.js';
6
10
  /**
7
11
  * Codex as a harness (docs/architecture.md, "First adapters"): `codex` in the
@@ -50,12 +54,21 @@ export function codexCommandLine(at) {
50
54
  { words: [END_OF_FLAGS, at.prompt] },
51
55
  ]);
52
56
  }
57
+ /** The session log at the path given; none before Codex wrote it, or once it is gone. */
58
+ async function sessionLog(path) {
59
+ try {
60
+ return await readFile(path, 'utf8');
61
+ }
62
+ catch {
63
+ return undefined;
64
+ }
65
+ }
53
66
  export function createCodexHarness(options) {
54
67
  const { configuration, plugin, sessions } = options;
68
+ const marks = createLaunchMarks(plugin);
55
69
  return {
56
70
  ...createPluginIdentity(plugin),
57
- screensCheckedOn: CODEX_SCREENS_CHECKED_ON,
58
- launch: async ({ shipId, folder, harness, options: picked, isFirstStart, firstPrompt }) => {
71
+ launch: async ({ shipId, folder, harness, options: picked, isFirstStart, launchId, firstPrompt }) => {
59
72
  const settings = configuration.harnesses[harness];
60
73
  if (settings === undefined) {
61
74
  throw new Error(`The configuration has no harness ${harness}`);
@@ -63,13 +76,28 @@ export function createCodexHarness(options) {
63
76
  const prompt = isFirstStart && firstPrompt !== undefined ? firstPromptOf(firstPrompt) : wakePromptOf(WAKE_PROMPT);
64
77
  const command = codexCommandLine({ flags: effectiveFlags(settings, picked), prompt, isFirstStart, ...(options.command !== undefined && { program: options.command }) });
65
78
  await options.setup.trustAeolusHooks(folder);
66
- await sessions.start({ shipId, folder, command: wordsOf(command) });
79
+ await marks.clear(folder);
80
+ await sessions.start({ shipId, folder, command: wordsOf(command), env: { [LAUNCH_VARIABLE]: launchId } });
67
81
  },
68
82
  wake: async ({ shipId }) => {
69
83
  // The space after the skill closes Codex's skill picker, which would otherwise take the Enter.
70
84
  await sessions.type({ shipId, text: wakePromptOf(WAKE_PROMPT), settleMs: CODEX_TYPING_SETTLE_MS });
71
85
  },
72
- launchSeen: async ({ shipId, model }) => codexLaunchSeen({ screen: await sessions.screen(shipId), ...(model !== undefined && { model }) }),
86
+ marksLaunches: () => marks.isMarking(),
87
+ // The marker says what the session did (#490); Codex has no hook for a failed turn, so a refusal is read from the session log its session start named.
88
+ launchSeen: async ({ shipId, folder, launchId, model }) => {
89
+ const marker = await marks.read({ folder, launchId });
90
+ const log = marker?.transcript === undefined ? undefined : await sessionLog(marker.transcript);
91
+ const refused = log === undefined ? undefined : codexModelRefusedIn({ log, ...(model !== undefined && { model }) });
92
+ if (refused !== undefined) {
93
+ return { kind: 'refused', model: refused };
94
+ }
95
+ if (marker?.isActive === true) {
96
+ return { kind: 'active' };
97
+ }
98
+ const stoppedAt = marker?.isStarted === true ? undefined : codexScreenStoppedAt(await sessions.screen(shipId));
99
+ return { kind: 'none', ...(stoppedAt !== undefined && { screen: stoppedAt }) };
100
+ },
73
101
  };
74
102
  }
75
103
  //# sourceMappingURL=codex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,cAAc,EAAE,OAAO,EAAoB,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAqB,MAAM,sBAAsB,CAAC;AAG/E;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,8DAA8D,CAAC;AACxF,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC3C,CAAC;AAEF,qHAAqH;AACrH,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,4CAA4C,CAAC,CAAC;AAEnG,uLAAuL;AACvL,MAAM,UAAU,gBAAgB,CAAC,EAAyF;IACxH,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC;IACtC,OAAO,cAAc,CAAC;QACpB,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACtE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE;QACjF,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;QACzC,EAAE,KAAK,EAAE,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;QAChD,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE;KACrC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAQlC;IACC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAEpD,OAAO;QACL,GAAG,oBAAoB,CAAC,MAAM,CAAC;QAC/B,gBAAgB,EAAE,wBAAwB;QAC1C,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE;YACxF,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,IAAI,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAClH,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACxK,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACzB,+FAA+F;YAC/F,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;KAC3I,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAK5C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,OAAO,EAAoB,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAqB,MAAM,sBAAsB,CAAC;AAG/E;;;;;;;;;;GAUG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,8DAA8D,CAAC;AACxF,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC3C,CAAC;AAEF,qHAAqH;AACrH,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,4CAA4C,CAAC,CAAC;AAEnG,uLAAuL;AACvL,MAAM,UAAU,gBAAgB,CAAC,EAAyF;IACxH,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC;IACtC,OAAO,cAAc,CAAC;QACpB,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACtE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE;QACjF,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;QACzC,EAAE,KAAK,EAAE,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;QAChD,EAAE,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE;KACrC,CAAC,CAAC;AACL,CAAC;AAED,yFAAyF;AACzF,KAAK,UAAU,UAAU,CAAC,IAAY;IACpC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAQlC;IACC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAExC,OAAO;QACL,GAAG,oBAAoB,CAAC,MAAM,CAAC;QAC/B,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE;YAClG,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,IAAI,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAClH,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACxK,MAAM,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,MAAM,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5G,CAAC;QACD,IAAI,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;YACzB,+FAA+F;YAC/F,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC,CAAC;QACrG,CAAC;QACD,aAAa,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE;QACtC,uJAAuJ;QACvJ,UAAU,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtD,MAAM,GAAG,GAAG,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/F,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACpH,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAC7C,CAAC;YACD,IAAI,MAAM,EAAE,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC5B,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/G,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACjF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -30,7 +30,9 @@ const stateSchema = z.object({
30
30
  folder: z.string().optional(),
31
31
  hasStarted: z.boolean(),
32
32
  launchedAt: z.string().optional(),
33
+ launchId: z.string().optional(),
33
34
  isReleasedElsewhere: z.literal(true).optional(),
35
+ isIdentityGone: z.literal(true).optional(),
34
36
  wake: z.object({ waiting: z.int().nonnegative(), isPending: z.boolean() }),
35
37
  })),
36
38
  kept: z.array(z.object({ shipId: idSchema('ship'), repository: z.string(), path: z.string() })),
@@ -1 +1 @@
1
- {"version":3,"file":"json-state.js","sourceRoot":"","sources":["../../src/adapters/json-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-state.js","sourceRoot":"","sources":["../../src/adapters/json-state.ts"],"names":[],"mappings":"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"}