#!/bin/bash set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$SCRIPT_DIR" echo -e "\033[1;36m==========================================\033[0m" echo -e "\033[1;36m OpenACM Tier-1 Autonomous Agent Setup\033[0m" echo -e "\033[1;36m==========================================\033[0m" echo "" # ── macOS: ensure Xcode Command Line Tools are installed ──────────────────── # Required for compiling native Python deps and by uv's Python builds. if [ "$(uname)" = "Darwin" ]; then if ! xcode-select -p &>/dev/null; then echo -e "\033[1;33m[*] Xcode Command Line Tools not found — launching installer...\033[0m" echo -e "\033[1;37m A system dialog will open. Click Install and wait for it to finish,\033[0m" echo -e "\033[1;37m then come back here and press Enter.\033[0m" xcode-select --install 2>/dev/null || true read -p "Press Enter once Xcode CLT install finishes... " _ if ! xcode-select -p &>/dev/null; then echo -e "\033[1;31m[ERROR] Xcode CLT still missing. Install them and re-run setup.\033[0m" exit 1 fi fi echo -e "\033[1;32m[OK] Xcode Command Line Tools detected.\033[0m" fi # Check if uv is installed if ! command -v uv &>/dev/null; then echo -e "\033[1;33m[*] Instalando 'uv' (gestor de dependencias ultrarrápido)...\033[0m" curl -LsSf https://astral.sh/uv/install.sh | sh export PATH="$HOME/.cargo/bin:$HOME/.local/bin:$PATH" else echo -e "\033[1;32m[OK] 'uv' ya está instalado.\033[0m" fi # Install system dependencies (Linux only) if command -v apt-get &>/dev/null; then echo -e "\033[1;33m[*] Instalando utilidades base del sistema...\033[0m" sudo apt-get update -qq sudo apt-get install -y build-essential python3-dev libssl-dev libffi-dev xdotool python3.12-venv fi # ── Node.js 20+ ──────────────────────────────────────────────────────────── echo -e "\033[1;33m[*] Verificando Node.js...\033[0m" NODE_OK=false if command -v node &>/dev/null; then NODE_VER=$(node -e "process.stdout.write(String(process.versions.node.split('.')[0]))" 2>/dev/null) if [ "${NODE_VER:-0}" -ge 20 ] 2>/dev/null; then echo -e "\033[1;32m[OK] Node.js $(node --version) encontrado.\033[0m" NODE_OK=true else echo -e "\033[1;33m[!] Node.js $(node --version) es muy antiguo. Se necesita v20+.\033[0m" fi fi if [ "$NODE_OK" = false ]; then # Try nvm export NVM_DIR="${NVM_DIR:-$HOME/.nvm}" if [ -s "$NVM_DIR/nvm.sh" ]; then source "$NVM_DIR/nvm.sh" echo -e "\033[1;33m[*] Instalando Node.js 20 via nvm...\033[0m" nvm install 20 && nvm use 20 && nvm alias default 20 NODE_OK=true # Try Homebrew (macOS) elif command -v brew &>/dev/null; then echo -e "\033[1;33m[*] Instalando Node.js 20 via Homebrew...\033[0m" brew install node@20 brew link --overwrite --force node@20 export PATH="/opt/homebrew/opt/node@20/bin:/usr/local/opt/node@20/bin:$PATH" NODE_OK=true # Try apt (Linux) elif command -v apt-get &>/dev/null; then echo -e "\033[1;33m[*] Instalando Node.js 20 via apt...\033[0m" curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs NODE_OK=true else echo -e "\033[1;31m[!] No se pudo instalar Node.js automáticamente.\033[0m" echo -e "\033[1;37m Instala Node.js 20+ manualmente desde: https://nodejs.org\033[0m" echo -e "\033[1;37m O usa nvm: https://github.com/nvm-sh/nvm\033[0m" fi fi # Install Python 3.12 via uv echo -e "\033[1;33m[*] Configurando Python 3.12...\033[0m" uv python install 3.12 2>/dev/null || echo -e "\033[1;33m[!] No se pudo instalar Python 3.12 via uv, intentando continuar...\033[0m" # Create virtual environment with seed packages (ensures pip is available) echo -e "\033[1;33m[*] Creando entorno virtual...\033[0m" # Remove old venv if it has no pip if [ -f ".venv/bin/python" ] && [ ! -f ".venv/bin/pip" ]; then echo -e "\033[1;33m[!] venv sin pip detectado. Recreando...\033[0m" rm -rf .venv fi uv venv --seed echo -e "\033[1;32m[OK] Entorno virtual creado con pip.\033[0m" # Setup .env config echo -e "\033[1;33m[*] Revisando configuración (.env)...\033[0m" if [ ! -f "config/.env" ]; then if [ -f "config/.env.example" ]; then cp config/.env.example config/.env echo -e "\033[1;32m[OK] 'config/.env' creado desde el ejemplo.\033[0m" else mkdir -p config echo "# OpenACM Configuration" > config/.env echo -e "\033[1;32m[OK] 'config/.env' creado (vacío).\033[0m" fi else echo -e "\033[1;32m[OK] 'config/.env' ya existe.\033[0m" fi # Install Python dependencies echo -e "\033[1;33m[*] Instalando dependencias del proyecto (puede tardar unos minutos)...\033[0m" uv pip install -e . echo -e "\033[1;32m[OK] Dependencias instaladas.\033[0m" # Install optional media-processing extras (MarkItDown converters + audio) echo -e "\033[1;33m[*] Instalando extras de procesamiento de archivos (MarkItDown)...\033[0m" uv pip install "markitdown[docx,xlsx,pptx,audio-transcription]" 2>/dev/null \ && echo -e "\033[1;32m[OK] MarkItDown extras instalados.\033[0m" \ || echo -e "\033[1;33m[!] No se pudieron instalar los extras de MarkItDown (no crítico).\033[0m" # Install AI/ML enhancement libraries echo -e "\033[1;33m[*] Instalando librerías de mejora (chonkie, docling, instructor)...\033[0m" uv pip install "chonkie[sentence]>=1.0" "docling>=2.0" "instructor>=1.0" 2>/dev/null \ && echo -e "\033[1;32m[OK] Librerías de mejora instaladas.\033[0m" \ || echo -e "\033[1;33m[!] No se pudieron instalar algunas librerías de mejora (no crítico).\033[0m" # Install Playwright browsers echo -e "\033[1;33m[*] Descargando navegadores para el Agente Web (Playwright)...\033[0m" uv run playwright install --with-deps chromium || echo -e "\033[1;33m[!] No se pudo instalar Playwright automáticamente. Puedes instalarlo después: uv run playwright install chromium\033[0m" # Final verification echo "" echo -e "\033[1;33m[*] Verificando instalación...\033[0m" if uv run python -c "import openacm; print('OK')" 2>/dev/null | grep -q "OK"; then echo -e "\033[1;32m[OK] OpenACM importa correctamente.\033[0m" else echo -e "\033[1;33m[!] Advertencia: Hubo problemas al verificar la instalación.\033[0m" fi echo "" echo -e "\033[1;32m==========================================\033[0m" echo -e "\033[1;32m ✅ ¡Instalación Completada con Éxito!\033[0m" echo -e "\033[1;32m==========================================\033[0m" echo "" echo -e "\033[1;37m Antes de iniciar, asegúrate de configurar\033[0m" echo -e "\033[1;37m tus API keys en: \033[1;36mconfig/.env\033[0m" echo "" echo -e "\033[1;37m Docs:\033[0m" echo -e "\033[0;37m - README.md - Guía de inicio rápido\033[0m" echo -e "\033[0;37m - SKILLS_TOOLS_GUIDE.md - Cómo crear skills y tools\033[0m" echo "" echo -e "\033[1;36m==========================================\033[0m" echo "" read -p "¿Lanzar OpenACM ahora? (S/n): " choice if [[ "$choice" == "" || "$choice" =~ ^[sSyY] ]]; then echo "" echo -e "\033[1;32mIniciando OpenACM...\033[0m" echo "" exec scripts/run.sh else echo "" echo -e "\033[1;36mPara iniciar más tarde, ejecuta: openacm start\033[0m" echo "" fi