Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,14 @@ Use the hints for common dashboard actions; press `?` for the expanded key refer
fleetcom 2 running · 0 idle · 0 done by state · dir · custom

Running
✻ cargo watch -x test test result: ok. 42 passed 9s
✻ npm run dev VITE v5.0 ready in 312 ms 4s
✻ cargo watch -x test test result: ok. 42 passed 9s
✻ npm run dev VITE v5.0 ready in 312 ms 4s

❯ n run · @ dir · / find · s sort
↑↓ select · enter attach · space peek · ? controls
```

Each row is `glyph · tag · command · latest output · age`. Age is measured from launch while running, last output once idle, or exit once completed. Press `Space` to peek at the selected task's live screen in a read-only box over the dashboard:
Each row is `marks · glyph · command · latest output · age`. Age is measured from launch while running, last output once idle, or exit once completed. Press `Space` to peek at the selected task's live screen in a read-only box over the dashboard:

```text
┌─ cargo watch -x test ───────────────────────────────┐
Expand All @@ -101,10 +101,10 @@ Press `Ctrl-\` to return to the dashboard. Press `m` to tag the selected task "i
fleetcom 2 running · 0 idle · 0 done by state · dir · custom

In use
✻ ◆cargo watch -x test test result: ok. 42 passed 1m
◆ ✻ cargo watch -x test test result: ok. 42 passed 1m

Running
✻ npm run dev VITE v5.0 ready in 312 ms 1m
✻ npm run dev VITE v5.0 ready in 312 ms 1m
```

Press `s` to cycle through state, directory, and custom grouping. The active mode is bold in the header. In custom mode, press `g` to assign the selected task to a named group. Named sections are sorted without regard to case, so `API` and `api` are adjacent. They remain separate because group identity is case-sensitive. Unassigned is listed last when at least one task has no group:
Expand All @@ -113,10 +113,10 @@ Press `s` to cycle through state, directory, and custom grouping. The active mod
fleetcom 2 running · 0 idle · 0 done by state · dir · custom

api
✻ ◆cargo watch -x test test result: ok. 42 passed 2m
◆ ✻ cargo watch -x test test result: ok. 42 passed 2m

Unassigned
✻ npm run dev VITE v5.0 ready in 312 ms 2m
✻ npm run dev VITE v5.0 ready in 312 ms 2m
```

In custom mode, a new command is assigned the selected task's group, shown in the spawn prompt (`❯ api ▸ cargo run`). Group assignments are stored with task state and preserved across detach and rerun. See the [command reference](commands.md#the-g-group-picker) for picker mechanics.
Expand All @@ -127,10 +127,10 @@ Press `R` to rename the selected task, starting with its current name. Press `En
fleetcom 2 running · 0 idle · 0 done by state · dir · custom

api
✻ ◆api tests test result: ok. 42 passed 3m
◆ ✻ api tests test result: ok. 42 passed 3m

Unassigned
✻ npm run dev VITE v5.0 ready in 312 ms 3m
✻ npm run dev VITE v5.0 ready in 312 ms 3m
```

In the attached status bar, both are displayed: `[attached] api tests · cargo watch -x test`. Names are stored in daemon state, preserved across detach and rerun, and included in saved [sessions](sessions.md).
Expand Down
6 changes: 4 additions & 2 deletions docs/agent-resume.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@ You cannot choose a Codex ID at launch. A notify override is injected into both

After each turn, the notifier writes the `agent-turn-complete` JSON argument to `FLEETCOM_CAPTURE_FILE`, and the harness reads `thread-id` from it. This captures an in-TUI session change after a turn completes in the resumed conversation.

Replacing a configured notifier would change user behavior, so the harness reads bare top-level keys in `$CODEX_HOME/config.toml` until the first table header. If it finds a one-line `notify` array of non-empty basic strings, it chains that notifier after the capture write. `FLEETCOM_NOTIFY_CHAIN` carries its argv joined by newlines; the capture script appends the notification payload before invoking it. An absent setting or empty array means capture runs alone. This encoding cannot transport empty arguments, newlines, or NUL, so those values disable injection.
To preserve a configured notifier, read bare top-level keys in `$CODEX_HOME/config.toml` up to the first table header. For a one-line `notify` array of non-empty basic strings, invoke the notifier after writing the capture file. Store its argv in `FLEETCOM_NOTIFY_CHAIN`, joined by newlines, and append the notification payload before invocation. With an absent setting or empty array, run only the capture hook.

Do not inject the capture hook for empty arguments, newlines, or NUL: these cannot be represented in the chain encoding. Also skip injection when `config.toml` exists but cannot be read, or when a line above the first table header is not a bare key assigned a recognized single-line value. No ID is captured in these cases.

Live validation on 2026-09-28 used the official macOS arm64 Codex 0.157.1 and 0.158.0 executables with isolated homes and a scripted loopback Responses server. In both releases, the real capture script preserved the notification JSON and passed it to the configured notifier. Saving and loading through foreground fleetcom preserved the thread ID and reopened its history. These runs used `--no-daemon`; separate default-launch probes also captured and saved the ID, but their fresh homes had no managed Codex daemon installed or running. Shared-daemon behavior and real-account behavior remain unverified.

Expand Down Expand Up @@ -121,7 +123,7 @@ Every captured value eventually enters a shell command, so validation accepts on

## Extending capture

Implement the `Harness` trait in [`src/harness/mod.rs`](../src/harness/mod.rs) for each tool. Separate detection, evidence collection, and command construction through these methods:
Implement the `Harness` trait in [`src/harness/mod.rs`](../src/harness/mod.rs) for each tool. Register it in that file's `AGENTS` table, the sole registry for detection. Include a `SummaryAdapter` for the dashboard preview with each entry; see the implementations in [`src/harness/summary.rs`](../src/harness/summary.rs). Separate detection, evidence collection, and command construction through these methods:

- `shape`: supply the program word and resume selector. Accepted and canonical forms are derived from that pair by the default `detect` and `resume_command` implementations.
- `instrument`: return spawn-time arguments, environment entries, and an optional pinned ID.
Expand Down
Loading
Loading