blog

~ ❯ cat blog/which-agent-needs-you.md

Which agent needs you?

· opcodezero

With one agent, you watch it. With four, you poll: flip to a terminal, see it’s still thinking, flip to the next, find the one that has been sitting on a permission prompt for ten minutes. Most of the waiting in a multi-agent day isn’t the agents. It’s agents waiting for you, where you didn’t look.

wrkstrms is built around one question: which agent needs you right now?

Four agents in two workspaces. The top bar already has the answer: one needs you.

Four states

Every agent in wrkstrms is in one of four states, and each has a glyph and a color that mean the same thing everywhere on screen:

  • ● blocked, red: it needs you. A permission prompt or a question.
  • ◐ working, yellow: it’s running.
  • ✓ done, green: it finished a turn you haven’t looked at yet.
  • ○ idle, gray: finished and seen, or not started.

Done matters as much as blocked. An agent that finished while you were elsewhere is also waiting for you, just for your next prompt. Once you look at its pane, it goes back to idle.

Where the states come from

wrkstrms doesn’t guess from the screen. Agent CLIs have hooks: small commands they run at points in their lifecycle. ws integrate claude and ws integrate codex install a hook for each event, and each hook tells the ws server what just happened in that pane.

  1. session starts idle
  2. you send a prompt, or it runs a tool working
  3. it asks for permission or a decision blocked
  4. you answer; it carries on working
  5. the turn ends done
  6. you look at its pane idle
One turn, as ws sees it through the agent's hooks.

A prompt or a tool call means working. A permission request means blocked. The end of a turn means done. Claude Code also sends a notification when it has been waiting a while for your next prompt; if the agent is already done or idle, ws ignores that reminder instead of calling it blocked.

Agents without hooks still show up. ws checks each pane’s foreground process every two seconds and recognizes OpenCode, aider, Gemini CLI, goose, Amp, Cursor agent, Qwen Code, Crush and Ollama, even when they run under node, bun or Python. It knows they’re agents, but without hooks it can’t know what they’re doing, and it says so.

Everywhere you look

The same state shows up at every level, so you can tell from a glance where the attention is needed.

The top bar counts: how many need you, how many are working, how many are done. The red pill carries the key that takes you there.

The sidebar lists every agent in every workspace, most urgent first, with what it’s doing: the question it’s asking, the tool it’s using, or “done, not seen”.

Tabs take the color of their most urgent agent, and pane frames take their agent’s color, with its label on the left and what it’s doing on the right.

A blocked pane: the frame, the title and the detail all say so.

Getting there

⌃␣ a, or Alt-a without the prefix, jumps to the agent that has needed you longest, blocked agents first. Press it again for the next one. When nothing needs you, the top bar says so.

If an agent gets blocked while its pane isn’t on screen, wrkstrms sends a desktop notification with the agent’s label and what it’s asking. They’re throttled: after one goes out, the next waits at least five seconds, and anything that piled up arrives as a single “3 agents need you”.

When a status looks wrong

⌃␣ I opens the status inspector for the focused pane: its status and since when, what it’s asking, which agent and model and session, where its label comes from, its process, and a timeline of the hook events that got it there.

You can set a status by hand from there, until the agent’s next real event, and copy a bug report if something’s off.

The Agents guide has the details: the exact events each CLI reports, labels, notifications and the inspector’s keys.