Replaces the three shell scripts' logic with one binary. tmux stays the
pane engine; src/session/ is the only module that knows that.
The grid model: coordinates are sparse ordinals, so only their sort order
matters and a socktop group is one cell however many hosts it holds.
Horizontal movement walks a cell's sub-sequence (tiled overview, then each
host zoomed) and leaves only after the last one; entry direction decides
whether you land on the first or last sub-screen. Vertical movement returns
to where you were in that row, and snaps to the nearest column only on the
first visit.
Notable details found while building:
* Unquoted "at: 0x0" is hexadecimal 0 to YAML, and "1x0" is not valid hex,
so only the row-0 entries would break. Deserialization catches the integer
case and names the fix.
* Panes are addressed by tmux id, never index, and each command is wrapped
so the pane outlives it. v1's remain-on-exit cannot do this: it is a
per-window option that new windows do not inherit, so a monitor that exits
during construction destroys its window and the next split fails with
"no current target". Now a dead monitor stays on screen with its status.
* Contact-count averaging, not summing: a panel reporting one finger as
three contacts must not look like three times the travel.
* Movement subcommands wait for the move to happen and report where they
landed, so they are scriptable rather than fire-and-forget.
36 tests: the grid model, the gesture classifier and an end-to-end pass
against a real tmux server.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>