From 1177428704eabcdde04b8b4d2b4c2c447fe489b2 Mon Sep 17 00:00:00 2001 From: marcie Date: Fri, 28 Aug 2026 20:47:14 -0500 Subject: [PATCH] =?UTF-8?q?framework=20tools/tmux:=20B1=20round=203=20?= =?UTF-8?q?=E2=80=94=20env=20default=20is=20local-only;=20mktemp=20test=20?= =?UTF-8?q?artifacts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MOSAIC_TMUX_SOCKET no longer leaks into remote sends (-L on a remote host would target the wrong server; codex blocker). - Socket-test outputs moved from fixed /tmp paths to mktemp artifacts cleaned by the trap (parallel-safe; codex should-fix). --- .../mosaic/framework/tools/tmux/agent-send.sh | 5 +++- .../tools/tmux/test-send-message-socket.sh | 25 ++++++++++++------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/mosaic/framework/tools/tmux/agent-send.sh b/packages/mosaic/framework/tools/tmux/agent-send.sh index 68ce783e..fcbcc92c 100755 --- a/packages/mosaic/framework/tools/tmux/agent-send.sh +++ b/packages/mosaic/framework/tools/tmux/agent-send.sh @@ -163,7 +163,10 @@ vflag=""; [ "$VERBOSE" = 1 ] && vflag="-v" # default-socket twin; rc 0 reported honest delivery to the wrong pane). # Socket discovery scans tmux's own socket dir, ${TMUX_TMPDIR:-/tmp}/tmux-UID # (codex PR #1466: TMPDIR is not where tmux keeps -L sockets). -if [ -z "$SOCKET_NAME" ] && [ -n "${MOSAIC_TMUX_SOCKET:-}" ]; then +# MOSAIC_TMUX_SOCKET is LOCAL-host state (launcher-exported): it must not +# leak into remote sends, where -L would target a socket on the remote +# host (codex PR #1466). +if [ -z "$SOCKET_NAME" ] && [ -z "$SSH_TARGET" ] && [ -n "${MOSAIC_TMUX_SOCKET:-}" ]; then SOCKET_NAME="$MOSAIC_TMUX_SOCKET" fi if [ -z "$SOCKET_NAME" ] && [ -z "$SSH_TARGET" ]; then diff --git a/packages/mosaic/framework/tools/tmux/test-send-message-socket.sh b/packages/mosaic/framework/tools/tmux/test-send-message-socket.sh index 79c3434a..4fbbae4e 100755 --- a/packages/mosaic/framework/tools/tmux/test-send-message-socket.sh +++ b/packages/mosaic/framework/tools/tmux/test-send-message-socket.sh @@ -8,8 +8,15 @@ SOCKET="mosaic-test-$RANDOM-$$" TARGET="target-$RANDOM" DEFAULT_TARGET="default-target-$RANDOM" TMPDIR=$(mktemp -d) +ART_OUT=$(mktemp) +AMB_OUT=$(mktemp) +AMB_ERR=$(mktemp) +A2_OUT=$(mktemp) +A2_ERR=$(mktemp) +UNIQ_OUT=$(mktemp) +UNIQ_ERR=$(mktemp) TWIN="twin-$RANDOM-$$" -trap 'tmux -L "$SOCKET" kill-server >/dev/null 2>&1 || true; tmux kill-session -t "$DEFAULT_TARGET" >/dev/null 2>&1 || true; tmux kill-session -t "$TWIN" >/dev/null 2>&1 || true; rm -rf "$TMPDIR"' EXIT +trap 'tmux -L "$SOCKET" kill-server >/dev/null 2>&1 || true; tmux kill-session -t "$DEFAULT_TARGET" >/dev/null 2>&1 || true; tmux kill-session -t "$TWIN" >/dev/null 2>&1 || true; rm -rf "$TMPDIR" $ART_OUT $AMB_OUT $AMB_ERR $A2_OUT $A2_ERR $UNIQ_OUT $UNIQ_ERR' EXIT fail() { echo "FAIL: $*" >&2 @@ -88,10 +95,10 @@ done tmux -L "$SOCKET" new-session -d -s "$TWIN" -c "$TMPDIR" 'PS1="❯ " exec bash --noprofile --norc -i' tmux new-session -d -s "$TWIN" -c "$TMPDIR" 'PS1="❯ " exec bash --noprofile --norc -i' amb_rc=0 -env -u MOSAIC_TMUX_SOCKET "$AGENT_SEND" -s "$TWIN" -m "must refuse" >/tmp/amb.out 2>/tmp/amb.err || amb_rc=$? -[ "$amb_rc" -eq 4 ] || fail "ambiguity refusal: rc=$amb_rc want 4 (stderr: $(cat /tmp/amb.err))" -grep -q "multiple sockets" /tmp/amb.err || fail "ambiguity refusal message missing socket list" -grep -qF "$SOCKET" /tmp/amb.err || fail "ambiguity refusal message does not name the test socket" +env -u MOSAIC_TMUX_SOCKET "$AGENT_SEND" -s "$TWIN" -m "must refuse" >$AMB_OUT 2>$AMB_ERR || amb_rc=$? +[ "$amb_rc" -eq 4 ] || fail "ambiguity refusal: rc=$amb_rc want 4 (stderr: $(cat $AMB_ERR))" +grep -q "multiple sockets" $AMB_ERR || fail "ambiguity refusal message missing socket list" +grep -qF "$SOCKET" $AMB_ERR || fail "ambiguity refusal message does not name the test socket" tmux kill-session -t "$TWIN" >/dev/null 2>&1 || true tmux -L "$SOCKET" kill-session -t "$TWIN" >/dev/null 2>&1 || true @@ -100,8 +107,8 @@ tmux -L "$SOCKET" kill-session -t "$TWIN" >/dev/null 2>&1 || true tmux -L "$SOCKET" new-session -d -s "$TWIN" -c "$TMPDIR" 'PS1="❯ " exec bash --noprofile --norc -i' tmux new-session -d -s "$TWIN" -c "$TMPDIR" 'PS1="❯ " exec bash --noprofile --norc -i' a2_rc=0 -MOSAIC_TMUX_SOCKET="$SOCKET" "$AGENT_SEND" -s "$TWIN" -m "env disambiguated" >/tmp/a2.out 2>/tmp/a2.err || a2_rc=$? -[ "$a2_rc" -eq 0 ] || fail "env disambiguation: rc=$a2_rc (stderr: $(cat /tmp/a2.err))" +MOSAIC_TMUX_SOCKET="$SOCKET" "$AGENT_SEND" -s "$TWIN" -m "env disambiguated" >$A2_OUT 2>$A2_ERR || a2_rc=$? +[ "$a2_rc" -eq 0 ] || fail "env disambiguation: rc=$a2_rc (stderr: $(cat $A2_ERR))" sleep 0.2 a2_pane="$(tmux -L "$SOCKET" capture-pane -t "=$TWIN:0.0" -p)" || fail "cannot capture twin (arm A2)" grep -qF "env disambiguated" <<<"$a2_pane" || fail "env disambiguation did not deliver on the named socket" @@ -115,8 +122,8 @@ tmux -L "$SOCKET" kill-session -t "$TWIN" >/dev/null 2>&1 || true # Arm B: session unique to ONE socket, no -L -> auto-resolve to that socket # and deliver there. uniq_rc=0 -env -u MOSAIC_TMUX_SOCKET "$AGENT_SEND" -s "$TARGET" -m "autoresolved hello" >/tmp/uniq.out 2>/tmp/uniq.err || uniq_rc=$? -[ "$uniq_rc" -eq 0 ] || fail "unique auto-resolution: rc=$uniq_rc (stderr: $(cat /tmp/uniq.err))" +env -u MOSAIC_TMUX_SOCKET "$AGENT_SEND" -s "$TARGET" -m "autoresolved hello" >$UNIQ_OUT 2>$UNIQ_ERR || uniq_rc=$? +[ "$uniq_rc" -eq 0 ] || fail "unique auto-resolution: rc=$uniq_rc (stderr: $(cat $UNIQ_ERR))" sleep 0.2 auto_pane="$(capture_named)" || fail "could not capture named socket pane (arm B)" grep -qF "autoresolved hello" <<<"$auto_pane" || fail "auto-resolution did not deliver to the named-socket pane"