# Inter-Agent tmux Comms — Standard & Tooling Reliable, self-identifying messaging between Mosaic agents running in tmux panes (Claude Code / Codex / OpenCode REPLs), across hosts. ## The addressing standard (required) Every cross-agent tmux message MUST begin with an addressing preamble: ``` [: -> :] ``` - `host` = `hostname -s` of the machine the agent runs on (e.g. `web1`, `sb-it-mgr-0-lt`). - `session` = the tmux session name (e.g. `mos-claude`, `rev0-4`, `installer-1`). - **Replies FLIP the preamble**: the recipient answers with `[ -> ] ...`. Why: a fresh or context-wiped agent always knows who sent a message and to whom. No ambiguity about origin or lane after a tmux wipe / session restart. Example exchange: ``` [web1:mos-claude -> sb-it-mgr-0-lt:installer-1] status on #29? [sb-it-mgr-0-lt:installer-1 -> web1:mos-claude] Q2 done, opening PR #34. ``` ## The helper: `agent-send.sh` Prepends the preamble automatically (auto-detecting your own `host:session`) and delivers reliably to local OR remote panes. ```bash # Local target (same host) agent-send.sh -s -m "message" # Remote target (over ssh) agent-send.sh -H user@host -s -m "message" # From a file / stdin agent-send.sh -H user@host -s -f msg.txt echo "msg" | agent-send.sh -s ``` Key flags: `-s` dst session (required) · `-H` ssh target for remote · `-n` dst hostname for the preamble (else auto-resolved) · `-m`/`-f`/stdin body · `-S` override source label · `-v` verbose · `-r N` Enter-flush attempts. ## Why a helper exists (the submission gotcha) Pasting into an interactive REPL via raw `tmux send-keys` is unreliable: a trailing `Enter` is frequently swallowed and the message sits as an **unsubmitted draft** ("Press up to edit queued messages"). Over an `ssh -> nested tmux` hop the plain `Enter` keyname often does not register at all — `C-m` is needed. `send-message.sh` solves this for a **local** pane: bracketed-paste the body (so multi-line content doesn't submit early), pause, then send `Enter` as its own keystroke and flush with a second, verifying against a draft heuristic. `agent-send.sh` solves the **remote** case by _shipping `send-message.sh` over ssh_ (`ssh host bash -s -- ... < send-message.sh`) and running it local to the target pane — so the reliable send-keys always happens on the pane's own host. The remote needs only `bash` + `tmux` + `base64`; **no mosaic install required there**. The message crosses the wire as base64 (`-b`) to avoid all shell-quoting hazards. ## Files - `agent-send.sh` — inter-agent wrapper (preamble + local/remote dispatch). - `send-message.sh` — low-level reliable single-pane submitter (`-b` base64 input). ## Distribution These live in the installed framework copy at `~/.config/mosaic/tools/tmux/`. `install.sh` rsyncs the framework **source tree** to each host, so to propagate permanently, land both files in the framework source repo and re-run the installer on each host. Until then, `agent-send.sh` already works against any reachable host because it ships `send-message.sh` over ssh per-send — no pre-install on the target host is needed to _send to_ it.