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
feat(tmux): deva-tmux — tmux as a built-in module, both transports
tmux interaction was four loose scripts with zero deva.sh integration;
the #406 draft built the right transport (ssh) but deleted the socat
fallback and stayed a loose script. This makes it a module:
- scripts/deva-tmux (baked into both images): ls/attach/tmux/bridge/
setup/doctor over two transport backends. ssh default: authenticated,
reboot-durable, runs the HOST's tmux client so there is no
client/server protocol coupling. socat fallback: the old
unauthenticated TCP daemon, kept for hosts without sshd, loud warning
on every start. Both land on /tmp/host-tmux.sock — tmux-bridge
(Layer 2) and htmux muscle memory work unchanged.
- Inert without provisioning: baked binary + no key + no daemon = no
host reach. deva.sh --host-tmux is the opt-in — mounts ~/.ssh
read-only (dedup-safe, user -v wins), passes DEVA_HOST_USER, and in
repo mode mounts the launcher's deva-tmux over the image copy.
- deva.sh tmux command group (host side): setup writes your OWN
authorized_keys — the #406 draft did that from inside the container
via a docker host-mount, exactly the host-reach pattern this tool
exists to gate; moving it host-side deletes the scariest code.
host-daemon start|stop|status wraps the socat daemon (inline
fallback for installed launchers). doctor for the host view.
- deva-bridge-tmux becomes a compat shim (old flags -> env ->
deva-tmux bridge start --transport socat --foreground);
deva-bridge-tmux-host unchanged; tmux-bridge stays vendored
byte-for-byte.
- Fixed in live testing: a backgrounded ssh -N -L inherited the
caller's stdout, so piping 'bridge start' hung forever waiting for
EOF (the #406 draft shared this bug). Bridge children now detach
stdio to a state-dir log.
Verified live against a real macOS host from inside a container: both
transports bridge the host server onto the socket, native tmux client
and tmux-bridge Layer 2 drive real panes through it, lifecycle
idempotent, socket cleaned on stop. Mount-shape suite asserts the
off/on/dedup provisioning shapes.
Close#412
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: DEV-LOGS.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,6 +13,16 @@
13
13
- Minimal markdown markers, no unnecessary formatting, minimal emojis.
14
14
- Reference issue numbers in the format `#<issue-number>` for easy linking.
15
15
16
+
# [2026-07-10] Dev Log: deva-tmux — tmux as a built-in module, both transports #412
17
+
- Why: tmux interaction was four loose scripts with zero deva.sh integration; #406 built the right transport (ssh) but deleted the socat fallback and stayed a loose script. Direction split matters: host->container (deva.sh shell) and agent<->agent (tmux-bridge) keep the sandbox; container->host breaks it and must be opt-in.
18
+
- What:
19
+
- scripts/deva-tmux (new, baked into both images): ls/attach/tmux/bridge/setup/doctor with transport backends — ssh default (authenticated, launchd-durable, host-side tmux client so zero protocol coupling), socat fallback (unauthenticated TCP, warns loudly). DEVA_TMUX_TRANSPORT=auto|ssh|socat; auto probes ssh then socat. Both transports land on /tmp/host-tmux.sock -> tmux-bridge Layer 2 unchanged
20
+
- inert-without-provisioning is the security property: baked binary + no key + no daemon = no host reach. deva.sh --host-tmux is the opt-in: mounts ~/.ssh ro (dedup-safe, user -v wins), passes DEVA_HOST_USER, launcher's deva-tmux copy overrides the image copy in repo mode (skew insurance)
21
+
- deva.sh tmux command group (host side): setup writes your OWN authorized_keys — the #406 draft did this from inside the container via a docker host-mount, which is exactly the host-reach pattern the tool exists to gate; moving it host-side dissolved the scariest code. host-daemon start|stop|status wraps the socat daemon (inline fallback when scripts/ absent). doctor for the host view
22
+
- deva-bridge-tmux -> compat shim (old flags -> env -> deva-tmux bridge start --transport socat --foreground); deva-bridge-tmux-host unchanged; tmux-bridge stays vendored byte-for-byte (read-guard TTL idea goes upstream, not a fork)
23
+
- found+fixed in live test: backgrounded ssh -N -L inherited the caller's stdout, so `deva-tmux bridge start | tail` hung forever waiting for EOF — the #406 draft had the same latent bug. Bridge children now detach stdio to a state-dir log
24
+
- Result: verified live against a real macOS host from inside the dev container — doctor sees both transports, ssh bridge + socat bridge both land the host server on the socket, native tmux client and tmux-bridge list work through it, lifecycle idempotent, socket cleaned on stop; mount-shape suite asserts off/on/dedup provisioning shapes; shellcheck severity=error clean
25
+
16
26
# [2026-07-10] Dev Log: repo surface burnish #409
17
27
- Why: product ships four agents but half the storefront said three; agents visiting the repo had no llms.txt; nightly 2026-07-09 failed on a transient ubuntu mirror sync and partially published (base pushed, rust did not — nightly/nightly-rust tags diverged a day)
0 commit comments