#!/bin/bash # agent-text — text Craig's phone over Signal, from any machine or agent runtime. # The Signal half of the notification vocabulary: "text me" reaches the phone, # "page me" is the desktop channel (notify). See protocols.org "Reaching Craig". # # Usage: agent-text # # The Signal identity (+15045173983) is registered in velox's signal-cli, and # any daily driver linked as a device of that account (ratio, 2026-07-20) can # send directly too. So the dispatch is: if the account is registered in the # local signal-cli, send directly; otherwise ssh-relay the send to velox over # the tailnet. A direct send from a linked device still lands when velox is # down (the reason ratio was linked). The recipient is Craig's Signal account # UUID; his phone number reads as unregistered in Signal's directory, so never # target the number. Verified end to end 2026-07-13 (velox) and 2026-07-20 # (ratio, direct). # # This is the AWAY channel. At his desk, use the desktop channel instead: # notify info "Title" "Message" --persist # See protocols.org "Reaching Craig" for choosing between them. # # Known caveats (full runbook in rulesets docs/design/): a relay from a # non-linked machine needs velox up on the tailnet, and each device holding the # account wants a periodic `receive` (staleness warnings appear otherwise); the # signal-receive timer handles that. # # Source: ~/code/rulesets/claude-templates/bin/agent-text # Install: make -C ~/code/rulesets install SIGNAL_ACCOUNT="+15045173983" CRAIG_UUID="b1b5601e-6126-47f8-afaa-0a59f5188fde" VELOX_HOST="velox.tailf3bb8c.ts.net" if [ $# -eq 0 ]; then echo "usage: agent-text " >&2 exit 2 fi msg="$*" # The account is local if this machine's signal-cli holds it: the registered # primary (velox) or any linked device. Those send directly. if signal-cli listAccounts 2>/dev/null | grep -q "$SIGNAL_ACCOUNT"; then signal-cli -a "$SIGNAL_ACCOUNT" send -m "$msg" "$CRAIG_UUID" rc=$? else # printf %q hardens the message for the remote shell. ssh -o BatchMode=yes -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new \ "$VELOX_HOST" \ "signal-cli -a $SIGNAL_ACCOUNT send -m $(printf '%q' "$msg") $CRAIG_UUID" rc=$? fi if [ "$rc" -ne 0 ]; then echo "agent-text: phone message failed (velox down or unreachable?); fall back to the desktop channel: notify info 'Message' '' --persist" >&2 fi exit "$rc"