- Ya
- 4 Septemba 2026, 20:42 UTC
- Mwandishi
- Kamo
- Ahadi ya
- a13dbe1
## Terminals is now two views of one machine Sub-tabs rather than two top-level tabs, because they are not two destinations: a terminal is a shell that may be running a session, a session is a conversation that may have a shell. The switch is a segmented control, not a second MUI Tabs strip — two tab bars stacked read as chrome, a segmented rail reads as "one of these two", which is what it is. Each half carries its own create, so a single `+` up in the navigator header (which could only ever mean one of them) is now shown only while collapsed, where neither row fits. TerminalsWorkbench is shared by the Interaction Center and the maximized navigator, exactly as TerminalsPane already was, so the two cannot drift. It takes the terminal list as a prop rather than polling again — both surfaces already hold it. ## Two verbs, and which one appears IS the state A session already running in a terminal says **Open** and raises that window. One that is not says **Resume** and opens a terminal that picks it back up. Never both, and never a disabled row. Resuming a session that is already attached gives one conversation two heads: both CLIs write to the same transcript and the second opens by replaying what the first is in the middle of. The rule is one function, `terminalForSession`, so nothing can answer it twice and differently. the machine leaves a receipt the moment it prepares one — and says so rather than offering to resume something that has not been written yet. Sessions are grouped by day. Four hundred of them in one flat column is a wall; the same four hundred under Today / Yesterday / Earlier this week / Before that is a list you can find yesterday afternoon in. The list keeps the surrounding rules: the same row geometry and 3px rail as the terminal list, and the same typographic split — what a person or the model wrote is set in the interface's sans, what the machine reports is set in the emulator's mono. Nothing here can ask for a permission mode. Every session starts with permissions bypassed and that is decided on the dev machine; the request names which session and nothing else. A test pins that the client cannot grow such a parameter. ## The terminal's own scrollbar xterm draws the browser's grey bar on its viewport, which can only offer "a bit up" and "a bit down". In a terminal the two ends are not two more positions — they are the two places you actually want, the start of what you ran and the live prompt — so each gets a button: jump-to-start above the up arrow, jump-to-end below the down arrow, with press-and-hold repeat on the arrows, click-to-page on the track and a draggable thumb. xterm's own bar is hidden, not restyled; the viewport still scrolls, so wheel, trackpad and touch are unchanged. The jump-to-end button lights when output has arrived below the fold. A terminal that has stopped following looks exactly like one that has finished, and that is the only thing the bar knows that the reader cannot see. ## Verification The full gate: 14 source guards and 5322 tests, plus tsc. The new UI was also rendered in a browser from a local harness and read rather than assumed — which caught a transparent verb chip showing the truncated title through the word "Resume", and an empty state that flashed over a machine with four hundred sessions because `loading` is still false on the render before the effect runs. axe-core reports zero WCAG AA violations across the new components. The workbench carries its own MotionConfig: the Interaction Center wraps its panel in one, the navigator does not, and framer-motion outside one animates straight through prefers-reduced-motion without a word. Dictionary keys landed first, as CI requires.