docs blog library
github

Program status in the terminal

Jazz tells your terminal what it is doing, so you can see at a glance — from another tab — whether a run is working, waiting on you, finished, or failed. Terminals that understand these signals (Ghostty, Rex, and more as the spec spreads) show it as a tab spinner, a “needs you” badge, and a persistent “finished, unviewed” mark that survives the next shell prompt.

Everything is plain escape-sequence output on the controlling terminal. Terminals that do not know a sequence ignore it, so nothing changes if yours does not support it yet.

What gets reported

Jazz’s run state machine already knows its state, so the reports carry it directly — no screen-scraping:

Jazz stateReported as
Agent thinking or streamingstate=working
A tool is runningstate=working with the tool name
A tool is awaiting approvalstate=blocked kind=permission with the approval text
A question is waitingstate=blocked kind=question with the question
A password/token is being askedstate=blocked kind=auth with the prompt (never the value)
A file picker is openstate=blocked kind=question
A turn finishedstate=done
A jazz run failedstate=error
A jazz run parked for a person (--park)state=blocked with the parked input

The blocked and error reports also ping the tab using the same terminal notification protocols as desktop notifications (OSC 9, 99, or 777, selected per terminal; tmux passthrough included), so a run parked in another tab flashes or rings as well as showing a badge.

OSC 7501

The primary signal is OSC 7501 (the Program Status Protocol). Jazz emits reports of the form:

ESC ] 7501 ; state=blocked:app=jazz:kind=permission:msg=<base64> ST

Reports are deduplicated: the same state does not re-emit while it holds, and a repeated approval ping for the same ask does not re-ring within a few seconds.

Disable all 7501 reports with JAZZ_OSC7501=0 (also false or off).

Terminal notifications

When a run goes blocked or error, Jazz writes the terminal’s native notification sequence so the tab gets attention. Protocol selection and the JAZZ_NOTIFICATIONS_TERMINAL override are shared with the desktop notifications setting, so off or osc9 applies to both. Notifications only fire for state changes — an idle run does not ping.

Current working directory

Jazz reports its working directory with OSC 7 at the start of a session and a jazz run. Terminals use it for tab titles and cwd-aware tooling (tmux, iTerm2). Disable with JAZZ_OSC_CWD=0.

What is not reported yet

  • Sub-agent status as separate records. OSC 7501 supports a per-record id (e.g. subagent/<agentId>), which would let a terminal show each running sub-agent’s own state. The encoder already supports id and title; wiring the per-sub-agent records is the next step.
  • state=clear to explicitly drop the record on cancel — the next shell prompt already resets it in supporting terminals.

Which escape codes Jazz uses

CodePurposeStatus
OSC 7501Program status (this page)New here
OSC 9 / 99 / 777Terminal notificationsReused from the desktop notifications stack
OSC 7Working directoryNew here
OSC 52ClipboardAlready supported (fullscreen interface)
OSC 11Terminal background queryAlready used for theme-aware colors
OSC 8 / SGR 8HyperlinksNot yet emitted; a follow-up for link rendering
OSC 133Semantic prompt marksNot applicable — those describe shell prompts, and Jazz is a TUI

machine-readable: /docs/guides/program-status.md · /llms.txt · /llms-full.txt