Context
The agent image already installs @openai/codex, @github/copilot, and opencode-ai alongside Claude Code (agent/Dockerfile), and entrypoint.sh has an AGENT env var — but it's container-wide, only claude is actually wired (creds preflight, RC launch), and the session manager hardcodes the claude --remote-control invocation in _launch_tmux().
Problem
The multiplexer is agent-generic by design (per the repo docs: "the name is agent-generic so it can host other agents later") but in practice can only run Claude. Making the agent a per-session choice rather than per-container would let one host run a Claude session and a codex session side by side — useful for comparing agents on the same task, and as a hedge on subscription limits.
Proposal
- Add
agent to the session registry record and the spawn command; default claude.
- Factor the launch command out of
_launch_tmux() into a per-agent table: command line, required creds path(s) for a preflight check, and whether the agent supports something RC-like. tmux + ttyd + worktree handling is identical for all of them — that machinery needs no changes.
- Auth: each agent needs its own mounted config (e.g.
~/.codex, ~/.config/gh for copilot). Spawn should fail fast with a clear per-session errorMsg ("no codex credentials mounted") instead of a tmux window that dies instantly — the existing _set_error() path fits.
- Capability degradation: non-Claude sessions won't have transcript parsing (
usage_report()/session_report() are Claude-transcript-specific), so working/idle/question/PR/cost signals should be null rather than wrong. The web terminal keeps working for all of them since it's just tmux+ttyd. Per-agent usage parsers can come later, piecemeal.
- UI: agent picker in the spawn form; badge on the session card; guard the RC-name display (rcName is Claude-specific).
Touchpoints
agent/hub-agent.py — registry schema, spawn command, launch table, signal guards
agent/entrypoint.sh — preflight becomes per-agent and non-fatal (the container hosts mixed sessions)
agent-hub/public/index.html — picker + badge
- DockerOps compose (sibling repo) — extra credential mounts, documented here
Context
The agent image already installs
@openai/codex,@github/copilot, andopencode-aialongside Claude Code (agent/Dockerfile), andentrypoint.shhas anAGENTenv var — but it's container-wide, onlyclaudeis actually wired (creds preflight, RC launch), and the session manager hardcodes theclaude --remote-controlinvocation in_launch_tmux().Problem
The multiplexer is agent-generic by design (per the repo docs: "the name is agent-generic so it can host other agents later") but in practice can only run Claude. Making the agent a per-session choice rather than per-container would let one host run a Claude session and a codex session side by side — useful for comparing agents on the same task, and as a hedge on subscription limits.
Proposal
agentto the session registry record and the spawn command; defaultclaude._launch_tmux()into a per-agent table: command line, required creds path(s) for a preflight check, and whether the agent supports something RC-like. tmux + ttyd + worktree handling is identical for all of them — that machinery needs no changes.~/.codex,~/.config/ghfor copilot). Spawn should fail fast with a clear per-sessionerrorMsg("no codex credentials mounted") instead of a tmux window that dies instantly — the existing_set_error()path fits.usage_report()/session_report()are Claude-transcript-specific), so working/idle/question/PR/cost signals should be null rather than wrong. The web terminal keeps working for all of them since it's just tmux+ttyd. Per-agent usage parsers can come later, piecemeal.Touchpoints
agent/hub-agent.py— registry schema, spawn command, launch table, signal guardsagent/entrypoint.sh— preflight becomes per-agent and non-fatal (the container hosts mixed sessions)agent-hub/public/index.html— picker + badge