---
title: "Status"
description: "Where each session's colour comes from: Claude Code hook events, per-tool pane rules, and how a turn is judged finished or waiting."
canonical: "https://agent-manager.dev/docs/status/"
last-updated: "2026-10-25"
section: "Documentation"
source: "agent-manager"
---

# Status

Every session's tmux pane is polled every two seconds, and each poll resolves to one state, which the row carries as a colored mark.

| Mark | Compatible | State | Meaning |
| --- | --- | --- | --- |
| ◐ | * | working | The agent is busy on a turn. |
| ◆ | ? | waiting | Blocked on you: a dialog, a permission ask, or a plain-text question. |
| ● | + | finished | Turn ended. An alert that clears to `idle` once you enter the session, or on `.`. |
| ✕ | x | errored | The tool reported an error. |
| ○ | . | idle | Nothing running. |
| ✕ | x | dead | The tmux session is gone. The row stays. |
| ◌ | ~ | starting | The pane is still launching. |

The first column is the default, Advanced. Settings → `symbols` switches to Compatible, plain ASCII marks for a font that cannot draw the others. There a starting row animates an ASCII spinner, a group folds with `>` and `v`, and `Y` marks a worktree branch or a fork.

## Pane rules

Detection matches per-tool regex rules against the visible pane, reads the newest turn to tell `finished` from `waiting`, and treats output that changes between polls as `working`. A turn that ends without any summary line still resolves: a `working` pane that goes quiet counts as `finished`, or `waiting` when it ended on a question.

Work that outlives the turn which started it and reports back to the agent (background agents, dynamic workflows, and an MCP call Claude Code moved to the background) is matched by `busy_line`, so a turn-end summary keeps reading as `working` while that work runs. A turn that leaves a background shell or monitor running ends like any other, and when that shell wakes the agent, the turn that follows reads `working` until it ends. A usage or rate-limit banner (`limit_line`) is `errored`. Polling continues while you are inside a session, so the statuses stay live. A dead row in the list or an open review leaves the poll on that two second interval. Before v0.43.2 each kept the poller spinning, because work the poll queued every pass asked for another poll as it finished.

## Claude Code hooks

For Claude Code the status is first-hand rather than inferred. Sessions launch with a generated `--settings` file whose [hooks](https://docs.anthropic.com/en/docs/claude-code/hooks) write the lifecycle state to a per-session status file, and the poller reads that first. The Claude Code profile sets `status_source` to `claude-hooks` for this.

A `StopFailure` of `rate_limit` writes `errored`. Pane rules still refine it, because hooks cannot see a plain-text question, an Esc interrupt or an error line, so a matching pane verdict upgrades the hook status. They take over entirely when the hook file is missing or stale.

## Reading the list

Each row carries its status and tool inline, and a folded group keeps a count per status, so a collapsed subtree still tells you whether anything under it needs you. Press `w` and the list keeps only the waiting, finished and errored rows. Press it again for the whole tree. Selecting a session shows the tail of its pane on the right, which is how a `waiting` agent's actual question reaches you without attaching. A session with messages from another agent waiting to be typed in wears `✉` (`@` in Compatible) and the count next to its name, and one that asked to be archived or killed once its turn ends wears `↓` or `■` (`A` or `K`) until the manager does it, or until `c` cancels it.

> **Killed and archived sessions** A session with no window left shows the snapshot taken while it still had one, so the row still says what the agent was doing when it stopped.

## Notifications

When a session's status flips to `waiting` or `errored`, the manager fires one notification, once per transition. The title names the session, the directory it runs in, the branch when the manager made a worktree for it, and the tool. A worktree names the repository it was cut from. The title reads `deploy · api · am/fix-login · codex`. The banner quotes the line the session row shows. A waiting one carries the question the agent is asking, as in `◆ Waiting: Do you want to create probe.txt?`. A finished one carries the prompt the row shows, as in `● Finished: write three sentences about rivers`. The quote is one line, cut at 120 characters. With nothing on the row to quote, a waiting banner stays `◆ Waiting for your input` and a finished banner stays `● Finished`. An errored banner stays `✕ Errored`. Settings has a `notifications` row that silences them (on by default) and a `notify on finish` row that adds `finished` transitions (off by default).

On macOS the desktop path gives waiting, finished and errored distinct sounds. Linux sends matching hints through `notify-send`. Inside Ghostty or cmux the state travels as an OSC 777 escape to the drawing terminal, which also reaches you when the manager runs on a remote host over SSH. Under WSL the banner is a native Windows toast posted through PowerShell. Other terminals use the OS desktop path, and a headless box without a desktop falls back to the terminal bell.

A shell command can run on every notification as well. Set it with `agent-manager settings set notify_command '<command>'` and clear it with an empty value. It has no Settings row. The manager runs it after the banner, through `sh -c` on macOS and Linux and through PowerShell on Windows, and the same two Settings rows gate it. The event arrives in the environment as `AM_NOTIFY_KIND`, `AM_SESSION_ID`, `AM_SESSION_NAME`, `AM_TOOL`, `AM_CWD`, `AM_BRANCH`, `AM_TITLE` and `AM_BODY`. On Windows those read as `$env:AM_BODY` and the rest. A command still running after 15 seconds is stopped. A failure is written to `notify-command.log` in the config directory, and the manager carries on. The first time a command is set, and whenever it changes, a `New notify command` banner shows the command before it runs.
