Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/authicahq_mesh.json
T

1 line
51 KiB
JSON

{"repo": "authicahq/mesh", "files": {"scripts/install.sh": {"6dfabe5b2c57f1251f82a0f6f9826d513ea435d7": {"t": 1785745962.1623893, "n": 23217, "h": "d351ede6dabb5447", "c": "#!/bin/bash\n#\n# Authica Mesh - Unified Installation Script\n# Usage: curl -fsSL https://raw.githubusercontent.com/authicahq/mesh/main/scripts/install.sh | bash\n#\n# This script installs Authica Mesh using either Docker (default) or as a standalone binary.\n#\n# Installation modes:\n# Docker (default): curl -fsSL ... | bash\n# Binary: curl -fsSL ... | bash -s -- --binary\n#\n# Environment variables:\n# AUTHICA_MESH_INSTALL_DIR - Installation directory (default: ~/.local/share/authica-mesh)\n# AUTHICA_MESH_PORT - API server port (default: 3000)\n# AUTHICA_MESH_GUI_PORT - GUI server port (default: 3001)\n# AUTHICA_MESH_EXTERNAL_PORT - External API port for port mapping (default: AUTHICA_MESH_PORT)\n# AUTHICA_MESH_EXTERNAL_GUI_PORT - External GUI port for port mapping (default: AUTHICA_MESH_GUI_PORT)\n# AUTHICA_MESH_SKIP_SYSTEMD - Skip systemd service setup\n# AUTHICA_MESH_VERSION - Specific version to install (binary mode only)\n#\n# Examples:\n# # Docker install with custom ports\n# AUTHICA_MESH_PORT=8080 AUTHICA_MESH_GUI_PORT=8081 ./install.sh\n#\n# # Binary install\n# ./install.sh --binary\n#\n# # Specific version (binary only)\n# AUTHICA_MESH_VERSION=v2.1.0 ./install.sh --binary\n\nset -e\n\n# =============================================================================\n# Configuration\n# =============================================================================\n\nREPO=\"authicahq/mesh\"\nIMAGE=\"ghcr.io/authicahq/mesh:latest\"\nINSTALL_DIR=\"${AUTHICA_MESH_INSTALL_DIR:-$HOME/.local/share/authica-mesh}\"\nCONFIG_DIR=\"$INSTALL_DIR/config\"\nLOGS_DIR=\"$INSTALL_DIR/logs\"\nAPI_PORT=\"${AUTHICA_MESH_PORT:-3000}\"\nGUI_PORT=\"${AUTHICA_MESH_GUI_PORT:-3001}\"\nEXTERNAL_PORT=\"${AUTHICA_MESH_EXTERNAL_PORT:-$API_PORT}\"\nEXTERNAL_GUI_PORT=\"${AUTHICA_MESH_EXTERNAL_GUI_PORT:-$GUI_PORT}\"\nSERVICE_NAME=\"authica-mesh\"\n\n# Parse arguments\nINSTALL_MODE=\"docker\" # docker or binary\nwhile [[ $# -gt 0 ]]; do\n case $1 in\n --binary)\n INSTALL_MODE=\"binary\"\n shift\n ;;\n --docker)\n INSTALL_MODE=\"docker\"\n shift\n ;;\n --help|-h)\n show_help\n exit 0\n ;;\n *)\n echo \"Unknown option: $1\"\n echo \"Use --help for usage information\"\n exit 1\n ;;\n esac\ndone\n\n# Colors\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nBLUE='\\033[0;34m'\nCYAN='\\033[0;36m'\nNC='\\033[0m'\n\n# Logging functions\nlog_info() { echo -e \"${BLUE}[INFO]${NC} $1\"; }\nlog_success() { echo -e \"${GREEN}[OK]${NC} $1\"; }\nlog_warn() { echo -e \"${YELLOW}[WARN]${NC} $1\"; }\nlog_error() { echo -e \"${RED}[ERROR]${NC} $1\"; }\nlog_step() { echo -e \"\\n${CYAN}▶ $1${NC}\"; }\n\n# =============================================================================\n# Helper Functions\n# =============================================================================\n\ndetect_os() {\n case \"$(uname -s)\" in\n Linux*) echo \"Linux\";;\n Darwin*) echo \"Mac\";;\n CYGWIN*|MINGW*|MSYS*) echo \"Windows\";;\n *) echo \"UNKNOWN\";;\n esac\n}\n\ndetect_platform() {\n local os arch\n case \"$(uname -s)\" in\n Linux*) os=\"linux\";;\n Darwin*) os=\"darwin\";;\n CYGWIN*|MINGW*|MSYS*) os=\"windows\";;\n *) os=\"unknown\";;\n esac\n case \"$(uname -m)\" in\n x86_64|amd64) arch=\"x64\";;\n arm64|aarch64) arch=\"arm64\";;\n *) arch=\"unknown\";;\n esac\n echo \"${os}-${arch}\"\n}\n\ncommand_exists() {\n command -v \"$1\" >/dev/null 2>&1\n}\n\nshow_help() {\n cat << 'EOF'\nAuthica Mesh - Unified Installation Script\n\nUsage: install.sh [OPTIONS]\n\nOptions:\n --docker Install using Docker (default)\n --binary Install as standalone binary (requires Bun)\n --help, -h Show this help message\n\nEnvironment Variables:\n AUTHICA_MESH_INSTALL_DIR Installation directory (default: ~/.local/share/authica-mesh)\n AUTHICA_MESH_PORT API server port (default: 3000)\n AUTHICA_MESH_GUI_PORT GUI server port (default: 3001)\n AUTHICA_MESH_EXTERNAL_PORT External API port for reverse proxy (default: AUTHICA_MESH_PORT)\n AUTHICA_MESH_EXTERNAL_GUI_PORT External GUI port for reverse proxy (default: AUTHICA_MESH_GUI_PORT)\n AUTHICA_MESH_SKIP_SYSTEMD Skip systemd service setup\n AUTHICA_MESH_VERSION Specific version for binary install (e.g., v2.1.0)\n\nExamples:\n # Docker install (recommended)\n curl -fsSL https://raw.githubusercontent.com/authicahq/mesh/main/scripts/install.sh | bash\n\n # Docker with custom ports\n AUTHICA_MESH_PORT=8080 AUTHICA_MESH_GUI_PORT=8081 ./install.sh\n\n # Binary install\n ./install.sh --binary\n\n # Binary specific version\n AUTHICA_MESH_VERSION=v2.1.0 ./install.sh --binary\nEOF\n}\n\n# =============================================================================\n# Docker Installation\n# =============================================================================\n\ncheck_docker() {\n log_step \"Checking Docker prerequisites\"\n \n if ! command_exists docker; then\n log_error \"Docker is not installed.\"\n echo \"\"\n echo \"Please install Docker first:\"\n echo \" - Linux: https://docs.docker.com/engine/install/\"\n echo \" - macOS: https://docs.docker.com/desktop/install/mac-install/\"\n echo \" - Windows: https://docs.docker.com/desktop/install/windows-install/\"\n exit 1\n fi\n \n if ! docker info >/dev/null 2>&1; then\n log_error \"Docker daemon is not running or not accessible.\"\n echo \"\"\n echo \"Please start Docker and try again.\"\n exit 1\n fi\n \n log_success \"Docker is installed and running\"\n}\n\nsetup_directories() {\n log_step \"Setting up directories\"\n \n mkdir -p \"$CONFIG_DIR\" \"$LOGS_DIR\"\n \n # Set ownership to UID 1001 (authica-mesh user in container)\n local os=$(detect_os)\n if [ \"$os\" = \"Linux\" ] || [ \"$os\" = \"Mac\" ]; then\n if chown -R 1001:1001 \"$CONFIG_DIR\" \"$LOGS_DIR\" 2>/dev/null; then\n log_success \"Directory ownership set to UID 1001\"\n else\n log_warn \"Could not change ownership to UID 1001 (may need sudo)\"\n log_warn \"Making directories world-writable as fallback...\"\n chmod -R 777 \"$CONFIG_DIR\" \"$LOGS_DIR\"\n fi\n fi\n \n log_success \"Directories created at $INSTALL_DIR\"\n}\n\ncreate_config() {\n local config_file=\"$CONFIG_DIR/config.yaml\"\n \n if [ -f \"$config_file\" ]; then\n log_info \"Existing configuration found\"\n return\n fi\n \n log_step \"Creating default configuration\"\n \n cat > \"$config_file\" << 'EOF'\n# Authica Mesh Configuration\n# Documentation: https://github.com/authicahq/mesh#configuration\n\nserver:\n port: 3000\n host: \"0.0.0.0\"\n timeout: 120\n\nlogging:\n dir: \"/app/logs\"\n level: \"info\"\n maskKeys: true\n\n# Configure your providers and API keys here\n# providers:\n# openai:\n# apiKeyEnv: \"OPENAI_API_KEY\"\n# timeout: 180\n# \n# anthropic:\n# apiKeyEnv: \"ANTHROPIC_API_KEY\"\n# timeout: 180\n\n# Configure routing rules here\n# routes:\n# - pattern: \"gpt-4*\"\n# provider: openai\n# priority: 100\n\ndefaultProvider: null\nEOF\n \n log_success \"Configuration created\"\n}\n\ncreate_docker_compose() {\n log_step \"Creating docker-compose.yml\"\n \n # Only add external port env vars if they differ from internal ports\n local external_config=\"\"\n if [ \"${EXTERNAL_PORT}\" != \"${API_PORT}\" ]; then\n external_config=\" - EXTERNAL_PORT=${EXTERNAL_PORT}\"\n fi\n if [ \"${EXTERNAL_GUI_PORT}\" != \"${GUI_PORT}\" ]; then\n if [ -n \"$external_config\" ]; then\n external_config=\"${external_config}\n - EXTERNAL_GUI_PORT=${EXTERNAL_GUI_PORT}\"\n else\n external_config=\" - EXTERNAL_GUI_PORT=${EXTERNAL_GUI_PORT}\"\n fi\n fi\n \n cat > \"$INSTALL_DIR/docker-compose.yml\" << EOF\n# Authica Mesh - Docker Compose Configuration\n\nservices:\n authica-mesh:\n image: ${IMAGE}\n container_name: ${SERVICE_NAME}\n restart: unless-stopped\n ports:\n - \"${API_PORT}:3000\"\n - \"${GUI_PORT}:3001\"\n environment:\n # Port mapping configuration\n${external_config:-# - EXTERNAL_PORT=3000}\n \n # API Keys - pass through from host environment\n - OPENAI_API_KEY=\\${OPENAI_API_KEY:-}\n - ANTHROPIC_API_KEY=\\${ANTHROPIC_API_KEY:-}\n - GOOGLE_API_KEY=\\${GOOGLE_API_KEY:-}\n - GROQ_API_KEY=\\${GROQ_API_KEY:-}\n - TOGETHER_API_KEY=\\${TOGETHER_API_KEY:-}\n - FIREWORKS_API_KEY=\\${FIREWORKS_API_KEY:-}\n - DEEPSEEK_API_KEY=\\${DEEPSEEK_API_KEY:-}\n - MISTRAL_API_KEY=\\${MISTRAL_API_KEY:-}\n - COHERE_API_KEY=\\${COHERE_API_KEY:-}\n - OPENROUTER_API_KEY=\\${OPENROUTER_API_KEY:-}\n - PERPLEXITY_API_KEY=\\${PERPLEXITY_API_KEY:-}\n - ANYSCALE_API_KEY=\\${ANYSCALE_API_KEY:-}\n \n # Ollama configuration\n - OLLAMA_BASE_URL=\\${OLLAMA_BASE_URL:-http://host.docker.internal:11434}\n \n volumes:\n - ${CONFIG_DIR}:/app/config:rw\n - ${LOGS_DIR}:/app/logs:rw\n healthcheck:\n test: [\"CMD\", \"wget\", \"--no-verbose\", \"--tries=1\", \"--spider\", \"http://localhost:3000/health\"]\n interval: 30s\n timeout: 3s\n retries: 3\n start_period: 5s\nEOF\n \n log_success \"docker-compose.yml created\"\n}\n\ncreate_docker_wrapper() {\n log_step \"Creating command wrapper\"\n \n cat > \"$INSTALL_DIR/authica-mesh\" << 'EOF'\n#!/bin/bash\n# Authica Mesh - Docker Command Wrapper\n\nINSTALL_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nCOMPOSE_FILE=\"$INSTALL_DIR/docker-compose.yml\"\n\ncase \"${1:-}\" in\n start)\n echo \"Starting Authica Mesh...\"\n docker compose -f \"$COMPOSE_FILE\" up -d\n echo \"\"\n echo \"Authica Mesh is running at:\"\n echo \" API: http://localhost:3000\"\n echo \" GUI: http://localhost:3001\"\n ;;\n stop)\n echo \"Stopping Authica Mesh...\"\n docker compose -f \"$COMPOSE_FILE\" down\n ;;\n restart)\n echo \"Restarting Authica Mesh...\"\n docker compose -f \"$COMPOSE_FILE\" restart\n ;;\n logs)\n docker compose -f \"$COMPOSE_FILE\" logs -f\n ;;\n status)\n docker compose -f \"$COMPOSE_FILE\" ps\n ;;\n update)\n echo \"Updating Authica Mesh...\"\n docker compose -f \"$COMPOSE_FILE\" pull\n docker compose -f \"$COMPOSE_FILE\" up -d\n ;;\n config)\n ${EDITOR:-nano} \"$INSTALL_DIR/config/config.yaml\"\n ;;\n shell)\n docker compose -f \"$COMPOSE_FILE\" exec authica-mesh sh\n ;;\n *)\n echo \"Authica Mesh - Universal Model Router (Docker)\"\n echo \"\"\n echo \"Usage: authica-mesh [command]\"\n echo \"\"\n echo \"Commands:\"\n echo \" start Start Authica Mesh\"\n echo \" stop Stop Authica Mesh\"\n echo \" restart Restart Authica Mesh\"\n echo \" logs View logs\"\n echo \" status Check status\"\n echo \" update Update to latest version\"\n echo \" config Edit configuration\"\n echo \" shell Open shell in container\"\n echo \"\"\n echo \"Directories:\"\n echo \" Config: $INSTALL_DIR/config\"\n echo \" Logs: $INSTALL_DIR/logs\"\n ;;\nesac\nEOF\n \n chmod +x \"$INSTALL_DIR/authica-mesh\"\n log_success \"Wrapper script created\"\n}\n\nsetup_docker_systemd() {\n if [ -n \"$AUTHICA_MESH_SKIP_SYSTEMD\" ]; then\n return\n fi\n \n local os=$(detect_os)\n if [ \"$os\" != \"Linux\" ]; then\n return\n fi\n \n if [ ! -d /etc/systemd/system ]; then\n return\n fi\n \n if [ \"$EUID\" -ne 0 ] && ! command_exists sudo; then\n log_warn \"Cannot setup systemd without sudo access\"\n return\n fi\n \n log_step \"Setting up systemd service\"\n \n cat > /tmp/authica-mesh.service << EOF\n[Unit]\nDescription=Authica Mesh - Universal Model Router\nRequires=docker.service\nAfter=docker.service\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nWorkingDirectory=${INSTALL_DIR}\nExecStart=${INSTALL_DIR}/authica-mesh start\nExecStop=${INSTALL_DIR}/authica-mesh stop\n\n[Install]\nWantedBy=multi-user.target\nEOF\n \n if [ \"$EUID\" -eq 0 ]; then\n mv /tmp/authica-mesh.service /etc/systemd/system/\n else\n sudo mv /tmp/authica-mesh.service /etc/systemd/system/\n fi\n \n systemctl daemon-reload\n log_success \"Systemd service installed\"\n log_info \"Enable with: sudo systemctl enable authica-mesh\"\n log_info \"Start with: sudo systemctl start authica-mesh\"\n}\n\ninstall_docker() {\n echo \"\"\n echo \"╔════════════════════════════════════════════════════════════╗\"\n echo \"║ Authica Mesh - Docker Installation ║\"\n echo \"╚════════════════════════════════════════════════════════════╝\"\n echo \"\"\n \n log_info \"Installation directory: $INSTALL_DIR\"\n log_info \"API port: $API_PORT\"\n log_info \"GUI port: $GUI_PORT\"\n [ \"${EXTERNAL_PORT}\" != \"${API_PORT}\" ] && log_info \"External API port: $EXTERNAL_PORT\"\n [ \"${EXTERNAL_GUI_PORT}\" != \"${GUI_PORT}\" ] && log_info \"External GUI port: $EXTERNAL_GUI_PORT\"\n echo \"\"\n \n check_docker\n setup_directories\n create_config\n create_docker_compose\n create_docker_wrapper\n setup_docker_systemd\n \n # Add to PATH suggestion\n local shell_rc=\"\"\n case \"$SHELL\" in\n */bash) shell_rc=\"$HOME/.bashrc\" ;;\n */zsh) shell_rc=\"$HOME/.zshrc\" ;;\n */fish) shell_rc=\"$HOME/.config/fish/config.fish\" ;;\n esac\n \n if [ -n \"$shell_rc\" ]; then\n echo \"\"\n log_info \"To add 'authica-mesh' to your PATH, run:\"\n echo \" echo 'export PATH=\\\"$INSTALL_DIR:\\$PATH\\\"' >> $shell_rc\"\n echo \" source $shell_rc\"\n fi\n \n echo \"\"\n echo \"╔════════════════════════════════════════════════════════════╗\"\n echo \"║ Installation Complete! ║\"\n echo \"╚════════════════════════════════════════════════════════════╝\"\n echo \"\"\n log_success \"Authica Mesh installed to $INSTALL_DIR\"\n echo \"\"\n echo \"Quick start:\"\n echo \" cd $INSTALL_DIR\"\n echo \" ./authica-mesh start\"\n echo \"\"\n echo \"Access:\"\n if [ \"${EXTERNAL_PORT}\" != \"${API_PORT}\" ]; then\n echo \" API: http://localhost:$EXTERNAL_PORT (mapped to container port $API_PORT)\"\n else\n echo \" API: http://localhost:$API_PORT\"\n fi\n if [ \"${EXTERNAL_GUI_PORT}\" != \"${GUI_PORT}\" ]; then\n echo \" GUI: http://localhost:$EXTERNAL_GUI_PORT (mapped to container port $GUI_PORT)\"\n else\n echo \" GUI: http://localhost:$GUI_PORT\"\n fi\n echo \"\"\n echo \"Configuration:\"\n echo \" Edit: $CONFIG_DIR/config.yaml\"\n echo \" Logs: $LOGS_DIR\"\n echo \"\"\n log_info \"Next steps:\"\n echo \" 1. Edit $CONFIG_DIR/config.yaml to add your API keys\"\n echo \" 2. Run: cd $INSTALL_DIR && ./authica-mesh start\"\n echo \"\"\n}\n\n# =============================================================================\n# Binary Installation\n# =============================================================================\n\ninstall_bun() {\n log_step \"Installing Bun\"\n curl -fsSL https://bun.sh/install | bash\n \n if [ -f \"$HOME/.bun/bin/bun\" ]; then\n export BUN_INSTALL=\"$HOME/.bun\"\n export PATH=\"$BUN_INSTALL/bin:$PATH\"\n fi\n \n if ! command_exists bun; then\n log_error \"Bun installation failed\"\n exit 1\n fi\n \n log_success \"Bun installed ($(bun --version))\"\n}\n\ncheck_binary_prereqs() {\n log_step \"Checking prerequisites\"\n \n if ! command_exists bun; then\n log_warn \"Bun is not installed\"\n install_bun\n else\n log_success \"Bun is installed ($(bun --version))\"\n fi\n \n if ! command_exists git; then\n log_error \"Git is not installed. Please install Git first.\"\n exit 1\n fi\n \n log_success \"All prerequisites met\"\n}\n\nbuild_binary() {\n local platform=\"$1\"\n local src_dir=\"$INSTALL_DIR/source\"\n local bin_dir=\"$INSTALL_DIR/bin\"\n \n log_step \"Building Authica Mesh binary\"\n \n mkdir -p \"$bin_dir\"\n \n # Clone or update source\n if [ -d \"$src_dir/.git\" ]; then\n log_info \"Updating existing source...\"\n cd \"$src_dir\" && git pull origin main\n else\n log_info \"Cloning repository...\"\n rm -rf \"$src_dir\"\n git clone --depth 1 \"https://github.com/$REPO.git\" \"$src_dir\"\n fi\n \n cd \"$src_dir\"\n \n # Install dependencies\n log_info \"Installing dependencies...\"\n bun install\n cd gui && bun install && cd ..\n \n # Build GUI\n log_info \"Building GUI...\"\n bun run build:gui\n \n # Compile binary\n log_info \"Compiling binary (this may take a minute)...\"\n bun build --compile --target=\"bun-${platform}\" \\\n --outfile=\"$bin_dir/authica-mesh-server\" \\\n src/server.ts\n \n # Copy GUI build\n mkdir -p \"$INSTALL_DIR/gui\"\n cp -r gui/build \"$INSTALL_DIR/gui/\"\n \n log_success \"Binary built at $bin_dir/authica-mesh-server\"\n}\n\ncreate_binary_config() {\n local config_file=\"$CONFIG_DIR/config.yaml\"\n \n if [ -f \"$config_file\" ]; then\n log_info \"Existing configuration found\"\n return\n fi\n \n log_step \"Creating default configuration\"\n \n cat > \"$config_file\" << EOF\n# Authica Mesh Configuration\n\nserver:\n port: ${API_PORT}\n host: \"0.0.0.0\"\n timeout: 120\n\nlogging:\n dir: \"${LOGS_DIR}\"\n level: \"info\"\n maskKeys: true\n\ndefaultProvider: null\nEOF\n \n log_success \"Configuration created\"\n}\n\ncreate_binary_wrapper() {\n local bin_dir=\"$INSTALL_DIR/bin\"\n \n log_step \"Creating command wrapper\"\n \n mkdir -p \"$bin_dir\"\n \n cat > \"$bin_dir/authica-mesh\" << EOF\n#!/bin/bash\n# Authica Mesh - Binary Command Wrapper\n\nINSTALL_DIR=\"$INSTALL_DIR\"\nCONFIG_DIR=\"$CONFIG_DIR\"\nLOGS_DIR=\"$LOGS_DIR\"\nPID_FILE=\"$INSTALL_DIR/authica-mesh.pid\"\n\nmkdir -p \"\\$CONFIG_DIR\" \"\\$LOGS_DIR\"\n\nis_running() {\n if [ -f \"\\$PID_FILE\" ]; then\n local pid=\\$(cat \"\\$PID_FILE\" 2>/dev/null)\n [ -n \"\\$pid\" ] && kill -0 \"\\$pid\" 2>/dev/null\n return \\$?\n fi\n return 1\n}\n\ncase \"\\${1:-}\" in\n start)\n if is_running; then\n echo \"Authica Mesh is already running (PID: \\$(cat \"\\$PID_FILE\"))\"\n exit 1\n fi\n echo \"Starting Authica Mesh...\"\n export AUTHICA_MESH_CONFIG_DIR=\"\\$CONFIG_DIR\"\n nohup \"$bin_dir/authica-mesh-server\" --gui-port \"${GUI_PORT}\" > \"\\$LOGS_DIR/authica-mesh.log\" 2>&1 &\n echo \\$! > \"\\$PID_FILE\"\n sleep 2\n if is_running; then\n echo \"Authica Mesh started!\"\n echo \" API: http://localhost:${API_PORT}\"\n echo \" GUI: http://localhost:${GUI_PORT}\"\n else\n echo \"Failed to start. Check logs: \\$LOGS_DIR/authica-mesh.log\"\n exit 1\n fi\n ;;\n stop)\n if ! is_running; then\n echo \"Authica Mesh is not running\"\n exit 1\n fi\n kill \"\\$(cat \"\\$PID_FILE\")\" 2>/dev/null\n rm -f \"\\$PID_FILE\"\n echo \"Authica Mesh stopped\"\n ;;\n restart)\n \\$0 stop || true\n sleep 1\n \\$0 start\n ;;\n status)\n if is_running; then\n echo \"Authica Mesh is running (PID: \\$(cat \"\\$PID_FILE\"))\"\n else\n echo \"Authica Mesh is not running\"\n fi\n ;;\n logs)\n tail -f \"\\$LOGS_DIR/authica-mesh.log\"\n ;;\n config)\n \\${EDITOR:-nano} \"\\$CONFIG_DIR/config.yaml\"\n ;;\n update)\n echo \"Updating Authica Mesh...\"\n curl -fsSL https://raw.githubusercontent.com/$REPO/main/scripts/install.sh | bash -s -- --binary\n ;;\n *)\n echo \"Authica Mesh - Binary Mode\"\n echo \"\"\n echo \"Usage: authica-mesh [start|stop|restart|status|logs|config|update]\"\n ;;\nesac\nEOF\n \n chmod +x \"$bin_dir/authica-mesh\"\n log_success \"Wrapper script created\"\n}\n\nsetup_binary_systemd() {\n if [ -n \"$AUTHICA_MESH_SKIP_SYSTEMD\" ]; then\n return\n fi\n \n if [ \"$(uname -s)\" != \"Linux\" ]; then\n return\n fi\n \n if [ ! -d /etc/systemd/system ]; then\n return\n fi\n \n log_step \"Setting up systemd service\"\n \n cat > /tmp/authica-mesh.service << EOF\n[Unit]\nDescription=Authica Mesh - Universal Model Router\nAfter=network.target\n\n[Service]\nType=forking\nUser=%I\nWorkingDirectory=$INSTALL_DIR\nEnvironment=\"PATH=$HOME/.bun/bin:/usr/local/bin:/usr/bin:/bin\"\nEnvironment=\"AUTHICA_MESH_CONFIG_DIR=$CONFIG_DIR\"\nExecStart=$INSTALL_DIR/bin/authica-mesh start\nExecStop=$INSTALL_DIR/bin/authica-mesh stop\nPIDFile=$INSTALL_DIR/authica-mesh.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\nEOF\n \n if command_exists sudo; then\n sudo mv /tmp/authica-mesh.service /etc/systemd/system/authica-mesh@.service\n sudo systemctl daemon-reload\n else\n mv /tmp/authica-mesh.service /etc/systemd/system/authica-mesh@.service\n systemctl daemon-reload\n fi\n \n log_success \"Systemd service installed\"\n}\n\nadd_to_path() {\n local bin_dir=\"$INSTALL_DIR/bin\"\n local shell_rc=\"\"\n \n case \"$SHELL\" in\n */bash) shell_rc=\"$HOME/.bashrc\" ;;\n */zsh) shell_rc=\"$HOME/.zshrc\" ;;\n */fish) shell_rc=\"$HOME/.config/fish/config.fish\" ;;\n esac\n \n if [ \"$(uname -s)\" = \"Darwin\" ] && [ -f \"$HOME/.bash_profile\" ]; then\n shell_rc=\"$HOME/.bash_profile\"\n fi\n \n if [ -n \"$shell_rc\" ] && [ -f \"$shell_rc\" ]; then\n if ! grep -q \"$bin_dir\" \"$shell_rc\" 2>/dev/null; then\n log_info \"Adding $bin_dir to PATH in $shell_rc\"\n echo \"export PATH=\\\"$bin_dir:\\$PATH\\\"\" >> \"$shell_rc\"\n fi\n fi\n}\n\ninstall_binary() {\n local platform=$(detect_platform)\n \n echo \"\"\n echo \"╔════════════════════════════════════════════════════════════╗\"\n echo \"║ Authica Mesh - Binary Installation ║\"\n echo \"╚════════════════════════════════════════════════════════════╝\"\n echo \"\"\n \n log_info \"Platform: $platform\"\n log_info \"Installation directory: $INSTALL_DIR\"\n echo \"\"\n \n check_binary_prereqs\n setup_directories\n build_binary \"$platform\"\n create_binary_config\n create_binary_wrapper\n setup_binary_systemd\n add_to_path\n \n echo \"\"\n echo \"╔════════════════════════════════════════════════════════════╗\"\n echo \"║ Installation Complete! ║\"\n echo \"╚════════════════════════════════════════════════════════════╝\"\n echo \"\"\n log_success \"Authica Mesh installed to $INSTALL_DIR\"\n echo \"\"\n echo \"Quick start:\"\n echo \" $INSTALL_DIR/bin/authica-mesh start\"\n echo \"\"\n echo \"Access:\"\n echo \" API: http://localhost:$API_PORT\"\n echo \" GUI: http://localhost:$GUI_PORT\"\n echo \"\"\n \n if ! command -v authica-mesh >/dev/null 2>&1; then\n echo \"Note: Restart your shell or run: export PATH=\\\"$INSTALL_DIR/bin:\\$PATH\\\"\"\n fi\n echo \"\"\n}\n\n# =============================================================================\n# Main\n# =============================================================================\n\nmain() {\n if [ \"$INSTALL_MODE\" = \"binary\" ]; then\n install_binary\n else\n install_docker\n fi\n}\n\nmain \"$@\"\n"}, "a7c834873265d9f38f5e64282fb2b55e4aa452a3": {"t": 1785758317.1917207, "n": 23217, "h": "d351ede6dabb5447", "c": "#!/bin/bash\n#\n# Authica Mesh - Unified Installation Script\n# Usage: curl -fsSL https://raw.githubusercontent.com/authicahq/mesh/main/scripts/install.sh | bash\n#\n# This script installs Authica Mesh using either Docker (default) or as a standalone binary.\n#\n# Installation modes:\n# Docker (default): curl -fsSL ... | bash\n# Binary: curl -fsSL ... | bash -s -- --binary\n#\n# Environment variables:\n# AUTHICA_MESH_INSTALL_DIR - Installation directory (default: ~/.local/share/authica-mesh)\n# AUTHICA_MESH_PORT - API server port (default: 3000)\n# AUTHICA_MESH_GUI_PORT - GUI server port (default: 3001)\n# AUTHICA_MESH_EXTERNAL_PORT - External API port for port mapping (default: AUTHICA_MESH_PORT)\n# AUTHICA_MESH_EXTERNAL_GUI_PORT - External GUI port for port mapping (default: AUTHICA_MESH_GUI_PORT)\n# AUTHICA_MESH_SKIP_SYSTEMD - Skip systemd service setup\n# AUTHICA_MESH_VERSION - Specific version to install (binary mode only)\n#\n# Examples:\n# # Docker install with custom ports\n# AUTHICA_MESH_PORT=8080 AUTHICA_MESH_GUI_PORT=8081 ./install.sh\n#\n# # Binary install\n# ./install.sh --binary\n#\n# # Specific version (binary only)\n# AUTHICA_MESH_VERSION=v2.1.0 ./install.sh --binary\n\nset -e\n\n# =============================================================================\n# Configuration\n# =============================================================================\n\nREPO=\"authicahq/mesh\"\nIMAGE=\"ghcr.io/authicahq/mesh:latest\"\nINSTALL_DIR=\"${AUTHICA_MESH_INSTALL_DIR:-$HOME/.local/share/authica-mesh}\"\nCONFIG_DIR=\"$INSTALL_DIR/config\"\nLOGS_DIR=\"$INSTALL_DIR/logs\"\nAPI_PORT=\"${AUTHICA_MESH_PORT:-3000}\"\nGUI_PORT=\"${AUTHICA_MESH_GUI_PORT:-3001}\"\nEXTERNAL_PORT=\"${AUTHICA_MESH_EXTERNAL_PORT:-$API_PORT}\"\nEXTERNAL_GUI_PORT=\"${AUTHICA_MESH_EXTERNAL_GUI_PORT:-$GUI_PORT}\"\nSERVICE_NAME=\"authica-mesh\"\n\n# Parse arguments\nINSTALL_MODE=\"docker\" # docker or binary\nwhile [[ $# -gt 0 ]]; do\n case $1 in\n --binary)\n INSTALL_MODE=\"binary\"\n shift\n ;;\n --docker)\n INSTALL_MODE=\"docker\"\n shift\n ;;\n --help|-h)\n show_help\n exit 0\n ;;\n *)\n echo \"Unknown option: $1\"\n echo \"Use --help for usage information\"\n exit 1\n ;;\n esac\ndone\n\n# Colors\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nBLUE='\\033[0;34m'\nCYAN='\\033[0;36m'\nNC='\\033[0m'\n\n# Logging functions\nlog_info() { echo -e \"${BLUE}[INFO]${NC} $1\"; }\nlog_success() { echo -e \"${GREEN}[OK]${NC} $1\"; }\nlog_warn() { echo -e \"${YELLOW}[WARN]${NC} $1\"; }\nlog_error() { echo -e \"${RED}[ERROR]${NC} $1\"; }\nlog_step() { echo -e \"\\n${CYAN}▶ $1${NC}\"; }\n\n# =============================================================================\n# Helper Functions\n# =============================================================================\n\ndetect_os() {\n case \"$(uname -s)\" in\n Linux*) echo \"Linux\";;\n Darwin*) echo \"Mac\";;\n CYGWIN*|MINGW*|MSYS*) echo \"Windows\";;\n *) echo \"UNKNOWN\";;\n esac\n}\n\ndetect_platform() {\n local os arch\n case \"$(uname -s)\" in\n Linux*) os=\"linux\";;\n Darwin*) os=\"darwin\";;\n CYGWIN*|MINGW*|MSYS*) os=\"windows\";;\n *) os=\"unknown\";;\n esac\n case \"$(uname -m)\" in\n x86_64|amd64) arch=\"x64\";;\n arm64|aarch64) arch=\"arm64\";;\n *) arch=\"unknown\";;\n esac\n echo \"${os}-${arch}\"\n}\n\ncommand_exists() {\n command -v \"$1\" >/dev/null 2>&1\n}\n\nshow_help() {\n cat << 'EOF'\nAuthica Mesh - Unified Installation Script\n\nUsage: install.sh [OPTIONS]\n\nOptions:\n --docker Install using Docker (default)\n --binary Install as standalone binary (requires Bun)\n --help, -h Show this help message\n\nEnvironment Variables:\n AUTHICA_MESH_INSTALL_DIR Installation directory (default: ~/.local/share/authica-mesh)\n AUTHICA_MESH_PORT API server port (default: 3000)\n AUTHICA_MESH_GUI_PORT GUI server port (default: 3001)\n AUTHICA_MESH_EXTERNAL_PORT External API port for reverse proxy (default: AUTHICA_MESH_PORT)\n AUTHICA_MESH_EXTERNAL_GUI_PORT External GUI port for reverse proxy (default: AUTHICA_MESH_GUI_PORT)\n AUTHICA_MESH_SKIP_SYSTEMD Skip systemd service setup\n AUTHICA_MESH_VERSION Specific version for binary install (e.g., v2.1.0)\n\nExamples:\n # Docker install (recommended)\n curl -fsSL https://raw.githubusercontent.com/authicahq/mesh/main/scripts/install.sh | bash\n\n # Docker with custom ports\n AUTHICA_MESH_PORT=8080 AUTHICA_MESH_GUI_PORT=8081 ./install.sh\n\n # Binary install\n ./install.sh --binary\n\n # Binary specific version\n AUTHICA_MESH_VERSION=v2.1.0 ./install.sh --binary\nEOF\n}\n\n# =============================================================================\n# Docker Installation\n# =============================================================================\n\ncheck_docker() {\n log_step \"Checking Docker prerequisites\"\n \n if ! command_exists docker; then\n log_error \"Docker is not installed.\"\n echo \"\"\n echo \"Please install Docker first:\"\n echo \" - Linux: https://docs.docker.com/engine/install/\"\n echo \" - macOS: https://docs.docker.com/desktop/install/mac-install/\"\n echo \" - Windows: https://docs.docker.com/desktop/install/windows-install/\"\n exit 1\n fi\n \n if ! docker info >/dev/null 2>&1; then\n log_error \"Docker daemon is not running or not accessible.\"\n echo \"\"\n echo \"Please start Docker and try again.\"\n exit 1\n fi\n \n log_success \"Docker is installed and running\"\n}\n\nsetup_directories() {\n log_step \"Setting up directories\"\n \n mkdir -p \"$CONFIG_DIR\" \"$LOGS_DIR\"\n \n # Set ownership to UID 1001 (authica-mesh user in container)\n local os=$(detect_os)\n if [ \"$os\" = \"Linux\" ] || [ \"$os\" = \"Mac\" ]; then\n if chown -R 1001:1001 \"$CONFIG_DIR\" \"$LOGS_DIR\" 2>/dev/null; then\n log_success \"Directory ownership set to UID 1001\"\n else\n log_warn \"Could not change ownership to UID 1001 (may need sudo)\"\n log_warn \"Making directories world-writable as fallback...\"\n chmod -R 777 \"$CONFIG_DIR\" \"$LOGS_DIR\"\n fi\n fi\n \n log_success \"Directories created at $INSTALL_DIR\"\n}\n\ncreate_config() {\n local config_file=\"$CONFIG_DIR/config.yaml\"\n \n if [ -f \"$config_file\" ]; then\n log_info \"Existing configuration found\"\n return\n fi\n \n log_step \"Creating default configuration\"\n \n cat > \"$config_file\" << 'EOF'\n# Authica Mesh Configuration\n# Documentation: https://github.com/authicahq/mesh#configuration\n\nserver:\n port: 3000\n host: \"0.0.0.0\"\n timeout: 120\n\nlogging:\n dir: \"/app/logs\"\n level: \"info\"\n maskKeys: true\n\n# Configure your providers and API keys here\n# providers:\n# openai:\n# apiKeyEnv: \"OPENAI_API_KEY\"\n# timeout: 180\n# \n# anthropic:\n# apiKeyEnv: \"ANTHROPIC_API_KEY\"\n# timeout: 180\n\n# Configure routing rules here\n# routes:\n# - pattern: \"gpt-4*\"\n# provider: openai\n# priority: 100\n\ndefaultProvider: null\nEOF\n \n log_success \"Configuration created\"\n}\n\ncreate_docker_compose() {\n log_step \"Creating docker-compose.yml\"\n \n # Only add external port env vars if they differ from internal ports\n local external_config=\"\"\n if [ \"${EXTERNAL_PORT}\" != \"${API_PORT}\" ]; then\n external_config=\" - EXTERNAL_PORT=${EXTERNAL_PORT}\"\n fi\n if [ \"${EXTERNAL_GUI_PORT}\" != \"${GUI_PORT}\" ]; then\n if [ -n \"$external_config\" ]; then\n external_config=\"${external_config}\n - EXTERNAL_GUI_PORT=${EXTERNAL_GUI_PORT}\"\n else\n external_config=\" - EXTERNAL_GUI_PORT=${EXTERNAL_GUI_PORT}\"\n fi\n fi\n \n cat > \"$INSTALL_DIR/docker-compose.yml\" << EOF\n# Authica Mesh - Docker Compose Configuration\n\nservices:\n authica-mesh:\n image: ${IMAGE}\n container_name: ${SERVICE_NAME}\n restart: unless-stopped\n ports:\n - \"${API_PORT}:3000\"\n - \"${GUI_PORT}:3001\"\n environment:\n # Port mapping configuration\n${external_config:-# - EXTERNAL_PORT=3000}\n \n # API Keys - pass through from host environment\n - OPENAI_API_KEY=\\${OPENAI_API_KEY:-}\n - ANTHROPIC_API_KEY=\\${ANTHROPIC_API_KEY:-}\n - GOOGLE_API_KEY=\\${GOOGLE_API_KEY:-}\n - GROQ_API_KEY=\\${GROQ_API_KEY:-}\n - TOGETHER_API_KEY=\\${TOGETHER_API_KEY:-}\n - FIREWORKS_API_KEY=\\${FIREWORKS_API_KEY:-}\n - DEEPSEEK_API_KEY=\\${DEEPSEEK_API_KEY:-}\n - MISTRAL_API_KEY=\\${MISTRAL_API_KEY:-}\n - COHERE_API_KEY=\\${COHERE_API_KEY:-}\n - OPENROUTER_API_KEY=\\${OPENROUTER_API_KEY:-}\n - PERPLEXITY_API_KEY=\\${PERPLEXITY_API_KEY:-}\n - ANYSCALE_API_KEY=\\${ANYSCALE_API_KEY:-}\n \n # Ollama configuration\n - OLLAMA_BASE_URL=\\${OLLAMA_BASE_URL:-http://host.docker.internal:11434}\n \n volumes:\n - ${CONFIG_DIR}:/app/config:rw\n - ${LOGS_DIR}:/app/logs:rw\n healthcheck:\n test: [\"CMD\", \"wget\", \"--no-verbose\", \"--tries=1\", \"--spider\", \"http://localhost:3000/health\"]\n interval: 30s\n timeout: 3s\n retries: 3\n start_period: 5s\nEOF\n \n log_success \"docker-compose.yml created\"\n}\n\ncreate_docker_wrapper() {\n log_step \"Creating command wrapper\"\n \n cat > \"$INSTALL_DIR/authica-mesh\" << 'EOF'\n#!/bin/bash\n# Authica Mesh - Docker Command Wrapper\n\nINSTALL_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nCOMPOSE_FILE=\"$INSTALL_DIR/docker-compose.yml\"\n\ncase \"${1:-}\" in\n start)\n echo \"Starting Authica Mesh...\"\n docker compose -f \"$COMPOSE_FILE\" up -d\n echo \"\"\n echo \"Authica Mesh is running at:\"\n echo \" API: http://localhost:3000\"\n echo \" GUI: http://localhost:3001\"\n ;;\n stop)\n echo \"Stopping Authica Mesh...\"\n docker compose -f \"$COMPOSE_FILE\" down\n ;;\n restart)\n echo \"Restarting Authica Mesh...\"\n docker compose -f \"$COMPOSE_FILE\" restart\n ;;\n logs)\n docker compose -f \"$COMPOSE_FILE\" logs -f\n ;;\n status)\n docker compose -f \"$COMPOSE_FILE\" ps\n ;;\n update)\n echo \"Updating Authica Mesh...\"\n docker compose -f \"$COMPOSE_FILE\" pull\n docker compose -f \"$COMPOSE_FILE\" up -d\n ;;\n config)\n ${EDITOR:-nano} \"$INSTALL_DIR/config/config.yaml\"\n ;;\n shell)\n docker compose -f \"$COMPOSE_FILE\" exec authica-mesh sh\n ;;\n *)\n echo \"Authica Mesh - Universal Model Router (Docker)\"\n echo \"\"\n echo \"Usage: authica-mesh [command]\"\n echo \"\"\n echo \"Commands:\"\n echo \" start Start Authica Mesh\"\n echo \" stop Stop Authica Mesh\"\n echo \" restart Restart Authica Mesh\"\n echo \" logs View logs\"\n echo \" status Check status\"\n echo \" update Update to latest version\"\n echo \" config Edit configuration\"\n echo \" shell Open shell in container\"\n echo \"\"\n echo \"Directories:\"\n echo \" Config: $INSTALL_DIR/config\"\n echo \" Logs: $INSTALL_DIR/logs\"\n ;;\nesac\nEOF\n \n chmod +x \"$INSTALL_DIR/authica-mesh\"\n log_success \"Wrapper script created\"\n}\n\nsetup_docker_systemd() {\n if [ -n \"$AUTHICA_MESH_SKIP_SYSTEMD\" ]; then\n return\n fi\n \n local os=$(detect_os)\n if [ \"$os\" != \"Linux\" ]; then\n return\n fi\n \n if [ ! -d /etc/systemd/system ]; then\n return\n fi\n \n if [ \"$EUID\" -ne 0 ] && ! command_exists sudo; then\n log_warn \"Cannot setup systemd without sudo access\"\n return\n fi\n \n log_step \"Setting up systemd service\"\n \n cat > /tmp/authica-mesh.service << EOF\n[Unit]\nDescription=Authica Mesh - Universal Model Router\nRequires=docker.service\nAfter=docker.service\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nWorkingDirectory=${INSTALL_DIR}\nExecStart=${INSTALL_DIR}/authica-mesh start\nExecStop=${INSTALL_DIR}/authica-mesh stop\n\n[Install]\nWantedBy=multi-user.target\nEOF\n \n if [ \"$EUID\" -eq 0 ]; then\n mv /tmp/authica-mesh.service /etc/systemd/system/\n else\n sudo mv /tmp/authica-mesh.service /etc/systemd/system/\n fi\n \n systemctl daemon-reload\n log_success \"Systemd service installed\"\n log_info \"Enable with: sudo systemctl enable authica-mesh\"\n log_info \"Start with: sudo systemctl start authica-mesh\"\n}\n\ninstall_docker() {\n echo \"\"\n echo \"╔════════════════════════════════════════════════════════════╗\"\n echo \"║ Authica Mesh - Docker Installation ║\"\n echo \"╚════════════════════════════════════════════════════════════╝\"\n echo \"\"\n \n log_info \"Installation directory: $INSTALL_DIR\"\n log_info \"API port: $API_PORT\"\n log_info \"GUI port: $GUI_PORT\"\n [ \"${EXTERNAL_PORT}\" != \"${API_PORT}\" ] && log_info \"External API port: $EXTERNAL_PORT\"\n [ \"${EXTERNAL_GUI_PORT}\" != \"${GUI_PORT}\" ] && log_info \"External GUI port: $EXTERNAL_GUI_PORT\"\n echo \"\"\n \n check_docker\n setup_directories\n create_config\n create_docker_compose\n create_docker_wrapper\n setup_docker_systemd\n \n # Add to PATH suggestion\n local shell_rc=\"\"\n case \"$SHELL\" in\n */bash) shell_rc=\"$HOME/.bashrc\" ;;\n */zsh) shell_rc=\"$HOME/.zshrc\" ;;\n */fish) shell_rc=\"$HOME/.config/fish/config.fish\" ;;\n esac\n \n if [ -n \"$shell_rc\" ]; then\n echo \"\"\n log_info \"To add 'authica-mesh' to your PATH, run:\"\n echo \" echo 'export PATH=\\\"$INSTALL_DIR:\\$PATH\\\"' >> $shell_rc\"\n echo \" source $shell_rc\"\n fi\n \n echo \"\"\n echo \"╔════════════════════════════════════════════════════════════╗\"\n echo \"║ Installation Complete! ║\"\n echo \"╚════════════════════════════════════════════════════════════╝\"\n echo \"\"\n log_success \"Authica Mesh installed to $INSTALL_DIR\"\n echo \"\"\n echo \"Quick start:\"\n echo \" cd $INSTALL_DIR\"\n echo \" ./authica-mesh start\"\n echo \"\"\n echo \"Access:\"\n if [ \"${EXTERNAL_PORT}\" != \"${API_PORT}\" ]; then\n echo \" API: http://localhost:$EXTERNAL_PORT (mapped to container port $API_PORT)\"\n else\n echo \" API: http://localhost:$API_PORT\"\n fi\n if [ \"${EXTERNAL_GUI_PORT}\" != \"${GUI_PORT}\" ]; then\n echo \" GUI: http://localhost:$EXTERNAL_GUI_PORT (mapped to container port $GUI_PORT)\"\n else\n echo \" GUI: http://localhost:$GUI_PORT\"\n fi\n echo \"\"\n echo \"Configuration:\"\n echo \" Edit: $CONFIG_DIR/config.yaml\"\n echo \" Logs: $LOGS_DIR\"\n echo \"\"\n log_info \"Next steps:\"\n echo \" 1. Edit $CONFIG_DIR/config.yaml to add your API keys\"\n echo \" 2. Run: cd $INSTALL_DIR && ./authica-mesh start\"\n echo \"\"\n}\n\n# =============================================================================\n# Binary Installation\n# =============================================================================\n\ninstall_bun() {\n log_step \"Installing Bun\"\n curl -fsSL https://bun.sh/install | bash\n \n if [ -f \"$HOME/.bun/bin/bun\" ]; then\n export BUN_INSTALL=\"$HOME/.bun\"\n export PATH=\"$BUN_INSTALL/bin:$PATH\"\n fi\n \n if ! command_exists bun; then\n log_error \"Bun installation failed\"\n exit 1\n fi\n \n log_success \"Bun installed ($(bun --version))\"\n}\n\ncheck_binary_prereqs() {\n log_step \"Checking prerequisites\"\n \n if ! command_exists bun; then\n log_warn \"Bun is not installed\"\n install_bun\n else\n log_success \"Bun is installed ($(bun --version))\"\n fi\n \n if ! command_exists git; then\n log_error \"Git is not installed. Please install Git first.\"\n exit 1\n fi\n \n log_success \"All prerequisites met\"\n}\n\nbuild_binary() {\n local platform=\"$1\"\n local src_dir=\"$INSTALL_DIR/source\"\n local bin_dir=\"$INSTALL_DIR/bin\"\n \n log_step \"Building Authica Mesh binary\"\n \n mkdir -p \"$bin_dir\"\n \n # Clone or update source\n if [ -d \"$src_dir/.git\" ]; then\n log_info \"Updating existing source...\"\n cd \"$src_dir\" && git pull origin main\n else\n log_info \"Cloning repository...\"\n rm -rf \"$src_dir\"\n git clone --depth 1 \"https://github.com/$REPO.git\" \"$src_dir\"\n fi\n \n cd \"$src_dir\"\n \n # Install dependencies\n log_info \"Installing dependencies...\"\n bun install\n cd gui && bun install && cd ..\n \n # Build GUI\n log_info \"Building GUI...\"\n bun run build:gui\n \n # Compile binary\n log_info \"Compiling binary (this may take a minute)...\"\n bun build --compile --target=\"bun-${platform}\" \\\n --outfile=\"$bin_dir/authica-mesh-server\" \\\n src/server.ts\n \n # Copy GUI build\n mkdir -p \"$INSTALL_DIR/gui\"\n cp -r gui/build \"$INSTALL_DIR/gui/\"\n \n log_success \"Binary built at $bin_dir/authica-mesh-server\"\n}\n\ncreate_binary_config() {\n local config_file=\"$CONFIG_DIR/config.yaml\"\n \n if [ -f \"$config_file\" ]; then\n log_info \"Existing configuration found\"\n return\n fi\n \n log_step \"Creating default configuration\"\n \n cat > \"$config_file\" << EOF\n# Authica Mesh Configuration\n\nserver:\n port: ${API_PORT}\n host: \"0.0.0.0\"\n timeout: 120\n\nlogging:\n dir: \"${LOGS_DIR}\"\n level: \"info\"\n maskKeys: true\n\ndefaultProvider: null\nEOF\n \n log_success \"Configuration created\"\n}\n\ncreate_binary_wrapper() {\n local bin_dir=\"$INSTALL_DIR/bin\"\n \n log_step \"Creating command wrapper\"\n \n mkdir -p \"$bin_dir\"\n \n cat > \"$bin_dir/authica-mesh\" << EOF\n#!/bin/bash\n# Authica Mesh - Binary Command Wrapper\n\nINSTALL_DIR=\"$INSTALL_DIR\"\nCONFIG_DIR=\"$CONFIG_DIR\"\nLOGS_DIR=\"$LOGS_DIR\"\nPID_FILE=\"$INSTALL_DIR/authica-mesh.pid\"\n\nmkdir -p \"\\$CONFIG_DIR\" \"\\$LOGS_DIR\"\n\nis_running() {\n if [ -f \"\\$PID_FILE\" ]; then\n local pid=\\$(cat \"\\$PID_FILE\" 2>/dev/null)\n [ -n \"\\$pid\" ] && kill -0 \"\\$pid\" 2>/dev/null\n return \\$?\n fi\n return 1\n}\n\ncase \"\\${1:-}\" in\n start)\n if is_running; then\n echo \"Authica Mesh is already running (PID: \\$(cat \"\\$PID_FILE\"))\"\n exit 1\n fi\n echo \"Starting Authica Mesh...\"\n export AUTHICA_MESH_CONFIG_DIR=\"\\$CONFIG_DIR\"\n nohup \"$bin_dir/authica-mesh-server\" --gui-port \"${GUI_PORT}\" > \"\\$LOGS_DIR/authica-mesh.log\" 2>&1 &\n echo \\$! > \"\\$PID_FILE\"\n sleep 2\n if is_running; then\n echo \"Authica Mesh started!\"\n echo \" API: http://localhost:${API_PORT}\"\n echo \" GUI: http://localhost:${GUI_PORT}\"\n else\n echo \"Failed to start. Check logs: \\$LOGS_DIR/authica-mesh.log\"\n exit 1\n fi\n ;;\n stop)\n if ! is_running; then\n echo \"Authica Mesh is not running\"\n exit 1\n fi\n kill \"\\$(cat \"\\$PID_FILE\")\" 2>/dev/null\n rm -f \"\\$PID_FILE\"\n echo \"Authica Mesh stopped\"\n ;;\n restart)\n \\$0 stop || true\n sleep 1\n \\$0 start\n ;;\n status)\n if is_running; then\n echo \"Authica Mesh is running (PID: \\$(cat \"\\$PID_FILE\"))\"\n else\n echo \"Authica Mesh is not running\"\n fi\n ;;\n logs)\n tail -f \"\\$LOGS_DIR/authica-mesh.log\"\n ;;\n config)\n \\${EDITOR:-nano} \"\\$CONFIG_DIR/config.yaml\"\n ;;\n update)\n echo \"Updating Authica Mesh...\"\n curl -fsSL https://raw.githubusercontent.com/$REPO/main/scripts/install.sh | bash -s -- --binary\n ;;\n *)\n echo \"Authica Mesh - Binary Mode\"\n echo \"\"\n echo \"Usage: authica-mesh [start|stop|restart|status|logs|config|update]\"\n ;;\nesac\nEOF\n \n chmod +x \"$bin_dir/authica-mesh\"\n log_success \"Wrapper script created\"\n}\n\nsetup_binary_systemd() {\n if [ -n \"$AUTHICA_MESH_SKIP_SYSTEMD\" ]; then\n return\n fi\n \n if [ \"$(uname -s)\" != \"Linux\" ]; then\n return\n fi\n \n if [ ! -d /etc/systemd/system ]; then\n return\n fi\n \n log_step \"Setting up systemd service\"\n \n cat > /tmp/authica-mesh.service << EOF\n[Unit]\nDescription=Authica Mesh - Universal Model Router\nAfter=network.target\n\n[Service]\nType=forking\nUser=%I\nWorkingDirectory=$INSTALL_DIR\nEnvironment=\"PATH=$HOME/.bun/bin:/usr/local/bin:/usr/bin:/bin\"\nEnvironment=\"AUTHICA_MESH_CONFIG_DIR=$CONFIG_DIR\"\nExecStart=$INSTALL_DIR/bin/authica-mesh start\nExecStop=$INSTALL_DIR/bin/authica-mesh stop\nPIDFile=$INSTALL_DIR/authica-mesh.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\nEOF\n \n if command_exists sudo; then\n sudo mv /tmp/authica-mesh.service /etc/systemd/system/authica-mesh@.service\n sudo systemctl daemon-reload\n else\n mv /tmp/authica-mesh.service /etc/systemd/system/authica-mesh@.service\n systemctl daemon-reload\n fi\n \n log_success \"Systemd service installed\"\n}\n\nadd_to_path() {\n local bin_dir=\"$INSTALL_DIR/bin\"\n local shell_rc=\"\"\n \n case \"$SHELL\" in\n */bash) shell_rc=\"$HOME/.bashrc\" ;;\n */zsh) shell_rc=\"$HOME/.zshrc\" ;;\n */fish) shell_rc=\"$HOME/.config/fish/config.fish\" ;;\n esac\n \n if [ \"$(uname -s)\" = \"Darwin\" ] && [ -f \"$HOME/.bash_profile\" ]; then\n shell_rc=\"$HOME/.bash_profile\"\n fi\n \n if [ -n \"$shell_rc\" ] && [ -f \"$shell_rc\" ]; then\n if ! grep -q \"$bin_dir\" \"$shell_rc\" 2>/dev/null; then\n log_info \"Adding $bin_dir to PATH in $shell_rc\"\n echo \"export PATH=\\\"$bin_dir:\\$PATH\\\"\" >> \"$shell_rc\"\n fi\n fi\n}\n\ninstall_binary() {\n local platform=$(detect_platform)\n \n echo \"\"\n echo \"╔════════════════════════════════════════════════════════════╗\"\n echo \"║ Authica Mesh - Binary Installation ║\"\n echo \"╚════════════════════════════════════════════════════════════╝\"\n echo \"\"\n \n log_info \"Platform: $platform\"\n log_info \"Installation directory: $INSTALL_DIR\"\n echo \"\"\n \n check_binary_prereqs\n setup_directories\n build_binary \"$platform\"\n create_binary_config\n create_binary_wrapper\n setup_binary_systemd\n add_to_path\n \n echo \"\"\n echo \"╔════════════════════════════════════════════════════════════╗\"\n echo \"║ Installation Complete! ║\"\n echo \"╚════════════════════════════════════════════════════════════╝\"\n echo \"\"\n log_success \"Authica Mesh installed to $INSTALL_DIR\"\n echo \"\"\n echo \"Quick start:\"\n echo \" $INSTALL_DIR/bin/authica-mesh start\"\n echo \"\"\n echo \"Access:\"\n echo \" API: http://localhost:$API_PORT\"\n echo \" GUI: http://localhost:$GUI_PORT\"\n echo \"\"\n \n if ! command -v authica-mesh >/dev/null 2>&1; then\n echo \"Note: Restart your shell or run: export PATH=\\\"$INSTALL_DIR/bin:\\$PATH\\\"\"\n fi\n echo \"\"\n}\n\n# =============================================================================\n# Main\n# =============================================================================\n\nmain() {\n if [ \"$INSTALL_MODE\" = \"binary\" ]; then\n install_binary\n else\n install_docker\n fi\n}\n\nmain \"$@\"\n"}}}}