Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Agent Detection Matrix

Standardized checklist for analyzing and onboarding new AI coding agent CLIs. Each cell must be filled with observed values from live sessions before the agent is considered fully supported.

Mobile question and choice contract (2026-09-29)

The mobile client renders the backend’s SessionState.choice_prompt and follows its selection_mode for Claude. Codex’s existing Other notes path still has a client-side special case. Only rows marked as captured below have a verified end-to-end choice contract; unknown forms stay as terminal output until they have a real capture and test.

Registry typeObserved question or approval UISelection contract and evidence
claudeInk AskUserQuestion: title, numbered options separated by description rows, column-zero Enter to select footernavigate-enter: arrows move the highlight, Enter submits, Esc cancels. Claude 2.1.280 capture src-tauri/src/fixtures/agent_prompts/claude-askuser-esc-20260929.tcap; the older permission menu is documented in Claude Code.
codexQueued request_user_input: title and numbered choices under • Queued follow-up inputs; a separate command approval panel existsNumbered key for ordinary options; Other navigates to notes. Captures and limits in Codex.
geminiNo interactive permission UI in the v0.34.0 workspace-restriction observationNo captured question-option contract; see Gemini CLI.
aiderInline file-add confirmation offers Y/N/A/S/DCharacter keys shown in the prompt; this is not a numbered choice overlay. See Aider.
opencodeFramed △ Permission required with inline Allow once / Allow always / RejectNavigation and Enter shown in the footer, but no captured mobile option contract. See OpenCode.
piPermission and menu screens are reportedSpecific question rows and selection bytes not captured; see pi.
amp, cursor, goose, grok, droidNo question-option capture in this repositoryUnknown; no agent-specific mobile choice parser is enabled.
git, apiRegistry execution types, not a captured interactive agent dialogNo choice contract.

The generic numbered confirmation parser remains available for agents with its strict title and option shape. The Claude Ink parser is gated by agent_type and the full-bleed footer so a quoted dialog in agent output cannot become a clickable choice. A missing choice_prompt is not evidence that Yes/No is a safe substitute for a multi-option question.

Detection Matrix

1. Identity & Rendering

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Version testedv2.1.81v0.116.0+ (re-verified)v0.34.0v0.86.2v1.2.20
Date tested2026-03-212026-04-192026-03-222026-03-222026-03-22
Rendering engineInk (React)Ink (React)Ink-like (Node.js)Python rich + readlineBubble Tea (Go)
Cursor positioningRelative (\033[NA])Absolute (\033[r;cH)Relative (\033[1A])Sequential (no cursor)Absolute (\033[r;cH)
Scroll mechanism\r\n paddingScroll regions (\033[n;mr])\r\n paddingNormal scrollFull-screen redraw
Screen clear on menusSometimes (\033[2J)NoNoN/AFull-screen TUI
Parsing strategyChanged-rows deltaChanged-rows deltaChanged-rows deltaChanged-rows deltaScreen snapshot

2. Prompt Line

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Prompt char❯ (U+276F)› (U+203A, bold)> (purple, rgb 215,175,255)> (green, ANSI #40)None (framed ┃ box)
Prompt backgroundNoneDark gray (rgb 57,57,57)Dark gray (rgb 65,65,65)NoneDark (rgb 30,30,30)
Prompt box border──── separatorsBackground color only▀▀▀ top / ▄▄▄ bottomNone┃╹▀ vertical frame
Ghost text styledim cell attribute\033[2m dimGray (rgb 175,175,175)N/AGray placeholder
Multiline inputEnter = submitEnter = newlineEnter = submitEnter = submitUnknown

3. Separator Lines

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Uses separatorsYesPartiallyYesYes (green ─────)No (uses ┃╹▀)
Separator chars─ (U+2500)─ (U+2500)─ (U+2500)─ (U+2500)┃ ╹ ▀ (vertical frame)
Separator colorGray (rgb 136,136,136)StandardDark gray (rgb 88,88,88)Green (rgb 0,204,0)N/A
Separator purposeFrame prompt boxBetween tool output & summaryAbove prompt areaBetween conversation turnsPrompt box border
Decorated separatorsYes (──── label ──)NoNoNoN/A
Min run length4+ charsFull widthFull widthFull widthN/A

4. Status / Chrome Lines

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Mode line⏵⏵ <mode> (last row)NoneNoneNoneMode in prompt box (Build/Plan)
Status line(s)0-N below separator1 line below prompt2-row status bar (4 columns)Token report after responseRight panel (context, cost, LSP)
Status indent2 spaces (\033[2C)2 spaces1 spaceNoneN/A (panel layout)
Info lineNoneNoneShift+Tab to accept edits + MCP/skills countNonetab agents · ctrl+p commands
Subprocess countIn mode lineNoneNoneNoneNone (progress bar instead)

5. Spinner / Working Indicators

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Spinner chars✶✻✳✢· (U+2720-273F)• (U+2022)⠋⠙⠹⠸⠴⠦⠧⠇ (braille)░█ / █░ (Knight Rider)■⬝ (progress bar)
Spinner colorWhiteStandardBlue/green (varies)StandardStandard
Spinner positionAbove separatorInline with outputBelow output, above separatorInline (backspace overwrite)Footer row
Time display(1m 32s)(10s • esc to interrupt)(esc to cancel, Ns)NoneNone
Token display↓ 2.2k tokensNoneNoneTokens: Nk sent, N received. Cost: $X.XXNone
Tip textSpinner verb namesNoneItalic tips during spinnerNoneNone
Detected byis_chrome_row ✓is_chrome_row ✓parse_status_line ✓parse_status_line ✓detect_opencode_screen_activity ✓ (footer esc interrupt, not the bar glyphs)

6. Interactive Menus

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Permission promptMultiselect (❯ 1. Yes)Not observed (sandbox)None (model-level refusal)File add: Y/N/A/S/D△ Permission required inline
Selection char❯ (blue)Not observedN/AN/A⇆ select
Footer patternEsc to cancel/closeesc to interruptesc to cancel (in spinner)Noneenter confirm
OSC 777 notifyYes — needs your permission (blocked, high-confidence); is waiting for your input (blocked picker OR 60s idle timer, low-confidence); needs your attention (ignored)NoNoNoNo
OSC 0 window titleYes (task + spinner)YesYes (◇ Ready (workspace))NoNo
Slash commands/mcp, /stats, /status/model, /mcp, /fast/help, /settings, /model, /stats/helpNone observed

7. System Messages

PropertyClaude CodeCodex CLIGemini CLIAiderOpenCode
Output prefix⏺ (white/green/red)• (U+2022)✦ (U+2726, purple)None (blue text)None (inline in panel)
Tool call display⏺ + verb• Ran <cmd> (shell), • Called + └ fn() (MCP)╭───╮ ✓ ToolName ╰───╯ boxNone→ read / ← write
Warning prefixN/A⚠ (U+26A0)N/AOrange textN/A
Error indicator⏺ (red)✗ or • …hook (failed)✦ + error textRed text┃ Error: inline
Interrupt markerN/A■Not observed^Cesc interrupt hint
Tool result⎿ (U+23BF)└ (U+2514) tree connectorInside ╭───╮ boxInline▣ completion marker
Truncation… +N lines… +N lines (ctrl + t to view transcript)Not observedNot observedNot observed

Trigger Procedures

How to force each UI state for analysis and testing.

Procedure A: Start agent in each permission mode

AgentRestricted modePermissive mode
Claude Codeclaude --permission-mode defaultclaude --permission-mode bypassPermissions
Codex CLIcodex -a untrustedcodex (suggest mode, default)
Gemini CLIgemini (default, workspace-restricted)gemini --sandbox=false (unconfirmed)
AiderN/A (no sandbox)N/A
OpenCodeUnknownUnknown

Procedure B: Trigger permission/approval prompt

AgentActionExpected result
Claude Code (default mode)“create a file /tmp/test.txt with hello”Multiselect: Yes/Yes+allow/No
Codex CLI (untrusted)SameNot observed — auto-approves in sandbox
Gemini CLI“create a file /tmp/test.txt with hello”Text refusal (workspace restriction)
AiderOpen file not in chatAdd file to the chat? (Y)es/(N)o/(A)ll/(S)kip all/(D)on't ask again
OpenCodeAccess external directory△ Permission required with Allow once / Allow always / Reject

Procedure C: Trigger interactive menus

AgentCommandExpected result
Claude Code/mcpServer list with ❯ selection
Claude Code/statsUsage heatmap with date cycling
Claude Code/statusSettings panel with search box
Codex CLI/modelModel selector
Codex CLI/mcpMCP server list
Gemini CLI/settingsSettings panel (unconfirmed)
Gemini CLI/statsUsage stats

Procedure D: Observe working state

AgentActionWhat to capture
AnySend a complex multi-tool taskSpinner animation, cursor-up distance
AnySend task during active subprocessSubprocess count display
AnyPress Escape during workInterrupt marker

Procedure E: Capture raw ANSI

For each state above:

session action=output session_id=<id> limit=8000 format=raw

Look for:

  • Cursor positioning: \033[NA] (relative up), \033[r;cH (absolute)
  • Colors: \033[38;2;R;G;Bm (RGB foreground)
  • Background: \033[48;2;R;G;Bm
  • Screen clear: \033[2J
  • Scroll regions: \033[n;mr
  • OSC sequences: \033]777;..., \033]0;..., \033]8;...

Onboarding a New Agent

  1. Fill the detection matrix columns by running procedures A-E
  2. Create docs/architecture/agents/<name>.md with observed layouts
  3. Update chrome.rs if new markers/chars are needed
  4. Add test cases from real captured text
  5. Run /agent-ui-audit skill to verify parser compatibility