From c2a48fa35808fa2c0444c6c3d4f2b5ed4416625d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Pe=C5=A1ek?= Date: Thu, 5 Nov 2026 20:07:56 +0100 Subject: [PATCH] feat(fleet): make bazina default for af; add unique identifier and architecture sign to bin-env, fleet-id, and fleet-beacon --- af | 73 +++++++++++++++++++++++++++------------------------- bin-env | 37 ++++++++++++++++++++++---- fleet-beacon | 3 +++ fleet-id | 31 ++++++++++++++++++++++ 4 files changed, 104 insertions(+), 40 deletions(-) mode change 100644 => 100755 bin-env create mode 100755 fleet-id diff --git a/af b/af index 59c2246..dbd18c2 100755 --- a/af +++ b/af @@ -1,48 +1,51 @@ #!/usr/bin/env bash # ~/bin/af - Antigravity Fleet Unified Session Connector -# Attaches to the central persistent Antigravity CLI session on bazina. +# Attaches to the central persistent Antigravity CLI session (default: bazina). SESSION_NAME="agy" -CENTRAL_HOST="bazina" -CENTRAL_IP="192.168.1.104" -CENTRAL_LEGACY_IP="10.0.0.15" +DEFAULT_HOST="bazina" +DEFAULT_IP="192.168.1.104" +FALLBACK_HOST="boxC" +FALLBACK_IP="192.168.1.101" REMOTE_PORT="2222" EXTERNAL_HOST="home" +DEFAULT_CONV="9860fe31-3526-48d1-9063-3e58e630faf9" -# Ensure -c (continue previous session) is always included unless already specified -HAS_CONTINUE=false -for arg in "$@"; do - if [[ "$arg" == "-c" || "$arg" == "--continue" || "$arg" == --conversation* ]]; then - HAS_CONTINUE=true - break - fi -done - -if [[ "$HAS_CONTINUE" == false ]]; then - AGY_ARGS=("-c" "$@") -else - AGY_ARGS=("$@") +# Determine current node +CURRENT_HOST="$(hostname -s 2>/dev/null || uname -n)" +if [ -n "$TERMUX_VERSION" ] || [ -d "/data/data/com.termux" ]; then + CURRENT_HOST="phone" fi -# Determine current hostname -CURRENT_HOST="$(hostname)" +# Build agy conversation parameter if not already supplied +AGY_INVOCATION="agy" +if [[ "$*" != *"--conversation"* ]] && [[ -n "$DEFAULT_CONV" ]]; then + AGY_INVOCATION="agy --conversation=$DEFAULT_CONV" +fi -# Prevent tmux nesting error if already inside another tmux session -unset TMUX - -if [[ "$CURRENT_HOST" == "$CENTRAL_HOST" ]]; then - # Already on central node (bazina): attach or create local tmux session - exec tmux new-session -A -s "$SESSION_NAME" agy "${AGY_ARGS[@]}" -else - # Remote node (t520, boxC, penguin, or phone) - CMD_ARGS=$(printf "%q " "${AGY_ARGS[@]}") - - # 1. Try local LAN first (by hostname or IP) - if ping -c 1 -W 1 "$CENTRAL_HOST" &>/dev/null || ping -c 1 -W 1 "$CENTRAL_IP" &>/dev/null || ping -c 1 -W 1 "$CENTRAL_LEGACY_IP" &>/dev/null; then - exec ssh -t "$CENTRAL_HOST" "tmux new-session -A -s '$SESSION_NAME' agy $CMD_ARGS" +if [[ "$CURRENT_HOST" == "bazina" ]]; then + # Already on default node (bazina): attach or create local tmux session + exec tmux new-session -A -s "$SESSION_NAME" $AGY_INVOCATION "$@" +elif [[ "$CURRENT_HOST" == "boxC" || "$CURRENT_HOST" == "B" ]]; then + # On boxC: connect to bazina if reachable, otherwise fall back to local boxC session + if ping -c 1 -W 1 "$DEFAULT_IP" &>/dev/null || ssh -o BatchMode=yes -o ConnectTimeout=2 "$DEFAULT_HOST" "true" &>/dev/null; then + exec ssh -t "$DEFAULT_HOST" "tmux new-session -A -s '$SESSION_NAME' $AGY_INVOCATION $*" else - # 2. Fallback to external SSH via home gateway (boxC) jumping to bazina - echo "LAN connection to $CENTRAL_HOST unreachable, attempting external fallback via $EXTERNAL_HOST..." - exec ssh -p "$REMOTE_PORT" -t "$EXTERNAL_HOST" "ssh -t '$CENTRAL_HOST' \"tmux new-session -A -s '$SESSION_NAME' agy $CMD_ARGS\"" + echo "[af] bazina is unreachable from boxC; falling back to local boxC session..." + exec tmux new-session -A -s "$SESSION_NAME" $AGY_INVOCATION "$@" + fi +else + # Remote node (t520, penguin, android/phone, etc.) + # 1. Try default node (bazina) on LAN + if ping -c 1 -W 1 "$DEFAULT_IP" &>/dev/null || ssh -o BatchMode=yes -o ConnectTimeout=2 "$DEFAULT_HOST" "true" &>/dev/null; then + exec ssh -t "$DEFAULT_HOST" "tmux new-session -A -s '$SESSION_NAME' $AGY_INVOCATION $*" + # 2. Fallback to boxC on LAN + elif ping -c 1 -W 1 "$FALLBACK_IP" &>/dev/null || ssh -o BatchMode=yes -o ConnectTimeout=2 "$FALLBACK_HOST" "true" &>/dev/null; then + echo "[af] bazina unreachable; falling back to boxC on LAN..." + exec ssh -t "$FALLBACK_HOST" "tmux new-session -A -s '$SESSION_NAME' $AGY_INVOCATION $*" + # 3. Fallback to external SSH via home gateway + else + echo "[af] LAN unreachable; attempting external gateway fallback..." + exec ssh -p "$REMOTE_PORT" -t "$EXTERNAL_HOST" "tmux new-session -A -s '$SESSION_NAME' $AGY_INVOCATION $*" fi fi diff --git a/bin-env b/bin-env old mode 100644 new mode 100755 index 2b5e857..9be921f --- a/bin-env +++ b/bin-env @@ -1,14 +1,41 @@ -# ~/bin/bin-env — Architecture-Aware Fleet Path Setup -# Sourced in ~/.bashrc and ~/.zshrc across t520, bazina, boxC, penguin, phone +# ~/bin/bin-env — Architecture-Aware Fleet Path & Identity Setup +# Sourced in ~/.bashrc and ~/.zshrc across t520, bazina, boxC, penguin, android _ARCH="$(uname -m)" -if [ -d "$HOME/bin/arch/$_ARCH" ]; then +export FLEET_ARCH="$_ARCH" + +# Determine unique fleet node ID +if [ -n "$TERMUX_VERSION" ] || [ -d "/data/data/com.termux" ]; then + export FLEET_NODE="android" +elif [ -f "/etc/fleet_id" ]; then + # Load explicit machine identifier if present + . /etc/fleet_id 2>/dev/null || true +fi + +if [ -z "$FLEET_NODE" ]; then + _HOST="$(hostname -s 2>/dev/null || uname -n)" + case "$_HOST" in + t520*|workstation*) export FLEET_NODE="t520" ;; + bazina*) export FLEET_NODE="bazina" ;; + boxC*|B) export FLEET_NODE="boxC" ;; + penguin*|crostini*) export FLEET_NODE="penguin" ;; + localhost|android*) export FLEET_NODE="android" ;; + *) export FLEET_NODE="$_HOST" ;; + esac + unset _HOST +fi + +export FLEET_SIGN="[${FLEET_NODE}:${FLEET_ARCH}]" + +# Architecture-specific binary path +if [ -d "$HOME/bin/arch/$FLEET_ARCH" ]; then case ":$PATH:" in - *":$HOME/bin/arch/$_ARCH:"*) ;; - *) export PATH="$HOME/bin/arch/$_ARCH:$PATH" ;; + *":$HOME/bin/arch/$FLEET_ARCH:"*) ;; + *) export PATH="$HOME/bin/arch/$FLEET_ARCH:$PATH" ;; esac fi +# General ~/bin path case ":$PATH:" in *":$HOME/bin:"*) ;; *) export PATH="$HOME/bin:$PATH" ;; diff --git a/fleet-beacon b/fleet-beacon index 1c85651..6ecd024 100755 --- a/fleet-beacon +++ b/fleet-beacon @@ -138,6 +138,9 @@ def main(): payload = { "name": hostname, "hostname": hostname, + "node": hostname, + "arch": os.uname().machine, + "sign": f"[{hostname}:{os.uname().machine}]", "timestamp": time.time(), "cpu_percent": cpu_pct, "mem_used_gb": mem_used, diff --git a/fleet-id b/fleet-id new file mode 100755 index 0000000..839b4fb --- /dev/null +++ b/fleet-id @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# fleet-id: Print unique identifier, architecture, and badge for current fleet node + +if [ -z "$FLEET_NODE" ] || [ -z "$FLEET_ARCH" ]; then + [ -f "$HOME/bin/bin-env" ] && source "$HOME/bin/bin-env" 2>/dev/null || true +fi + +FLEET_NODE="${FLEET_NODE:-$(hostname -s 2>/dev/null || uname -n)}" +FLEET_ARCH="${FLEET_ARCH:-$(uname -m)}" +FLEET_SIGN="${FLEET_SIGN:-[${FLEET_NODE}:${FLEET_ARCH}]}" + +case "$1" in + --node|-n) + echo "$FLEET_NODE" + ;; + --arch|-a) + echo "$FLEET_ARCH" + ;; + --sign|-s) + echo "$FLEET_SIGN" + ;; + --json|-j) + printf '{"node":"%s","arch":"%s","sign":"%s","hostname":"%s"}\n' \ + "$FLEET_NODE" "$FLEET_ARCH" "$FLEET_SIGN" "$(hostname 2>/dev/null || uname -n)" + ;; + *) + echo "FLEET_NODE=$FLEET_NODE" + echo "FLEET_ARCH=$FLEET_ARCH" + echo "FLEET_SIGN=$FLEET_SIGN" + ;; +esac