#!/usr/bin/env bash set -eo pipefail # --- Color Definitions --- CYAN='\033[96m' GREEN='\033[92m' YELLOW='\033[93m' RED='\033[91m' RESET='\033[0m' BOLD='\033[1m' # --- Paths & Dependencies --- MODEL_DIR="./models" AGENT_DIR="./agents" LLAMA_SERVER="./core/llama.cpp/build/bin/llama-server" PYTHON_SCRIPT="./core/smarterframework.py" echo -e "${CYAN}${BOLD}=== SmarterAgents Core Launch System ===${RESET}" # Ensure local dev and log folders exist in workspace mkdir -p dev mkdir -p core/logs # Verify core compilation target exists if [ ! -f "$LLAMA_SERVER" ]; then echo -e "${RED}[ERR] compiled 'llama-server' binary missing at '$LLAMA_SERVER'.${RESET}" echo -e "Please run cmake build inside core/llama.cpp as detailed in the README." exit 1 fi # 1. Model Selection mapfile -t MODELS < <(find "$MODEL_DIR" -name "*.gguf" 2>/dev/null) if [ ${#MODELS[@]} -eq 0 ]; then echo -e "${RED}[ERR] No GGUF models discovered in '$MODEL_DIR'. Please copy a model there first.${RESET}" exit 1 fi echo -e "\n${YELLOW}Discovered Models:${RESET}" for i in "${!MODELS[@]}"; do echo -e " [$i] $(basename "${MODELS[$i]}")" done read -rp "Select Model Index [0-$((${#MODELS[@]} - 1))]: " MODEL_IDX SELECTED_MODEL="${MODELS[$MODEL_IDX]}" # 2. Agent Selection mapfile -t AGENTS < <(find "$AGENT_DIR" -name "*.md" 2>/dev/null) if [ ${#AGENTS[@]} -eq 0 ]; then echo -e "${RED}[ERR] No Markdown agents discovered in '$AGENT_DIR'.${RESET}" exit 1 fi echo -e "\n${YELLOW}Discovered Agent Personas:${RESET}" for i in "${!AGENTS[@]}"; do echo -e " [$i] $(basename "${AGENTS[$i]}")" done read -rp "Select Agent Index [0-$((${#AGENTS[@]} - 1))]: " AGENT_IDX SELECTED_AGENT="${AGENTS[$AGENT_IDX]}" # 3. Environment Variable Export for Python Orchestrator GRAMMAR_FILE="" for path in "tools/tool_rules.gbnf" "tools/tool_rules.gnbf" "agents/tools/tool_rules.gbnf" "agents/tools/tool_rules.gnbf"; do if [ -f "$path" ]; then GRAMMAR_FILE="$path" break fi done if [ -n "$GRAMMAR_FILE" ]; then export AMDA_GRAMMAR_FILE="$GRAMMAR_FILE" else export AMDA_GRAMMAR_FILE="tools/tool_rules.gbnf" fi export AMDA_BACKEND_URL="http://127.0.0.1:8080" export AMDA_SYSTEM_PROMPT="$SELECTED_AGENT" # 4. Vulkan Background Server Initialization PHYS_CORES=8 echo -e "\n${CYAN}[Init] Booting Vulkan llama-server daemon...${RESET}" echo -e "${DIM}Assigning 100% compute threads to $PHYS_CORES physical cores.${RESET}" # Start llama-server and capture process PID "$LLAMA_SERVER" \ --model "$SELECTED_MODEL" \ --host "127.0.0.1" \ --port "8080" \ --ctx-size 16384 \ --parallel 1 \ --threads "$PHYS_CORES" \ --batch-size 128 \ --ubatch-size 64 \ --no-mmap \ -ngl 999 \ -fa on \ -ctk q8_0 \ -ctv q8_0 \ --jinja > core/logs/llama-server.log 2>&1 & # <-- Added --jinja here SERVER_PID=$! # Safe Target-Specific cleanup (Only kill the llama-server child process) cleanup() { echo -e "\n${YELLOW}[Exit] Shutting down llama-server daemon... (PID: $SERVER_PID)${RESET}" kill -9 "$SERVER_PID" 2>/dev/null || true wait "$SERVER_PID" 2>/dev/null || true } trap cleanup EXIT INT TERM HUP # 5. Health Check Diagnostics echo -e "${CYAN}[Health] Polling background loop for local endpoint availability...${RESET}" RETRIES=15 CONNECTED=false for ((i=1; i<=RETRIES; i++)); do if curl -s -o /dev/null -w "%{http_code}" "$AMDA_BACKEND_URL/health" | grep -q "200"; then echo -e "${GREEN}[Ready] Local Vulkan compute engine activated successfully.${RESET}" CONNECTED=true break fi sleep 1 done if [ "$CONNECTED" = false ]; then echo -e "${RED}[ERR] llama-server failed to activate within timeout period.${RESET}" echo -e "Diagnostics: Last 15 lines of core/logs/llama-server.log:" tail -n 15 core/logs/llama-server.log exit 1 fi # 6. Transfer Execution to Python TUI Engine echo -e "${CYAN}[Exec] Handoff control to asynchronous user interface...${RESET}\n" python3 "$PYTHON_SCRIPT"