Repository navigation
Five fixes in the daemon and pane-addressing layers. The coordination protocol is unchanged.
- One daemon per socket. Concurrent auto-starts (parallel hooks) could bind several daemons to one path, because
asyncio.start_unix_serverunlinks an existing socket before binding.servenow holds anflockon<socket>.lockfor its lifetime, binds the socket itself, and unlinks only the inode it bound. - Waits are pinned to the occupant they started on. Records carry an
instancethat bumps when an id moves to another pane, or to the same pane number on another tmux server. A re-registered id can no longer wake a waiter that was waiting on the old one.--prefixwaits stay unpinned. - Hook reports are retried.
hookretries once (1 s, then 2 s) and logs a lost report to~/.herdlet.loginstead of dropping it silently. sendinto a bare shell works again. A shell pane has no TUI input box, so verified send refused it with exit 6. It now types the line unverified and says so on stderr. TUI panes without an input box still exit 6.- Pane ids are per tmux server. Records carry the server socket, and every pane operation (peek, send, approve, resume, kill, the
limitedsweep,list) uses the record's server, so a daemon on server A never reads or kills a same-numbered pane on server B.
Restart the daemon after upgrading: pkill -f 'herdlet.*serve', then any herdlet command. Old persisted records gain the new fields at read time.