Skip to content

v0.20.0 — Enter opens an agent's real CLI, interactively

Choose a tag to compare

@jmvbambico jmvbambico released this 16 Oct 02:46
· 70 commits to main since this release
5239a4d

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

  • Enter opens an agent's real CLI in its own tab. Native agents (Claude
    Code, Codex) get the vendor TUI; ACP agents get their own
    omnigent attach view — the same one og chat's down-arrow menu shows. The
    tab is created on demand the first time you ask for it, and pressing Enter
    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 selecting claude and landing in Claude Code was impossible.
  • Terminal discovery asks the runner. og scanned $TMPDIR for a
    bridge.json/tmux.json pair, which only ever worked for claude-native —
    a codex sub-agent writes no tmux.json and 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

  • Enter focuses the selected agent's own tab, not its root. Selecting a
    worker used to focus the conversation it belonged to.
  • Esc clears the selection; q is the only quit. Esc used to quit.
  • space expand is gone — Enter supersedes it.
  • r refresh is gone — the pane already polls on its own timer, so r
    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. Esc is bound
    but deliberately unlisted.
  • The tmux attach is interactive. It kept tmux's read-only,ignore-size
    pair where only ignore-size was 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.md documents how a tab's pane is routed by harness kind.
  • The tab.create timeout 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.