Skip to content

Interactive TUI

clido includes a full terminal user interface built with Ratatui. It provides a chat-style interaction model with real-time tool progress, session management, and permission prompts.

Run clido with no arguments from a terminal (TTY):

Terminal window
clido

To start with an existing session:

Terminal window
clido --continue # resume the most recent session for this directory
clido --resume abc123 # resume a specific session by ID prefix
╭─ clido ──────────────────────────────── claude-3-5-sonnet ──────────────────╮
│ │
│ [assistant] │
│ I've read src/main.rs. The issue is on line 42 — the match arm is │
│ missing a wildcard case. I'll fix it now. │
│ │
│ [tool: Edit] src/main.rs │
│ + 42: _ => Err(ParseError::Unknown), │
│ │
│ [tool: Bash] cargo check │
│ ✓ Finished in 1.2s │
│ │
│ Done. The wildcard arm has been added and the project compiles cleanly. │
│ │
├───────────────────────────────────────────────────────────────────────────────┤
│ session:a1b2c3 $0.0034 1,240 tok 4 turns [running] Edit │
├───────────────────────────────────────────────────────────────────────────────┤
│ > _ │
╰───────────────────────────────────────────────────────────────────────────────╯
AreaDescription
Chat pane (top)Scrollable conversation history. Assistant messages, tool calls, and tool results appear here in order.
Status strip (middle)Session ID prefix, accumulated cost, token count, turn count, and current tool activity.
Input field (bottom)Single-line text input. Press Enter to send. Pasted text is inserted and waits for manual Enter.
KeyAction
EnterSend the message in the input field
Ctrl+CQuit
Ctrl+/Interrupt current run without sending a new message
Ctrl+YCopy the last assistant message via OSC 52
Up / DownScroll chat history (or history navigation when typing)
Page Up / Page DownScroll chat history by page
Ctrl+UClear the input field
KeyAction
Ctrl+EnterCancel current run and send the current input immediately
Ctrl+/Cancel current run without sending a follow-up prompt
Any textQueue a message to send after the agent finishes
KeyAction
y / EnterAllow this tool call
n / EscapeDeny this tool call
aAllow all remaining calls in this session
KeyAction
Up / DownMove selection
EnterOpen selected session
EscapeClose picker
/ + textFilter sessions by ID or preview text
KeyAction
Enter / EscapeDismiss

Type a slash command in the input field and press Enter:

CommandDescriptionExample
/helpShow all slash commands/help
/sessionsOpen the session picker/sessions
/clearClear the chat display (session is preserved)/clear
/planShow the current planner task graph (if --planner is active)/plan
/memorySearch long-term memory/memory refactor patterns
/costPrint accumulated cost and token usage/cost
/modelShow or switch active model/model gpt-4.1
/workdirShow or set workdir used by tools/workdir ~/src/project
/stopInterrupt current run without sending/stop
/copyCopy last assistant message (OSC 52)/copy
/enhance <prompt>Enhance prompt, review before sending/enhance fix the auth bug
/notify [on|off]Toggle desktop notifications/notify on
/quitQuit clido/quit

When the agent calls a state-changing tool (e.g. Bash, Write, Edit) and the permission mode is default, clido pauses and shows a prompt:

╭─ Permission Required ────────────────────────────────────────────────────────╮
│ │
│ Tool: Bash │
│ Input: │
│ command: "rm -rf ./build" │
│ │
│ Allow this tool call? │
│ [y] Yes [n] No [a] Allow all │
│ │
╰───────────────────────────────────────────────────────────────────────────────╯
  • y / Enter — allow this single call
  • n / Escape — deny; the agent receives an error and may try an alternative
  • a — allow all remaining tool calls in the session (equivalent to --permission-mode accept-all)

::: tip Skipping prompts Pass --permission-mode accept-all to skip all permission prompts. Use --permission-mode plan to prevent the agent from calling any tools at all (plan-only mode). :::

Open the session picker with /sessions:

╭─ Sessions ───────────────────────────────────────────────────────────────────╮
│ > a1b2c3 2026-03-21 ~/projects/app "Refactor the parser module" $0.023 │
│ d4e5f6 2026-03-20 ~/projects/app "Add unit tests for lexer" $0.041 │
│ 789abc 2026-03-19 ~/projects/lib "Fix memory leak in pool" $0.019 │
╰───────────────────────────────────────────────────────────────────────────────╯

Press Enter to resume the selected session. The chat history is loaded and you can continue the conversation.

The status strip at the bottom of the chat pane shows:

FieldExampleDescription
Session IDsession:a1b2c3First 6 characters of the session ID
Cost$0.0034Accumulated cost for this session
Tokens1,240 tokTotal tokens used (input + output)
Turns4 turnsNumber of agent turns completed
Activity[running] EditCurrent tool name while agent is active

When the agent is idle the activity field is blank.

The chat pane scrolls automatically to the bottom as new content arrives. If you scroll up manually, auto-scroll is paused. Scroll back to the bottom to re-enable auto-scroll.

The TUI remembers your last 50 inputs per session. Press Up when the input field is empty to cycle through previous messages.

You can type a message while the agent is running. The message is queued and sent automatically when the current agent turn completes. The queued message is shown with a subtle indicator in the status strip.

/copy and Ctrl+Y use OSC 52 clipboard integration. Support depends on your terminal and SSH setup.

  • Works in most modern local terminals.
  • Over SSH, clipboard support may require explicit terminal settings.
  • If OSC 52 is blocked, clido shows a copy error and your clipboard is unchanged.

Shift+drag in the chat area to select text character-by-character. The selection is highlighted in real time. On mouse release, the selected text is automatically copied to your clipboard and a brief toast confirmation appears near the cursor.

This works even though clido enables mouse capture for scrolling — Shift bypasses terminal mouse capture so the app can handle selection itself.