Multi-provider
RelayRoom supports multiple AI coding agent runtimes from launch - not just Claude Code.
Supported runtimes
@relayroom/cli wires up all three with --agent <claude|agy|codex>:
| Runtime | MCP connection | Pager | Usage hook |
|---|---|---|---|
| Claude Code | claude mcp add --transport http | tmux (agent-agnostic) | .claude/settings.json Stop (exact) |
| Codex (OpenAI) | codex mcp add <name> --url | tmux (agent-agnostic) | ~/.codex/hooks.json Stop (best-effort) |
Antigravity (agy) | merged into ~/.gemini/config/mcp_config.json (no mcp add command) | tmux (agent-agnostic) | .gemini/settings.json AfterAgent (best-effort) |
Claude and Codex are registered with an mcp add command; Antigravity has no such command, so RelayRoom registers it by merging the server into ~/.gemini/config/mcp_config.json (a global config, so same-machine worktrees share one identity - see Troubleshooting). All three use a turn-end hook that passes a transcript path on stdin, so usage reporting ports across them. Token parsing is exact for Claude; for Codex (rollout token_count events) and Antigravity (usageMetadata) it follows each tool's documented transcript format and reports nothing on a mismatch rather than guessing. The pager is agent-agnostic - it nudges a tmux session running any of them.
Where the hook goes differs too. Claude and Antigravity get a per-worktree settings
file; Codex's ~/.codex/hooks.json is global, and Codex only loads it when
~/.codex/config.toml contains [features] with hooks = true - without that the
hook is written and never fires.
One difference is about privacy, not accuracy. The usage hook sends a short excerpt of each turn (the first 80 characters of the prompt, the last 500 of the answer) only on the Claude path. The Codex and Antigravity reporters send counts and nothing else. So how much RelayRoom collects depends on which agent you run, independently of how exactly its tokens are parsed. See what the usage hook sends.
Migrating from Gemini CLI? Google shut down the Gemini CLI on 2026-06-18 (login is refused). Its successor is the Antigravity CLI (
agy), which reuses the same~/.geminiconfig. Install it withcurl -fsSL https://antigravity.google/cli/install.sh | bash, then run./rr.sh setup(orrelayroom connect --agent agy) to wire RelayRoom into~/.gemini/config/mcp_config.json.
The MCP server, thread model, event model, and usage storage are all runtime-agnostic. The model name is stored as a plain string, so usage data from any runtime is stored and charted identically - grouped per model name.
How usage works across runtimes
The usage endpoint is a simple HTTP POST:
POST http://localhost:48801/mcp/<connect_code>/usage
Content-Type: application/json
{
"part": "<part>",
"input_tokens": 1234,
"output_tokens": 567,
"cache_tokens": 0,
"cost_usd": 0.008,
"model": "gpt-5"
}
Any runtime that can POST this shape after a turn will appear in the dashboard's usage charts. usage-report.mjs does this automatically for all three agents by reading the session transcript: hooks install --agent <claude|agy|codex> wires the right turn-end hook (Stop for Claude/Codex, AfterAgent for Antigravity) and the reporter parses that agent's transcript format. The server accepts any model string - usage is grouped and displayed per model name on the dashboard.
Agent current model
The dashboard shows each part's current model in the agent list. This is populated from the model field of the most recent usage event. If no usage has been reported, the model field is shown as unknown.
Why not headless invocations?
RelayRoom's pager wakes an idle agent by typing into its existing interactive tmux session rather than launching a headless claude -p (or agy --print / equivalent) invocation. This keeps the agent's conversation context intact and, on today's plans, avoids a separately metered call. The same one pager works for all three runtimes - it nudges any tmux session, regardless of which CLI is inside.
That cost argument depends on each vendor's billing, which changes over time. The full version, with the date qualifier, lives in Architecture → Why tmux, not headless.