GAIA Terminal UI
Two manuals carry the detail. Read the matching one before touching the TUI — both are written from verified runs, not from reading the source.
- User manual (
docs/guides/terminal-hub.mdx) — install, the setup gate and what each row means, choosing where inference runs, day-to-day use, the permission prompt, troubleshooting. - Developer manual
(
docs/reference/tui-dev.mdx) — the three-process architecture, building, the full control-API reference, pty allocation, logs and traces, and running a local model on a dev box.
.claude/skills/driving-the-tui/ covers the same control API from the
assistant's side; the developer manual is the reference it defers to for
endpoint shapes.
The five things that waste the most time
Each of these cost a real debugging session. They are in the manuals too — this is the short list worth carrying in your head.
-
The agent subprocess outlives your edits.
gaia-tuispawnsgaia-agentonce. Change Python undersrc/gaia/orhub/agents/and the running session keeps executing the old code — a before/after measurement taken without a restart is two measurements of the same build. Restart the TUI. -
keystakes an array.{"keys": ["p"]}. A bare string is rejected withcannot unmarshal string into Go struct field keysRequest.keys of type []string.texttypes but does not submit — follow with["enter"]. -
It needs a real pty.
scriptfails on a socket (tcgetattr/ioctl: Operation not supported), and driving Terminal.app viaosascriptcan time out with-1712and leave nothing running. Allocate the pty yourself withpty.fork(), size it withTIOCSWINSZ, and drain the fd or the child blocks. Callresizefirst in any drive script. -
Wait, never sleep —
POST /control/v1/waitblocks server-side oncontains/absent/state. But{"state":{"streaming":false}}can match the instant before a turn starts; confirm streaming went true first, or pollstatus. -
The "Language model" preflight row includes the embedder. A machine with a working chat model still blocks on the ~300 MB
user.embeddinggemma-300m-GGUF, while the row says "Several GB".gaia init --checknames the exact missing id.
Before reporting a TUI bug
- Capture the whole screen. A cropped capture once produced a fabricated "uninstall silently does nothing" — the status line is the second-to-last row.
- Check
viewinstatusbefore sending keys; keys sent to the wrong screen do nothing and read as a broken binding. - Check the
TOOL_LOADERlines in~/.gaia/logs/gaia-agent.logbefore believing the agent when it says a capability "isn't available" — it may simply not have been selected for that turn. - Say which branch you built. Stacked branches are siblings; a leaf build shows behaviour already fixed elsewhere.


