#!/bin/bash # ZCLAW Unified Start Script for macOS/Linux # Starts: ChromeDriver (optional) -> Tauri Desktop (manages ZCLAW internally) # # NOTE: ZCLAW is bundled with Tauri and managed internally. # The frontend uses Tauri commands (gateway_start/gateway_status) to control ZCLAW. # No external ZCLAW CLI installation is required. # # Usage: ./start.sh [--no-browser] [--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 DEV_MODE=false while [[ $# -gt 0 ]]; do case $1 in --no-browser|-nb) NO_BROWSER=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 " --dev, -d Start in development mode" echo " --help, -h Show this help message" echo "" echo "Note:" echo " ZCLAW is bundled with the Tauri app and managed internally." echo " No external ZCLAW CLI installation required." 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 - AI Agent 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 ZCLAW Runtime echo -e "${CYAN}[INFO]${NC} Checking ZCLAW runtime..." SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" RUNTIME_PATH="$SCRIPT_DIR/desktop/src-tauri/resources/zclaw-runtime" if [ -f "$RUNTIME_PATH/zclaw" ] || [ -f "$RUNTIME_PATH/zclaw-x86_64-unknown-linux-gnu" ] || [ -f "$RUNTIME_PATH/zclaw-aarch64-apple-darwin" ]; then echo -e "${GREEN}[OK]${NC} ZCLAW runtime found (bundled)" else echo -e "${YELLOW}[WARN]${NC} ZCLAW runtime not found at $RUNTIME_PATH" echo -e "${CYAN}[INFO]${NC} Run: cd desktop && pnpm prepare:zclaw-runtime" 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..." echo -e "${CYAN}[INFO]${NC} ZCLAW will be started by the app via Tauri commands" 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