Current section
Files
Jump to
Current section
Files
priv/scripts/eai-tui.sh
#!/usr/bin/env bash
# ============================================================
# eai-tui.sh — TUI wrapper for Eai with tmux
#
# Layout:
# ┌──────────────────────┬────────────┐
# │ IEx 信息屏 (70%) │ 右上角 (留白) │
# │ • model 回复 │ │
# │ • telemetry 刷屏 ├────────────┤
# │ • 工具调用输出 │ 输入栏 │
# │ │ [ENTER] 发送 │
# └──────────────────────┴────────────┘
#
# Controls:
# Ctrl+↑↓←→ — 切换焦点窗口
# 输入栏 ENTER — 发送消息到 IEx
#
# Prerequisite: tmux installed
# ============================================================
set -euo pipefail
\n# ── Prerequisites ────────────────────────────────────────
if ! command -v tmux &>/dev/null; then
echo "ERROR: tmux is required. Install: apt install tmux"
exit 1
fi
SESSION="eai-tui"
PROJECT_DIR="$(cd "$(dirname "$0")/../.." && pwd)"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
COLS=$(tput cols 2>/dev/null || echo 120)
ROWS=$(tput lines 2>/dev/null || echo 40)
# ── Cleanup: kill old session, remove our bindings ───────────
cleanup() {
tmux kill-session -t "$SESSION" 2>/dev/null || true
# Remove C-Arrow bindings we set (silently ignore if not set)
tmux unbind-key -n C-Up 2>/dev/null || true
tmux unbind-key -n C-Down 2>/dev/null || true
tmux unbind-key -n C-Left 2>/dev/null || true
tmux unbind-key -n C-Right 2>/dev/null || true
}
trap cleanup EXIT
cleanup
# ── Key bindings (server-global — cleaned up on EXIT) ────────
tmux bind-key -n C-Up select-pane -U
tmux bind-key -n C-Down select-pane -D
tmux bind-key -n C-Left select-pane -L
tmux bind-key -n C-Right select-pane -R
# ── Create session ──────────────────────────────────────────
tmux new-session -d -s "$SESSION" -c "$PROJECT_DIR" -x "$COLS" -y "$ROWS"
tmux set-option -t "$SESSION" status-style "bg=black,fg=green"
tmux set-option -t "$SESSION" status-left " EAI TUI — IEx "
tmux set-option -t "$SESSION" status-right " Ctrl+Arrows: swap | ENTER: send | Ctrl+B D: detach "
# ── Pane layout ─────────────────────────────────────────────
# Left: IEx (70% width)
tmux send-keys -t "$SESSION:0.0" 'iex -S mix' Enter
sleep 0.5
# Right split: 30%
tmux split-window -h -p 30 -t "$SESSION:0.0"
# Right-top: blank for now
tmux send-keys -t "$SESSION:0.1" 'echo " (right panel — reserved)"' Enter
# Right-bottom: input bar (20% of right column)
tmux split-window -v -p 20 -t "$SESSION:0.1"
# ── Launch input handler ────────────────────────────────────
IEX_PANE="$SESSION:0.0"
INPUT_PANE="$SESSION:0.2"
sleep 2 # let IEx finish compiling
tmux send-keys -t "$INPUT_PANE" 'clear; echo "── EAI Input ──"' Enter
sleep 0.2
tmux send-keys -t "$INPUT_PANE" "bash '$SCRIPT_DIR/eai-input.sh' '$IEX_PANE'" Enter
# ── Focus IEx pane ──────────────────────────────────────────
tmux select-pane -t "$IEX_PANE"
# ── Attach ──────────────────────────────────────────────────
tmux attach-session -t "$SESSION"