summaryrefslogblamecommitdiff
path: root/makima/cloudflare-agent/setup.sh
blob: acf9cd982eb2b381c76eb0ed81126642765506d4 (plain) (tree)










































































































































































































































































































































                                                                                                                                                                                          
#!/usr/bin/env bash
# ============================================================================
# Makima Cloudflare Agent — Interactive Setup Script
#
# Sets up the Cloudflare Workers project for deploying a Makima edge relay
# agent. This agent acts as a WebSocket bridge between the Makima server
# and native daemon instances running on your infrastructure.
#
# Usage:
#   chmod +x setup.sh && ./setup.sh
# ============================================================================

set -euo pipefail

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m' # No Color

# ---------------------------------------------------------------------------
# Helpers
# ---------------------------------------------------------------------------

info()    { echo -e "${BLUE}ℹ${NC}  $*"; }
success() { echo -e "${GREEN}✔${NC}  $*"; }
warn()    { echo -e "${YELLOW}⚠${NC}  $*"; }
error()   { echo -e "${RED}✖${NC}  $*"; }

prompt() {
  local var_name="$1"
  local prompt_text="$2"
  local default_value="${3:-}"
  local value

  if [ -n "$default_value" ]; then
    echo -ne "${CYAN}?${NC} ${prompt_text} ${BOLD}[${default_value}]${NC}: "
  else
    echo -ne "${CYAN}?${NC} ${prompt_text}: "
  fi

  read -r value
  value="${value:-$default_value}"
  eval "$var_name=\"$value\""
}

confirm() {
  local prompt_text="$1"
  local default="${2:-y}"
  local yn

  if [ "$default" = "y" ]; then
    echo -ne "${CYAN}?${NC} ${prompt_text} ${BOLD}[Y/n]${NC}: "
  else
    echo -ne "${CYAN}?${NC} ${prompt_text} ${BOLD}[y/N]${NC}: "
  fi

  read -r yn
  yn="${yn:-$default}"

  case "$yn" in
    [Yy]*) return 0 ;;
    *)     return 1 ;;
  esac
}

separator() {
  echo ""
  echo -e "${BLUE}──────────────────────────────────────────────────────${NC}"
  echo ""
}

# ---------------------------------------------------------------------------
# Header
# ---------------------------------------------------------------------------

clear 2>/dev/null || true
echo ""
echo -e "${BOLD}${CYAN}"
echo "  ╔══════════════════════════════════════════════════╗"
echo "  ║          Makima Cloudflare Agent Setup           ║"
echo "  ║                                                  ║"
echo "  ║  Edge relay for distributed task orchestration   ║"
echo "  ╚══════════════════════════════════════════════════╝"
echo -e "${NC}"
echo ""

# ---------------------------------------------------------------------------
# 1. Check Prerequisites
# ---------------------------------------------------------------------------

info "Checking prerequisites..."
echo ""

missing=0

# Node.js
if command -v node &>/dev/null; then
  node_version=$(node --version)
  # Check if version is 18+
  major_version=$(echo "$node_version" | sed 's/v//' | cut -d. -f1)
  if [ "$major_version" -ge 18 ]; then
    success "Node.js ${node_version}"
  else
    error "Node.js ${node_version} (requires v18+)"
    missing=1
  fi
else
  error "Node.js not found (requires v18+)"
  missing=1
fi

# npm
if command -v npm &>/dev/null; then
  success "npm $(npm --version)"
else
  error "npm not found"
  missing=1
fi

# npx
if command -v npx &>/dev/null; then
  success "npx available"
else
  error "npx not found"
  missing=1
fi

if [ "$missing" -eq 1 ]; then
  echo ""
  error "Missing prerequisites. Please install the missing tools and try again."
  echo ""
  info "Install Node.js 18+: https://nodejs.org/"
  exit 1
fi

separator

# ---------------------------------------------------------------------------
# 2. Gather Configuration
# ---------------------------------------------------------------------------

info "Let's configure your Makima edge agent."
echo ""

prompt MAKIMA_SERVER_URL "Makima server WebSocket URL" "wss://api.makima.jp"
echo ""

prompt MAKIMA_API_KEY "Makima API key (from your server dashboard)" ""
if [ -z "$MAKIMA_API_KEY" ]; then
  error "API key is required."
  exit 1
fi
echo ""

prompt MAKIMA_AGENT_NAME "Agent display name (optional)" "makima-edge"
echo ""

separator

# ---------------------------------------------------------------------------
# 3. Install Dependencies
# ---------------------------------------------------------------------------

info "Installing dependencies..."
echo ""

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

npm install 2>&1 | while IFS= read -r line; do
  echo "  $line"
done

echo ""
success "Dependencies installed."

separator

# ---------------------------------------------------------------------------
# 4. Create .dev.vars (local secrets for development)
# ---------------------------------------------------------------------------

info "Creating .dev.vars for local development secrets..."

cat > .dev.vars <<EOF
# Makima Cloudflare Agent — Local Development Secrets
# These are used by 'wrangler dev' and should NOT be committed to git.

MAKIMA_SERVER_URL=${MAKIMA_SERVER_URL}
MAKIMA_API_KEY=${MAKIMA_API_KEY}
MAKIMA_AGENT_NAME=${MAKIMA_AGENT_NAME}
EOF

success "Created .dev.vars"
echo ""

# Ensure .dev.vars is gitignored
if [ -f .gitignore ]; then
  if ! grep -q ".dev.vars" .gitignore 2>/dev/null; then
    echo ".dev.vars" >> .gitignore
    success "Added .dev.vars to .gitignore"
  fi
else
  echo ".dev.vars" > .gitignore
  echo "node_modules/" >> .gitignore
  echo ".wrangler/" >> .gitignore
  success "Created .gitignore"
fi

separator

# ---------------------------------------------------------------------------
# 5. Wrangler Login Check
# ---------------------------------------------------------------------------

info "Checking Cloudflare authentication..."
echo ""

if npx wrangler whoami 2>/dev/null | grep -q "You are logged in"; then
  success "Already logged in to Cloudflare."
else
  warn "Not logged in to Cloudflare."
  if confirm "Would you like to log in now?"; then
    npx wrangler login
    success "Logged in to Cloudflare."
  else
    warn "Skipping login. You'll need to run 'npx wrangler login' before deploying."
  fi
fi

separator

# ---------------------------------------------------------------------------
# 6. Set Production Secrets
# ---------------------------------------------------------------------------

if confirm "Would you like to set production secrets now? (Required before first deploy)"; then
  echo ""
  info "Setting secrets via Wrangler..."
  echo ""

  echo "$MAKIMA_SERVER_URL" | npx wrangler secret put MAKIMA_SERVER_URL 2>&1 | while IFS= read -r line; do
    echo "  $line"
  done
  success "Set MAKIMA_SERVER_URL"

  echo "$MAKIMA_API_KEY" | npx wrangler secret put MAKIMA_API_KEY 2>&1 | while IFS= read -r line; do
    echo "  $line"
  done
  success "Set MAKIMA_API_KEY"

  if [ -n "$MAKIMA_AGENT_NAME" ]; then
    echo "$MAKIMA_AGENT_NAME" | npx wrangler secret put MAKIMA_AGENT_NAME 2>&1 | while IFS= read -r line; do
      echo "  $line"
    done
    success "Set MAKIMA_AGENT_NAME"
  fi
fi

separator

# ---------------------------------------------------------------------------
# 7. Deploy or Dev
# ---------------------------------------------------------------------------

echo -e "${BOLD}Setup complete!${NC} What would you like to do next?"
echo ""
echo "  1) Deploy to Cloudflare Workers (production)"
echo "  2) Start local development server"
echo "  3) Exit (deploy later)"
echo ""

prompt NEXT_ACTION "Choose an option" "3"

case "$NEXT_ACTION" in
  1)
    echo ""
    info "Deploying to Cloudflare Workers..."
    echo ""
    npx wrangler deploy 2>&1 | while IFS= read -r line; do
      echo "  $line"
    done
    echo ""
    success "Deployed! Your Makima edge agent is live."
    ;;
  2)
    echo ""
    info "Starting local development server..."
    echo ""
    info "Press Ctrl+C to stop."
    echo ""
    npx wrangler dev
    ;;
  3|*)
    ;;
esac

# ---------------------------------------------------------------------------
# 8. Next Steps
# ---------------------------------------------------------------------------

separator

echo -e "${BOLD}${GREEN}🎉 Makima Cloudflare Agent is ready!${NC}"
echo ""
echo -e "  ${BOLD}Useful commands:${NC}"
echo ""
echo -e "    ${CYAN}npm run dev${NC}      Start local development server"
echo -e "    ${CYAN}npm run deploy${NC}   Deploy to Cloudflare Workers"
echo -e "    ${CYAN}npm run tail${NC}     Stream production logs"
echo ""
echo -e "  ${BOLD}API Endpoints (after deploy):${NC}"
echo ""
echo -e "    ${CYAN}GET  /status${NC}     Agent connection status"
echo -e "    ${CYAN}GET  /health${NC}     Health check"
echo -e "    ${CYAN}GET  /tasks${NC}      Task dispatch history"
echo -e "    ${CYAN}GET  /logs${NC}       Connection event logs"
echo -e "    ${CYAN}POST /reconnect${NC}  Force upstream reconnection"
echo -e "    ${CYAN}WS   /ws/daemon${NC}  Downstream daemon WebSocket"
echo ""
echo -e "  ${BOLD}Architecture:${NC}"
echo ""
echo -e "    Makima Server  ←WebSocket→  ${CYAN}Edge Agent${NC}  ←WebSocket→  Native Daemons"
echo ""
echo -e "  ${BOLD}Documentation:${NC}"
echo -e "    See ${CYAN}README.md${NC} for full setup and architecture details."
echo ""