Typing `exit` (or Ctrl-D) left a dead "process exited" pane behind: the
view marked itself exited, but nothing ever closed the pane or tab.
The reader thread now records whether the pane ended with a *genuine*
child exit (`DaemonMsg::Exited`) as opposed to a daemon disconnect, and
the view surfaces that as a `ChildExited` gpui event. The app subscribes
at the single place all panes are built and closes the emitting leaf:
collapsing its split, or closing the tab when it was the only pane (the
last tab falls back to the home page). The daemon pane is killed so the
session drops it; panes that died while detached clean themselves up on
the next attach, when the daemon replays their exit.
A disconnect deliberately keeps the dead pane visible -- auto-closing
would silently discard (and kill) sessions that may still be alive
daemon-side.
An ssh session dropping mid-TUI (htop, vim, ...) leaves the pane wedged:
the remote app hid the cursor (DECTCEM), entered the alt screen and
enabled mouse reporting, and the restore sequences can never arrive. The
host shell's next prompt then renders with no cursor anywhere, mouse
clicks echo `0;19;42M`-style junk, and scrollback stays broken.
The client's reader thread now scrubs this residue when the daemon
reports a fresh prompt (OSC 133): at that position in the byte stream no
full-screen program owns the pane, so a stranded alt screen, hidden
cursor, mouse/focus reporting, or kitty keyboard flags are provably
stale. Each reset is emitted only when its mode is actually set
(`?1049l` performs a cursor restore when idle, so no blanket resets),
and bracketed paste / application cursor keys are left to the line
editor, which re-arms them on every read. Reattach self-heals the same
way -- the daemon replays the prompt state after the ring.
tty7 is split into two Rust processes: a persistent daemon that owns the
shells and a GPU-rendered client that talks to it over a local socket.
Because the shells live in the daemon, quitting and reopening the app
leaves the session intact — detach and reattach, no tmux required.
- Persistent sessions — the daemon holds the PTYs and child processes, so
closing a window or swapping in a new build never takes a shell down.
- Performance — an 11 MB `cat` completes in 95 ms and DOOM-fire renders at
888 fps; the daemon drains the PTY at device speed off the render path.
- Shell-aware — new tabs and splits open in the current working directory;
zsh, bash, fish, and PowerShell are set up automatically.
- Enhanced prompt — inline completion, syntax highlighting, history, and
in-terminal search, with rich flag/subcommand signatures for common tools.
- Tabs, resizable splits, a command palette, click-to-open links, desktop
notifications, eight themes, and CJK/IME input.
Native builds for macOS, Windows, and Linux.
Built on Zed's gpui and Alacritty's VT core.