A Textual-based companion to the Dashboard. Same read-only posture, same walk-away promise, rendered in a single pane of glass that fits over SSH.
The TUI is a live monitor over the same session state the Dashboard renders. It does not let you assign work, retry a play, or steer an agent. The footer keys are navigation, inspection, and alarm-time escape hatches, not steering. The policy still picks every play.
Swink AgentShore™ ships two UIs: the Dashboard (the desktop GUI, with the pixel-art floorplan) and the TUI (this page). Both subscribe to the same audit log. Pick whichever fits where you're sitting: on the laptop after dinner, or over SSH from a hotel.
seed_project. Bottom row: Epic Closure with the global bar tracking against 665 tasks, Budget at $0.05 / $200, Work Queue showing 200 issues / 7 PRs / next up #181. The footer lists every binding the TUI exposes, the actual control surface.The TUI was the original interface. It ran the whole loop fine, right up until watching a long session meant wanting to see more activity at a glance. That is what the Dashboard is for: the pixel-art office floorplan, the agent roster, the full theme system. The TUI didn't get retired. It's the same backend behind a simpler, less rich surface.
So you choose how much UI a run gets. Fully headless for CI and scripting, with everything still written to the audit log. The TUI when you like a terminal, or you're on SSH, a thin client, or a machine where you don't want a Tauri window resident in memory. The Dashboard when you want the richest view of what's happening.
Every surface reads the same audit log, and nothing about watching changes the run. Closing one doesn't affect it. Opening another doesn't either. The UIs are observers, not the orchestrator.
Each region renders a slice of the latest session snapshot. None of them are interactive in the steering sense. The footer keys let you navigate, inspect, pause, and end the session, but never assign a play or override the policy mid-tick.
Hidden by default. Only visible when something needs attention: a loop-detection escalation, a feedback-needed prompt, or a session-paused notice. The TUI surfaces the alarm; it does not auto-resolve it.
Up to ten agents in a dense table: live status glyph, name, state, current play, target (issue or PR), elapsed time, context window in use, and dollar cost. The roster the Dashboard renders as sprites, in one screen of text.
A scrollable DataTable of the most recent completed plays, newest first. Each row: play ID, play name, result, the reward delta (Δ) the policy received, cost, and duration. This is the trajectory the policy is learning from, surfaced read-only.
Global closure ratio at the top, then per-epic bars showing closed / total tasks. The background tint shifts low / medium / high as the average alignment crosses thresholds. The same beads-graph signal that drives the policy's alignment reward.
Spent and remaining against the cap. A 20-cell █░ bar with a percentage. The border tints green / amber / red as you cross 50% / 20% remaining. When a wall-clock cap is set, the panel also shows time remaining beside the dollar figure. The headline numbers the Human Engineer set before walking away.
Open issues, how many are ready, how many in progress. Open PRs, blocked, drafts. Reviews queued. The next-up issue title. This is the policy's working set rendered as numbers, not the policy's choice.
One row of RL telemetry: session state, policy mode, total plays, success counts, total cost, failure streak, last play, and how many of the 22 actions are eligible right now vs masked. The compact view of what the policy is doing.
A single row of single-character bindings. Three end the session in different ways, two are escape hatches when the policy is stuck, the rest navigate to subscreens (epics, agent detail, help, palette). Every binding is enumerated below.
Every binding the main TUI exposes is in the footer. Group them three ways: ending the session (graceful or hard), the single pause lever, and navigation into subscreens and inspection views. None of them assign a play, override a decision, or steer an agent.
Once a drain starts, the shutdown screen adds q Quit and r Report, the only place those two keys are live.
Two exits, one pause, five inspection views. Nothing in the set lets you reassign a play, override a single decision, or steer an agent's prompt. If the binding you need isn't there, the answer is upstream: tighter spec, adjusted budget, a hard gate the catalog should have. Not a richer TUI.
The TUI snaps between three layouts based on terminal width. At ≥100 columns you get the full mock above. At 60-99 the play history trims visible rows and the three-up bottom row stacks. At 40-59 only the essentials render. Below 40 the screen replaces itself with an alert telling you to resize. The contract is that the read-only window keeps working no matter where you're SSH'd in from.
Same negative space as the Dashboard. Different rendering, same posture.
:play a command. The policy picks.The Dashboard and the TUI render the same audit. They make the same promise: the run keeps going whether you're watching or not. The whole point of AgentShoring is the walk. The TUI is just the version of the window that fits over SSH.