# Agent Detection > How Prowl knows there's an agent in a pane and whether it's Working, Blocked, > Idle, or Done — and which agents it recognizes. **Keywords:** agent detection, claude, codex, gemini, cursor, working, blocked, idle, done, status, process probe, screen heuristics, indicator, spinner **Related:** [active-agents](active-agents.md) · [notifications](notifications.md) · [terminal](terminal.md) ## What it is Prowl continuously inspects each terminal pane to decide whether a coding agent is running and what state it's in. That signal drives the [Active Agents panel](active-agents.md), the per-tab activity indicator, [Canvas](canvas.md) cards lighting up, and [notifications](notifications.md). ## Agents it recognizes Claude (Claude Code), Codex, Gemini, Cursor, Cline, OpenCode, GitHub Copilot, Kimi, Droid, Amp, Pi (`pi`), Oh My Pi (`omp`, `oh-my-pi`), Qoder CLI (`qodercli`), Qwen Code (`qwen`), and Grok Build (`grok`). Detection covers common wrappers (node, python, bun, bash, etc.) so agents launched indirectly are still found. Pi and Oh My Pi are independent detected agents. Pi recognizes its own minimal working/idle cues, including its built-in braille-prefixed `Working...` loader and a running `pi-subagents` background card after the parent turn settles; Oh My Pi owns its richer spinner and interactive Ask-prompt heuristics, plus its own session layout and icon. Grok Build also ships an `agent` symlink; Prowl only treats that name as Grok when the path points at a `~/.grok/` install (so Cursor's own `agent` entrypoint stays Cursor). ## How detection works 1. **Process probe.** Prowl reads the pane's foreground process group and matches process names / argv against known agent executables, scoring argv[0] highest, then process name, then command-line tokens. 2. **Screen heuristics.** Claude detection consumes the full active screen (bounded by the terminal height); Pi starts from the last ~32 non-blank lines so an expanded background-agent widget stays intact, and every other agent starts from the last ~24 as a guard against transcript history. The classifier then selects agent-specific live UI regions rather than treating every transcript line as current state. Structured confirmation/permission chrome is **Blocked**; status rows and spinners are **Working**. Claude working rows come from a live status block walked bottom-up from its prompt box by row shape — the spinner or `●` status row, `⎿` attachments such as todo lists and tips, queued `❯` messages, and right-aligned chrome — stopping at the first transcript-shaped row, so a long todo list cannot push the live row out of view and a status row quoted inside a `⏺` block cannot read as live. Confirmation text is consulted only around a current numbered selection row such as `❯ 1. Yes`; a bare input prompt cuts off the preceding transcript. Claude's internal scroll view keeps the composer visible while hiding live status. When `Jump to bottom (click) ↓` or a counted `new message(s) (click) ↓` control appears in the last non-blank row above that composer, Prowl treats the screen as a viewer and retains the last known state. The control can overlay text in the middle of a row. Return to the bottom to refresh screen-based status; completion while browsing history is not visible to this detector. Codex uses exact bottom-of-screen `•`/`◦ Working (... esc to interrupt)` and `•`/`◦ Waiting for background terminal (... esc to interrupt)` footer fallbacks. Braille-only starfield rows around the composer do not count toward that footer window; animation alone does not indicate **Working**. An empty Codex composer hint and status line remain **Idle** evidence with Astra's starfield background, so a workflow can send its first task before any turn has completed. Draft text and attachments do not qualify as an empty composer. Its confirmation detector requires a numbered selected row such as `› 1. Yes` paired with a live bottom footer or an explicit Yes/No choice structure. It also recognizes the current directory-trust, hook-review, and initial sign-in menus as **Blocked** from their complete selected-choice and footer structures. Ordinary prompt text and completed responses are not confirmation boundaries. Pi also treats its bottom `── Working ──` footer and the adjacent `async subagent … · background` header with a matching braille job row as **Working**. The compact `subagents (N/M running)`, progressive `Async agents · N agent(s) running`, and multi-job `Async agents · background` layouts carry the same signal; completed, paused, and failed cards use static glyphs and remain idle. Other agent families keep their own patterns (including Oh My Pi's `Working… ⟦esc⟧` loader and bottom-of-screen `󱊷 Working…` (also `⎋`/`esc`) prefix form, braille frames, symbol cycles, Cursor's hexagons, Kimi's moon phases, etc.). Copilot recognizes the bottom `Working … esc interrupt` footer across its `∙ ∘ ○ ◎ ◉` animation frames, including an optional streaming-size field such as `· 101 B` or `· 1.2 KB`. Its live boxed numbered choices with `enter to select · esc to cancel` are **Blocked**, including folder trust; that picker takes precedence over the older `esc to cancel` working cue. Claude's live status row (`●