pub struct TearPane {
pub id: PaneId,
pub shell: String,
pub args: Vec<String>,
pub cwd: Option<String>,
pub env: Vec<(String, String)>,
pub size_cells: (u16, u16),
pub origin_cells: (u16, u16),
pub state: PaneState,
pub title: String,
pub input_policy: InputPolicy,
pub yurai: Yurai,
}Expand description
One pane: the typed metadata about a running terminal session +
its renderable state. The actual PTY handle, terminal-state-machine
grid, and reader/writer tasks live in tear-core::InProcess —
this struct is the serde-friendly typed surface that crosses the
daemon-RPC boundary and is consumed by mado.
Fields§
§id: PaneId§shell: StringShell command executed in this pane (e.g. "/run/current-system/sw/bin/zsh").
args: Vec<String>Optional arguments passed after the shell command.
cwd: Option<String>Working directory at spawn time. None means inherit from the
session.
env: Vec<(String, String)>Environment overrides applied to this pane’s child only —
e.g. TERM=xterm-ghostty, COLORTERM=truecolor. Merged on top
of the parent environment.
size_cells: (u16, u16)Current pane size in terminal cells (cols, rows). The multiplexer keeps this in sync with the actual PTY winsize.
origin_cells: (u16, u16)Cell at the top-left within the parent window (0, 0)-based. Computed by the layout engine; serialised so the daemon can hand mado a render-ready snapshot.
state: PaneStateLifecycle state.
title: StringTitle — operator-set (via OSC 2) or derived from the running program. Drives status-bar segment rendering.
input_policy: InputPolicyInput acceptance policy. Default Free accepts input from
every connected client (mado, tear send-keys, MCP); the
daemon writes the bytes verbatim to the PTY in the order
they arrive. Locked rejects every send_keys with a typed
error — useful for “demo / observer” sessions, AI-driven
panes where human input would interleave with the agent,
or for the migration handoff window. New variants
(Leader, OwnerOnly) land alongside Subscribe-assigned
client identity in a future iteration.
yurai: YuraiProvenance — what kind of actor spawned this pane.
Stamped ONCE at spawn from the creating connection’s
crate::shutai::Shutai and never rewritten. This is the field
freio filters on: the brake stops automation-driven panes and
leaves the operator’s own alone.
It is a lossy PROJECTION of a shutai, not a shutai, and the reason
is structural — a pane outlives the connection that made it, and
Shutai deliberately has no Deserialize while this struct
derives one, so holding a live identity here does not compile. See
crate::yurai.
#[serde(default)] → Yurai::Unknown, which is exactly what a
record from a pre-yurai daemon honestly means.