#!/bin/bash # ZCLAW Unified Start Script for macOS/Linux # Usage: ./start.sh [--no-browser] [--no-gateway] [--dev] [--help] set -e # Colors RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' CYAN='\033[0;36m' MAGENTA='\033[0;35m' NC='\033[0m' # No Color # Parse arguments NO_BROWSER=false NO_GATEWAY=false DEV_MODE=false while [[ $# -gt 0 ]]; do case $1 in --no-browser|-nb) NO_BROWSER=true shift ;; --no-gateway|-ng) NO_GATEWAY=true shift ;; --dev|-d) DEV_MODE=true shift ;; --help|-h) echo "ZCLAW Unified Start Script" echo "" echo "Usage: ./start.sh [options]" echo "" echo "Options:" echo " --no-browser, -nb Skip starting ChromeDriver" echo " --no-gateway, -ng Skip starting OpenFang gateway" echo " --dev, -d Start in development mode" echo " --help, -h Show this help message" echo "" echo "Examples:" echo " ./start.sh # Start all services" echo " ./start.sh --no-browser # Start without ChromeDriver" echo " ./start.sh --dev # Start in dev mode" exit 0 ;; *) echo -e "${RED}Unknown option: $1${NC}" exit 1 ;; esac done # Track PIDs for cleanup PIDS=() cleanup() { echo -e "\n${CYAN}[INFO]${NC} Cleaning up..." for pid in "${PIDS[@]}"; do if kill -0 "$pid" 2>/dev/null; then echo -e "${CYAN}[INFO]${NC} Stopping process $pid" kill "$pid" 2>/dev/null || true fi done } trap cleanup EXIT INT TERM echo "" echo -e "${MAGENTA}═══════════════════════════════════════════${NC}" echo -e "${MAGENTA} 🦞 ZCLAW - OpenFang Desktop Client${NC}" echo -e "${MAGENTA}═══════════════════════════════════════════${NC}" echo "" # 1. Check ChromeDriver if [ "$NO_BROWSER" = false ]; then echo -e "${CYAN}[INFO]${NC} Checking ChromeDriver..." if command -v chromedriver &> /dev/null; then CHROMEDRIVER_PATH=$(which chromedriver) echo -e "${GREEN}[OK]${NC} ChromeDriver found: $CHROMEDRIVER_PATH" # Check if already running if ! pgrep -x "chromedriver" > /dev/null; then echo -e "${CYAN}[INFO]${NC} Starting ChromeDriver on port 4444..." chromedriver --port=4444 > /dev/null 2>&1 & PIDS+=($!) sleep 0.5 if kill -0 ${PIDS[-1]} 2>/dev/null; then echo -e "${GREEN}[OK]${NC} ChromeDriver started (PID: ${PIDS[-1]})" else echo -e "${YELLOW}[WARN]${NC} ChromeDriver failed to start. It may already be running." fi else echo -e "${GREEN}[OK]${NC} ChromeDriver already running" fi else echo -e "${YELLOW}[WARN]${NC} ChromeDriver not found. Browser automation will not work." echo -e "${CYAN}[INFO]${NC} Install ChromeDriver: https://chromedriver.chromium.org/downloads" fi else echo -e "${CYAN}[INFO]${NC} Skipping ChromeDriver (--no-browser)" fi echo "" # 2. Check OpenFang Gateway if [ "$NO_GATEWAY" = false ]; then echo -e "${CYAN}[INFO]${NC} Checking OpenFang Gateway..." GATEWAY_RUNNING=false # Check if gateway is already running if curl -s --connect-timeout 2 http://127.0.0.1:4200/health > /dev/null 2>&1; then GATEWAY_RUNNING=true echo -e "${GREEN}[OK]${NC} OpenFang Gateway already running on port 4200" fi if [ "$GATEWAY_RUNNING" = false ]; then if command -v openfang &> /dev/null; then echo -e "${CYAN}[INFO]${NC} Starting OpenFang Gateway..." openfang gateway start & PIDS+=($!) echo -e "${CYAN}[INFO]${NC} Waiting for gateway to be ready..." MAX_WAIT=30 WAITED=0 while [ $WAITED -lt $MAX_WAIT ]; do if curl -s --connect-timeout 1 http://127.0.0.1:4200/health > /dev/null 2>&1; then echo -e "${GREEN}[OK]${NC} OpenFang Gateway started on port 4200" break fi sleep 1 WAITED=$((WAITED + 1)) printf "." done echo "" if [ $WAITED -ge $MAX_WAIT ]; then echo -e "${YELLOW}[WARN]${NC} Gateway did not respond within ${MAX_WAIT}s" fi else echo -e "${YELLOW}[WARN]${NC} OpenFang CLI not found. Gateway not started." echo -e "${CYAN}[INFO]${NC} Install OpenFang: https://github.com/openfang/openfang" fi fi else echo -e "${CYAN}[INFO]${NC} Skipping OpenFang Gateway (--no-gateway)" fi echo "" # 3. Start Tauri Desktop App echo -e "${CYAN}[INFO]${NC} Starting ZCLAW Desktop..." cd desktop if [ "$DEV_MODE" = true ]; then echo -e "${CYAN}[INFO]${NC} Starting in development mode..." pnpm tauri dev else # Check if built version exists if [ -f "src-tauri/target/release/ZClaw" ] || [ -f "src-tauri/target/release/ZClaw.app/Contents/MacOS/ZClaw" ]; then echo -e "${CYAN}[INFO]${NC} Starting built application..." if [ -f "src-tauri/target/release/ZClaw.app/Contents/MacOS/ZClaw" ]; then open src-tauri/target/release/ZClaw.app else ./src-tauri/target/release/ZClaw & fi echo -e "${GREEN}[OK]${NC} ZCLAW Desktop started" else echo -e "${CYAN}[INFO]${NC} Built application not found, starting in dev mode..." pnpm tauri dev fi fi # Keep script running if in dev mode if [ "$DEV_MODE" = true ]; then echo "" echo -e "${CYAN}[INFO]${NC} Press Ctrl+C to stop all services..." wait fi