Repository navigation
v0.20.0 — Enter opens an agent's real CLI, interactively
og agents listed your agents but could not get you to them. Every row is now
selectable — the orchestrator included — and Enter focuses a tab holding that
agent's real CLI, interactively: a vendor CLI's blocking permission prompt
can be answered in the terminal instead of opening the web UI to do it.
Added
Enteropens an agent's real CLI in its own tab. Native agents (Claude
Code, Codex) get the vendor TUI; ACP agents get their own
omnigent attachview — the same oneog chat's down-arrow menu shows. The
tab is created on demand the first time you ask for it, and pressingEnter
again returns to the same tab rather than opening another.- The orchestrator row is selectable. Root rows could not be reached at all
before, so selectingclaudeand landing in Claude Code was impossible. - Terminal discovery asks the runner. og scanned
$TMPDIRfor a
bridge.json/tmux.jsonpair, which only ever worked forclaude-native—
a codex sub-agent writes notmux.jsonand was unreachable. Discovery now
asks the runner for the session's terminal resources, keeping the scan as a
fallback so nothing regresses when the runner is unreachable. - The agents pane is themed by role — footer keys and labels, the access
panel, and a·separator drawn from the active theme.
Changed
Enterfocuses the selected agent's own tab, not its root. Selecting a
worker used to focus the conversation it belonged to.Escclears the selection;qis the only quit.Escused to quit.space expandis gone —Entersupersedes it.r refreshis gone — the pane already polls on its own timer, sor
only skipped the wait.- The footer is now
↑/↓ move ∙ ⏎ focus ∙ t theme ∙ a access ∙ q quit,
measuring 50 / 30 / 20 columns against the 80-column ceiling.Escis bound
but deliberately unlisted. - The tmux attach is interactive. It kept tmux's
read-only,ignore-size
pair where onlyignore-sizewas load-bearing — that is what stops a narrow
client resizing and corrupting the live agent's TUI, and it still does.
Fixed
- Selection dimming was a one-way door. Pressing an arrow key dimmed every
unselected agent, and nothing brought the list back — it stayed dimmed for
the rest of the session. - herdr started its server after the case-(B) attach rather than before it.
- The access panel no longer draws dimmed, and fills its pane.
- The footer strip no longer paints over the selection's cell, and uses a
Narrow separator (none in the compact form) so the measured widths hold.
Docs
docs/HERDR.mddocuments how a tab's pane is routed by harness kind.- The
tab.createtimeout case is recorded where it happens: a create that
times out may still have landed, leaving a rare orphan tab. It is not
specific to this path — every create in og has it, because the herdr protocol
has no idempotency key — and reconciling by tab label is deliberately not
done, since the label is the harness product name and is not unique per
session, so it could close another agent's tab.
All of #37, #38, #39 and #40. Gate on the release commit: pytest tests/
1486 passed, 0 failed, bash -n and shellcheck -S error clean.