Attention

Brief

Every agent gets a badge on its tab. A small robot breathes while it works, a yellow HEY blinks when it's waiting on you, and ✅ or ❌ says how it finished. Visiting the pane clears the finish.

At the top of the right edge, a pill counts what's waiting, by kind: red for a decision, orange for a failure, green for work to review. Ctrl+Shift+N opens the NEEDS ME queue, which lists them in order, each with the line from the screen that raised it. ↵ takes you to the pane.

When an agent finishes in a pane you aren't watching, it pings, and a desktop notification goes out with the agent's last message. Clicking the notification brings you to it.

Technical has the queue's order, its keys, and how each signal is detected.

Technical

Signals and the queue

One state, every surface#

The tab badge, the left bar, the pill and the queue all read one value per agent. Waiting on you beats working, which beats a finish; a finish is ❌ if an error was on screen when it happened, otherwise ✅.

BadgeMeansQueue lane
robot with a blinking HEYa question or permission prompt is on screen, or an open question on the workbenchDECISION
❌finished against an errorFAILED
✅finished, not yet seenREVIEW
breathing robotworkingnone
nonethe screen matched no ruleUNKNOWN, never counted

A tab shows up to four badges and +N for the rest. The left bar rolls them up onto each group and project. The pane header says the same in words: ❓ your turn, ✘ blocked, ✔ done, exited or live.

How it's detected#

Every 120 ms each pane reads its bottom rows. A prompt counts as waiting on you unless you've already answered it on that same screen. A finish is an agent that stops thinking for 300 ms after thinking for more than 1.2 seconds, or rings the terminal bell mid-turn. Focusing the pane acknowledges it.

The pill#

One number per lane, in the lane's colour; a dim 0 when nothing is waiting; ? when some panes couldn't be read; ● when something is unseen. Click it to open the queue. TD_SPINE=0 hides it.

The queue#

NEEDS ME · <n>, sorted by your level for the project, then lane (decision, failure, review, unknown), then oldest first, then pane. The order holds still while the queue is open; anything new joins at the bottom.

Each row has a ● if unseen, the lane, where it is (group:tab), its age, the reason (Stopped at a prompt, Finished against a wall, Finished, not yet seen), and the screen line that raised it. An age nobody saw start reads —, never zero. Panes that couldn't be read fold into one line: 3 more panes could not be read. With nothing waiting: Nothing is waiting on you.

↓ j Tab / ↑ knext / previous
Home End, 1–9first, last, that row
↵go to the pane
oopen the agent's deliverable
bopen it in a pane beside the agent
pdock the queue beside the panes, or float it again; windows narrower than 1280 px can't dock
Escclose

Deliverables#

An agent can name what it produced with the MCP tool declare_deliverable: a label of up to 48 characters and an absolute path or full URL. It needs writes on. The row then shows html, md or open and the label, and ⇲ beside when Terminal Delight can draw the file itself. The tray under the selected row also has changes and checks, which read unavailable in this build.

Levels#

Right-click a project, group or tab in the left bar and choose Promote or Demote; choose it again to clear. Promoted work sorts first (▲, green), demoted last (▼, blue). A level passes down to everything inside, and the nearest one set wins.

The finish#

A pane you aren't watching plays a short built-in ping when its agent finishes, through ffplay, or pw-play without it. There's no setting for the sound. Then, unless the window is active with that pane focused, notify-send posts a notification titled tab → pane, marked ❓ … — your move, ❌ … — blocked or ✅ …. Its text is the agent's last message, when Terminal Delight is sure which conversation the pane holds, or else the last two lines on screen. Jump to pane raises the window through Hyprland and focuses it.

Turning it down#

The 🔔 in the chrome opens NOTIFICATIONS, which writes ~/.config/terminal-delight/notifications.toml:

system = true    # desktop notifications
marquee = false  # a chasing-bulb banner across the top of the window

With system off, nothing reaches the desktop and no transcript is read. With both off, the badge and the ping remain.

Sources

  1. Badges and the pill: main.rs (agent_badge); the queue, levels and deliverables: attention.rs; detection: pane.rs; the ping: bell.rs; notifications: notify.rs and notifpref.rs.