Skip to content

Status Bar Anatomy

The status bar is a single row of chrome at the bottom of the TUI, rendered by crates/wcore-cli/src/tui/widgets/statusbar.rs. It is always visible. Its default layout is:

claude-opus-4-7 │ Default │ ctx ████████░░░░░░░░░░░░ 63% │ $0.0234 │ 12s

The segments are separated by dividers and read left to right: model, mode, context gauge, cost, duration.

The active model slug. A vendor/ prefix is stripped so anthropic/claude-opus-4-7 renders as claude-opus-4-7. On a very narrow terminal the model name is truncated to half the available width with a so the bar never shows a mid-character cut. When no model is configured the field shows no model.

The current approval mode: Default, Auto-edit, or Force. When the session was started with --force (or its aliases --yolo / --dangerously-skip-permissions), an additional · FORCE badge in warning color is appended after the mode label. The badge is present regardless of which mode value is shown, because --force is a boot-time override that cannot be removed mid-session.

The mode label changes immediately when you cycle modes with Shift+Tab in the Workspace. See Approval Modes for what each mode gates.

A 20-cell Unicode block-fill bar followed by a percentage. The bar uses nine levels of horizontal sub-character fill (▏▎▍▌▋▊▉█ plus a space for empty cells), giving approximately 160 resolution steps across the 20 cells. The color changes at four thresholds:

RangeColor
Below 50%Green
50% to below 80%Yellow
80% to below 95%Orange
95% and aboveRed

The thresholds are inclusive at the boundary: exactly 50% is yellow, exactly 80% is orange, exactly 95% is red.

The context window size and used-token count come from the engine’s per-turn cost event. The gauge tracks the ratio of used tokens to the active model’s context window.

Session cumulative spend in USD, always visible. The format adjusts by magnitude: four decimal places when the cost is above zero and below $0.10 (for example $0.0234), two decimal places otherwise (for example $1.23). Cost is never hidden behind a width threshold.

Elapsed session time formatted compactly: 12s for seconds, 3m04s for minutes and seconds, 1h02m for hours and minutes. The cost and duration segments are both dropped when the terminal width is below 64 columns, leaving the model, mode, and context gauge. The cost threshold is verified in tests at statusbar.rs:510-525.

While the two-press Ctrl+C quit guard is armed, the entire status bar is replaced with:

Press Ctrl+C again to exit

in bold warning color. No other content renders until the guard is disarmed (by pressing Ctrl+C again to exit, or by pressing any other key).

When --force is active, the mode segment reads, for example:

Auto-edit · FORCE

The · FORCE portion is bold warning color. The badge renders for the full session and cannot be removed interactively.

Demoted status events appear as a transient toast appended after the duration segment:

… │ ⚡ filesystem ready · 12 tools

Toast content is set by the protocol bridge (for example, when an MCP server finishes loading). The toast auto-dismisses after 2 seconds (TOAST_DWELL). The status bar renders the toast if its timestamp is within the dwell window; the field is cleared on the next tick after expiry.

You can replace the entire bar with the last-good output of a shell command by setting statusLine.command in your config:

[statusLine]
command = "git branch --show-current"

When this key is set, a background sampler runs the command off the render thread (hard 500 ms timeout, at most once per second) and publishes the sanitized one-line result into a shared cache. The status bar reads that cached string as plain data and renders it as the entire row. The curated default segments do not appear while an override is active.

The command output is sanitized before rendering: ANSI escape sequences and OSC codes are stripped, and only the first line is used. A command that produces no output or times out leaves the previous cached value in place until the next successful run.