the terminal surface

One terminal per seat, in the server process. The bar names the terminal, its shell and its cwd, and carries the state in words. The screen is the server's own grid, repainted as a VT stream on attach and then fed the shell's bytes.

the surface · raised by the strip's show or a hand-off's Open
back to chat terminal 1 · zsh · /Users/vedhavyas/Projects/forge waiting for you take control Done Not now
sudo needs the account password before the reinstall can runtyping is hidden
vedhavyas@mac-studio:~/Projects/forge $ cargo nextest run -p forge-terminal Compiling forge-terminal v1.2.0 Finished `test` profile [unoptimized + debuginfo] target(s) Running tests/… test result: ok. 32 passed; 0 failed; 0 ignored vedhavyas@mac-studio:~/Projects/forge $ sudo -v Password:
CtrlAltEscTab^C ↑↓←→Enter /-|~
the touch key bar is drawn under pointer: coarse: a finger cannot produce Escape, Tab or an arrow, and every key is a 44px target. Ctrl and Alt are sticky for the next character the soft keyboard types, and the whole bar is inert outside the person's own control: the surface is a viewer then, and the server refuses a keystroke that arrives anyway. A parked hand-off raises the surface as a viewer too - take control there to type. Whoever loses the role reads another client has the keyboard, or the agent took the keyboard when an agent's call took it.
the bar, no ask parked · the person's own door to the keyboard
back to chat terminal 1 · zsh · /Users/vedhavyas/Projects/forge view only take control
while this page holds the role the state says you have control and the door reads release control. One holder at a time, like the browser's controller: another client's take overrides it, an agent's write or hand-off takes it back, and going back to chat gives it up - a lower never keeps the agent out. The person takes it explicitly every time.
the bar while a take is answered · the press, the refusal and the other holder
back to chat terminal 1 · zsh · /Users/vedhavyas/Projects/forge view only taking control...
back to chat terminal 1 · zsh · /Users/vedhavyas/Projects/forge this connection is not viewing that terminal take control
back to chat terminal 1 · zsh · /Users/vedhavyas/Projects/forge another client has the keyboard take control
a take or release is drawn while the server answers - taking control..., releasing... - and a refusal replaces the state line in the server's own words, until the terminal hand-off ask ends, the control push lands or a fresh repaint arrives; the bar carries the parked ask's Done and Not now while that terminal hand-off is the front ask. A client that lost the keyboard to another client's take reads another client has the keyboard; a client that lost it to an agent's call reads the agent took the keyboard.
the strip's row · drawn for every seat; a refused read draws the note
terminal a command is running show terminal waiting for you hide terminal idle show xterminal exited show terminal off start terminal the seat has no session yet - start it first
the states are words as well as colour: a running command, a person's input wanted, idle-but-the-agent's, an exited shell, or no terminal yet. Start is the person's own door on a seat no agent has opened. A seat with no working tree - its read refused - gets no door: the row says why instead.
the hand-off's card · the one thing only the person can do

terminal hand-off · terminal 1

sudo needs the account password before the reinstall can run.

typing is hidden: the program is reading a secret
the agent is blind while this is parked: terminal__read and terminal__write are refused, and the tool gets the ending only. Open terminal raises the surface as a viewer - take control there to type - and the ending hands the keyboard back to the agent. The keystrokes go to the PTY, not into the agent's turn; the shell may echo them, so a read after the hand-off can carry what was typed.