Skip to content

Status bar

The footer — the terminal's bottom two rows — is a registry-driven surface: not a hardcoded component, but entries any plugin can register through blueStatus. A shell component arranges entries into at most two bands: row one with a left and right cluster, row two with a right cluster.

Layout and gray tiers

Entries connect with two-space slots — no separator glyphs; brightness tiers build the hierarchy (the kimi visual identity):

TierColorCarries
Brightesttextmodel, context — what you read every turn
Middlemutedcwd, git badge, session title

(The dimmest textMuted tips tier retired with the S30 footer swap — teaching tips now ride only the activity pane's spinner rows.)

Built-in entries

EntryPriorityPositionContent
blue-status-basic0row 1 leftmodel name (persisted request header, falling back to agent options; text tier)
blue-status-mode2row 1 leftsession-mode badge: plan (accent tier, pending ellipsis while messages are queued) or yolo (warning tier); renders nothing in normal (see Session modes)
blue-status-cwd5row 1 leftsession cwd (home shortened to ~, deep paths to the last three segments; muted tier)
blue-status-git10row 1 leftfull badge branch [+a -d ↑e↓f] (TTL-cached probe: branch 5s / status 15s; hidden outside a git repository)
blue-status-context20row 2 rightlatest step's context occupancy: context: N% (K/M) with a window, degrading to ctx N without (text tier)
blue-status-title30row 1 rightthe session title folded from the harness sessionTitle service (muted tier; the slot the rotating tips occupied before the S30 footer swap; hidden while untitled)

A running agent's status is not in the footer — that's the activity pane's job (see Bottom panes).

Ordering and yielding

  • same band and cluster sort by ascending priority (registration order on ties);
  • right clusters right-align and yield before left ones under width pressure;
  • each entry truncates within its cluster budget; entries that fit neither row drop lowest-priority-first.

Contributing

Registering an entry means implementing BlueStatusEntry:

ts
ctx.blueStatus.register({
  id: 'my-plugin.build',        // stable dotted plugin-owned string; duplicates rejected
  priority: 15,                 // built-ins occupy 0/2/5/10/20/30 — gaps are yours
  row: 1,                       // band: 1 (default) or 2
  align: 'left',                // side: 'left' (default) or 'right'
  render: (width) => myLine,    // one styled line within budget; '' sits this frame out
})

Wrap registration in ctx.effect — the entry unregisters with the plugin fiber.

Preview · v0.1.0-rc.1