Fix tmux glasspane session handling
--- Build: pass | Tests: pass — 2147 passed (625 files)
This commit is contained in:
parent
777e7e0f15
commit
0be5a169ac
2 changed files with 86 additions and 16 deletions
|
|
@ -11,16 +11,61 @@
|
|||
# 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:-}" ] && [ -f "$PROJECT_DIR/.env" ]; then
|
||||
TENANT_ID="$(grep '^TENANT_ID=' "$PROJECT_DIR/.env" | cut -d= -f2 | tr -d '"'\'')')"
|
||||
if [ -z "${TENANT_ID:-}" ]; then
|
||||
TENANT_ID="$(read_env_value TENANT_ID "$PROJECT_DIR/.env" || true)"
|
||||
fi
|
||||
SESSION="${TENANT_ID:-clawdie}"
|
||||
PI_BIN="${PI_TUI_BIN:-/home/clawdie/.npm-global/bin/pi}"
|
||||
AIDER_BIN="${AIDER_BIN:-aider}"
|
||||
SESSION_BASE="${TENANT_ID:-clawdie}"
|
||||
SESSION="${GLASS_SESSION_NAME:-${SESSION_BASE}-glass}"
|
||||
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")"
|
||||
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."
|
||||
|
|
@ -28,29 +73,40 @@ if [ "${1:-}" = "kill" ]; then
|
|||
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:glass.0" -h -p 35
|
||||
tmux split-window -t "$SESSION:0.0" -h -p 35
|
||||
|
||||
tmux select-pane -t "$SESSION:glass.0" -T "gateway / pi"
|
||||
tmux send-keys -t "$SESSION:glass.0" "cd '$PROJECT_DIR' && '$PI_BIN'" Enter
|
||||
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:glass.1" -T "aider"
|
||||
tmux send-keys -t "$SESSION:glass.1" "cd '$PROJECT_DIR' && '$AIDER_BIN'" Enter
|
||||
tmux select-pane -t "$SESSION:0.1" -T "aider"
|
||||
tmux send-keys -t "$SESSION:0.1" "cd '$PROJECT_DIR' && '$AIDER_BIN'" Enter
|
||||
|
||||
# ── Window 1: btop — full terminal height ─────────────────────────────────────
|
||||
tmux new-window -t "$SESSION" -n btop
|
||||
tmux select-pane -t "$SESSION:btop.0" -T "btop"
|
||||
tmux send-keys -t "$SESSION:btop.0" "btop" Enter
|
||||
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:glass"
|
||||
tmux select-pane -t "$SESSION:glass.0"
|
||||
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"
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import os from 'os';
|
||||
import { execFileSync } from 'child_process';
|
||||
|
||||
import {
|
||||
runAiderTask,
|
||||
|
|
@ -19,6 +20,16 @@ import {
|
|||
} from './controlplane-aider-runner.js';
|
||||
|
||||
const TMP = path.join(process.cwd(), 'tmp', 'test-aider-runner');
|
||||
let tmuxSessionName = '';
|
||||
|
||||
function killTmuxSession(name: string): void {
|
||||
if (!name) return;
|
||||
try {
|
||||
execFileSync('tmux', ['kill-session', '-t', name], { stdio: 'ignore' });
|
||||
} catch {
|
||||
// best effort only
|
||||
}
|
||||
}
|
||||
|
||||
function makeOpts(overrides: Partial<AiderRunOptions> = {}): AiderRunOptions {
|
||||
return {
|
||||
|
|
@ -30,7 +41,7 @@ function makeOpts(overrides: Partial<AiderRunOptions> = {}): AiderRunOptions {
|
|||
logDir: path.join(TMP, 'logs'),
|
||||
aiderBin: 'echo',
|
||||
aiderFlags: ['--no-check-update'],
|
||||
tmuxSession: 'test-session',
|
||||
tmuxSession: tmuxSessionName,
|
||||
timeoutMs: 5000,
|
||||
...overrides,
|
||||
};
|
||||
|
|
@ -50,9 +61,12 @@ function writeCatLastArgScript(scriptDir: string): string {
|
|||
|
||||
beforeEach(() => {
|
||||
fs.mkdirSync(TMP, { recursive: true });
|
||||
tmuxSessionName = `test-session-${process.pid}-${Date.now()}`;
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
killTmuxSession(tmuxSessionName);
|
||||
tmuxSessionName = '';
|
||||
fs.rmSync(TMP, { recursive: true, force: true });
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue