a73x

ad3765ca

release: v0.0.1-16 — one binary, a wall of hosts, and a one-run handoff

a73x   2026-08-29 17:36

Commit message
release: v0.0.1-16 — one binary, a wall of hosts, and a one-run handoff

One binary, `mux`, and the first word picks a mode: `mux d` the daemon,
`mux a` the agent surface, `mux web` the browser hub, no letter the
client. The wall lists DAEMONS: `$XDG_STATE_HOME/mux/hosts` names boxes,
tiles are each box's live sessions polled once a second, and the host
picker (`Ctrl-\ s`) births, forgets and adds without a key ever reaching
a session. `Ctrl-\ x` ends a session through the daemon, twice when
others hold it. A daemon lives until `mux d stop`; a read never starts
one, and the dial a user asked for runs `ssh HOST 'mux d endpoint
--start'` ONCE — the remote ensures and announces on the same stdout, so
a cold attach is one ssh run where it was three. The handoff's policy is
a step table in handoff.zig, and a warm miss on unchanged coordinates
pays one deadline (2.0 s, was 4.1 s). The browser hub reads the same
hosts file; the old wall file is retired. Daemon frames are nonblocking.

Not in this release: a v0.0.1-15 or older remote answers `mux d endpoint`
with usage and reads `[unreachable]` until it is upgraded by
`mux d stop` then `mux d start` — there is no in-place upgrade across
the rename.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

build.zig
Old New
@@ -818,7 +818,7 @@ comptime {
818 818
819 pub fn build(b: *std.Build) void { 819 pub fn build(b: *std.Build) void {
820 // Single source for both binaries' --version. Bumped at tag time. 820 // Single source for both binaries' --version. Bumped at tag time.
821 const version = "0.0.1-15"; 821 const version = "0.0.1-16";
822 const version_opts = b.addOptions(); 822 const version_opts = b.addOptions();
823 version_opts.addOption([]const u8, "version", version); 823 version_opts.addOption([]const u8, "version", version);
824 824