You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Bilterm v2.9.0 — Persistent SSH+tmux, First-Class Utility Windows, Script Studio & Retro/Google Font Engine
First-Class Utility Windows & Script Studio (Phase 51.2, WIN-01..03, UNI-R01):
FONTS Utility Window (WIN-01, :fonts, :font list, :font presets, :font scan): First-class floating, pinnable, and dockable window for live typography configuration. Unpinned mode dismisses on Enter apply; pinned mode (* or [•]) stays open for instant real-time A/B visual comparison while cycling font presets and custom TTF files. Includes +/- point-size stepping, [/] scale percentage stepping, a apply-to-all toggle, s directory rescan, and menubar integration (View -> Fonts Window).
Pinnable COMMAND PALETTE Window (WIN-02, :commands, :palette): Searchable command window supporting one-shot execution and persistent workbench mode. Pressing Alt+P or * or clicking [•] inside Modal::Palette (Ctrl+P) promotes the search modal into CommandWindowState with query retained. Records command executions, timestamps, exit status, and return messages into a scrollable OUTPUT / HISTORY bottom pane.
SCRIPT STUDIO Window (WIN-03, :script, :studio): Multi-line :colon and shell script editor with live single-step debugging ([⏭ Step (F10)], program counter ▶), full script runner ([▶ Run (F5)]), debugger reset ([↺ Reset]), live action recorder ([● Rec (Ctrl+R)] capturing executed Bilterm commands into the buffer), and secure persistence ([💾 Save] / [📂 Load] under ~/.config/bilterm/scripts/*.bt via secure_fs0600/0700).
Mutual Focus Exclusivity: Opening any utility window or focusing terminal panes automatically blurs other utility windows and releases keyboard ownership cleanly.
Bundled Retro Fonts & Online Font Installers:
Bundled retro fonts: Lazenby Computer (Smooth & Liquid variants) and Google Font VT323 classic DEC pixel terminal font.
On-demand Google Fonts installer: :font google <name-or-url> downloads and activates Google Fonts dynamically.
ZIP / URL font archive installer: :font add <path.zip|url> unpacks and loads custom font archives into ~/.config/bilterm/fonts/.
Real PTY transport & macOS PATH: :ssh-tmux <user@host> [session] spawns a dedicated PTY running ssh -tt into tmux -CC new-session -A -s <name> wrapped in a login shell (exec $SHELL -lc ...) that includes macOS Homebrew and MacPorts paths (/opt/homebrew/bin, /usr/local/bin, /opt/local/bin).
Honest status & password safety: Status honestly reports connecting until the ESC P 1000 p sentinel arrives. Host-key questions and password prompts render interactively in the primary pane with raw keystroke pass-through, bypassing command prompt history, undo/redo buffers, history.log, and Find search indexing.
Supervisor & auto-reconnect with exponential backoff: Deterministic, capped exponential backoff (1s, 2s, 4s, 8s, 16s, 30s; max 20 attempts) automatically reconnects after network drops or transient %exit reasons (server exited unexpectedly, lost tty, too far behind, connection). Never retries fatal auth errors, missing tmux, user disconnects, or cleanly ended sessions.
Topology hydration: Reconnecting panes settle 300 ms, run refresh-client -C, and hydrate screen buffers with capture-pane -p -e -J -S -2000 -t %N, holding live output during hydration to prevent interleaved text corruption. Stale unmapped panes are tagged with orphan banners.
Held exit banners: Exited remote SSH and tmux panes persist with an interactive status banner displaying return code, exit cause, and last diagnostic output lines rather than closing abruptly; click or r respawns in-place.
Honest restore labels: Restoring a saved workspace session no longer marks local shells with remote badges; displays (not connected) until reconnected.
SSH keepalive & fresh TCP policy: Passes ServerAliveInterval=15, ServerAliveCountMax=3, TCPKeepAlive=yes, and ConnectTimeout=15. Sets ControlMaster=no and ControlPath=none for persistent links so every reconnect establishes a fresh TCP connection.
Structured tracing: Structured bilterm::link tracing events (link.connect, link.up, link.down, link.retry, link.give_up, link.control_exit, link.spawn_failed, link.hydrate, pane.exit) with redacted argv (redact_ssh_argv) and zero secret leakage in bilterm.log.
remote.connect_tmux / remote.connect_ssh{tmux_session} returns status: "connecting" rather than connected_ssh_tmux.
TmuxControlBridge::new() starts empty (no longer pre-seeded with %0 -> pane 1).
One persistent remote tmux link can be active at a time; starting a second returns an error instructing to disconnect first.
:ssh pane OpenSSH connection multiplexing uses ControlPersist=10s (shortened from 60s).
Graph edges trace real communication. Edge brightness is a pure function of how often and how recently a pair talked (terminal braille and GUI vector alike). After agents_window.edge_fade_secs (default 60, also :agents fade [secs]) it decays to a floor and never disappears once the pair has spoken.
Communication topology. A bounded, session-long record of which pairs communicated (count, first/last event) that survives the 512-event ring: :agents topology (data over RPC/MCP) and :agents topology export <name> (private 0600 file).
Find window: :find agent|session|history and Ctrl+Alt+F (Phase 50.1). One fuzzy, ranked search over open agents and panes, live and saved sessions, and command history (View > Find Agents / Find Sessions / Find Command History). Every row shows its source ([live], [saved:<name>], [log:<name>]). Secret-looking commands are never stored or indexed; secret-looking history.log lines are masked on read and only counted (n masked). :finder drives the open window. Read-only automation: RPC find.agents, find.sessions, find.history, and MCP bilterm_find (MCP now has 11 tools). Coverage limits (SSH and tmux, raw-mode input, the tmux -CC bridge not reachable from any command) are documented in user guide chapter 12. Bare :find <text> and :search are unchanged except for the three reserved first words.