117 lines
4.2 KiB
Bash
Executable file
117 lines
4.2 KiB
Bash
Executable file
#!/bin/sh
|
|
# scripts/glass.sh — Launch the Clawdie glass-pane tmux session.
|
|
#
|
|
# Layout:
|
|
# ┌──────────────────────┬──────────────┐
|
|
# │ gateway / pi │ aider │
|
|
# ├──────────────────────┴──────────────┤
|
|
# │ btop │
|
|
# └─────────────────────────────────────┘
|
|
#
|
|
# Usage:
|
|
# scripts/glass.sh # create or attach
|
|
# scripts/glass.sh kill # destroy session
|
|
# GLASS_ATTACH=0 scripts/glass.sh # create only, don't attach
|
|
|
|
PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
|
|
|
require_command() {
|
|
if ! command -v "$1" >/dev/null 2>&1; then
|
|
echo "Missing required command: $1" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
read_env_value() {
|
|
key="$1"
|
|
file="$2"
|
|
if [ ! -f "$file" ]; then
|
|
return 1
|
|
fi
|
|
grep "^${key}=" "$file" 2>/dev/null | head -1 | cut -d= -f2- | sed "s/^[\"']//; s/[\"']$//"
|
|
}
|
|
|
|
resolve_bin() {
|
|
preferred="${1:-}"
|
|
fallback_path="${2:-}"
|
|
fallback_name="$3"
|
|
if [ -n "$preferred" ]; then
|
|
printf '%s\n' "$preferred"
|
|
return 0
|
|
fi
|
|
if [ -n "$fallback_path" ] && [ -x "$fallback_path" ]; then
|
|
printf '%s\n' "$fallback_path"
|
|
return 0
|
|
fi
|
|
if command -v "$fallback_name" >/dev/null 2>&1; then
|
|
command -v "$fallback_name"
|
|
return 0
|
|
fi
|
|
echo "Missing required command: $fallback_name" >&2
|
|
exit 1
|
|
}
|
|
|
|
require_command tmux
|
|
require_command btop
|
|
|
|
# Service name is the constant 'clawdie' baked into code; no env read.
|
|
# Tenant id is optional and only used when running an additive tenant.
|
|
if [ -z "${TENANT_ID:-}" ]; then
|
|
TENANT_ID="$(read_env_value TENANT_ID "$PROJECT_DIR/.env" || true)"
|
|
fi
|
|
if [ -n "$TENANT_ID" ]; then
|
|
SESSION_DEFAULT="${TENANT_ID}-glasspane"
|
|
else
|
|
SESSION_DEFAULT="glasspane"
|
|
fi
|
|
SESSION="${GLASS_SESSION_NAME:-$SESSION_DEFAULT}"
|
|
PI_BIN_OVERRIDE="${PI_TUI_BIN:-$(read_env_value PI_TUI_BIN "$PROJECT_DIR/.env" || true)}"
|
|
AIDER_BIN_OVERRIDE="${AIDER_BIN:-$(read_env_value AIDER_BIN "$PROJECT_DIR/.env" || true)}"
|
|
PI_BIN="$(resolve_bin "$PI_BIN_OVERRIDE" "/home/clawdie/.npm-global/bin/pi" "pi")"
|
|
AIDER_BIN="$(resolve_bin "$AIDER_BIN_OVERRIDE" "" "aider")"
|
|
AIDER_FLAGS="${GLASS_AIDER_FLAGS:---no-check-update --no-show-model-warnings --yes-always}"
|
|
ATTACH_MODE="${GLASS_ATTACH:-1}"
|
|
|
|
if [ "${1:-}" = "kill" ]; then
|
|
tmux kill-session -t "$SESSION" 2>/dev/null && echo "Session '$SESSION' killed." || echo "No session to kill."
|
|
exit 0
|
|
fi
|
|
|
|
if tmux has-session -t "$SESSION" 2>/dev/null; then
|
|
if [ "$ATTACH_MODE" = "0" ]; then
|
|
echo "Session '$SESSION' already exists."
|
|
exit 0
|
|
fi
|
|
exec tmux attach-session -t "$SESSION"
|
|
fi
|
|
|
|
# ── Create session ─────────────────────────────────────────────────────────────
|
|
|
|
tmux new-session -d -s "$SESSION" -n glass -x 220 -y 50
|
|
tmux set-window-option -t "$SESSION:0" automatic-rename off >/dev/null
|
|
|
|
# ── Window 0: glass — gateway/pi (left) | aider (right) ────────────────────────
|
|
tmux split-window -t "$SESSION:0.0" -h -p 35
|
|
|
|
tmux select-pane -t "$SESSION:0.0" -T "gateway / pi"
|
|
tmux send-keys -t "$SESSION:0.0" "cd '$PROJECT_DIR' && '$PI_BIN'" Enter
|
|
|
|
tmux select-pane -t "$SESSION:0.1" -T "aider"
|
|
tmux send-keys -t "$SESSION:0.1" "cd '$PROJECT_DIR' && '$AIDER_BIN' $AIDER_FLAGS" Enter
|
|
|
|
# ── Window 1: btop — full terminal height ─────────────────────────────────────
|
|
tmux new-window -t "$SESSION:1" -n btop
|
|
tmux set-window-option -t "$SESSION:1" automatic-rename off >/dev/null
|
|
tmux select-pane -t "$SESSION:1.0" -T "btop"
|
|
tmux send-keys -t "$SESSION:1.0" "btop" Enter
|
|
|
|
# Focus window 0, gateway/pi pane on attach
|
|
tmux select-window -t "$SESSION:0"
|
|
tmux select-pane -t "$SESSION:0.0"
|
|
|
|
if [ "$ATTACH_MODE" = "0" ]; then
|
|
echo "Session '$SESSION' created."
|
|
exit 0
|
|
fi
|
|
|
|
exec tmux attach-session -t "$SESSION"
|