| #!/bin/bash |
|
|
| |
| export LOG_LEVEL=${LOG_LEVEL:-"info"} |
| export LOG_FILE=${LOG_FILE:-"/app/verdant_claw.log"} |
|
|
| |
| log() { |
| local msg=$(echo "$1" | sed -E 's/(nvapi|sk|gsk)[a-zA-Z0-9]+/\1*****/g') |
| echo "[$(date -u +"%Y-%m-%dT%H:%M:%SZ")] [$LOG_LEVEL] $msg" | tee -a $LOG_FILE |
| } |
|
|
| |
| cleanup() { |
| log "Shutting down services gracefully..." |
| kill $(jobs -p) 2>/dev/null |
| sleep 2 |
| log "Shutdown complete" |
| exit 0 |
| } |
| trap cleanup SIGTERM SIGINT |
|
|
| |
| |
| if [ -n "$API_KEYS_JSON" ]; then |
| log "Parsing API keys from JSON..." |
| |
| |
| export NVIDIA_API_KEY=$(echo $API_KEYS_JSON | jq -r '.nvidia // empty') |
| export OPENAI_API_KEY=$(echo $API_KEYS_JSON | jq -r '.openai // empty') |
| export ANTHROPIC_API_KEY=$(echo $API_KEYS_JSON | jq -r '.anthropic // empty') |
| export GOOGLE_API_KEY=$(echo $API_KEYS_JSON | jq -r '.google // empty') |
| export GROQ_API_KEY=$(echo $API_KEYS_JSON | jq -r '.groq // empty') |
|
|
| |
| for provider in nvidia openai anthropic google groq; do |
| for i in $(seq 2 5); do |
| val=$(echo $API_KEYS_JSON | jq -r ".${provider}_${i} // empty") |
| if [ -n "$val" ] && [ "$val" != "null" ]; then |
| envname=$(echo "${provider}_API_KEY_${i}" | tr '[:lower:]' '[:upper:]') |
| export "$envname=$val" |
| log "β Loaded rotation key: $envname" |
| fi |
| done |
| done |
|
|
| log "β API keys loaded from JSON" |
| else |
| log "β οΈ WARNING: API_KEYS_JSON not set!" |
| fi |
|
|
| |
| start_with_retry() { |
| local name=$1 |
| local cmd=$2 |
| local max_attempts=3 |
| |
| for i in $(seq 1 $max_attempts); do |
| log "Starting $name (attempt $i/$max_attempts)..." |
| $cmd & |
| local pid=$! |
| sleep 5 |
| if ps -p $pid > /dev/null; then |
| log "β $name started (PID: $pid)" |
| return 0 |
| fi |
| log "β οΈ $name failed to start, retrying..." |
| done |
| |
| log "β ERROR: $name failed after $max_attempts attempts" |
| return 1 |
| } |
|
|
| |
| check_port() { |
| local port=$1 |
| if netstat -tlnp 2>/dev/null | grep -q ":$port"; then |
| log "β ERROR: Port $port already in use!" |
| return 1 |
| fi |
| return 0 |
| } |
|
|
| log "Verifying infrastructure ports..." |
| for port in 7860 7861 7687 20128; do |
| check_port $port || exit 1 |
| done |
|
|
| |
| start_with_retry "Memgraph" "memgraph --bolt-port 7687" || exit 1 |
| start_with_retry "OmniRoute" "node /app/scripts/omniroute.js --config /app/config/omniroute-masterfile.json --port 20128" || exit 1 |
| start_with_retry "Graph Viewer" "node /app/scripts/graph-viewer.js" || exit 1 |
|
|
| log "All infrastructure ready! Launching Pi Root Agent..." |
|
|
| |
| cd /app/mom-infra |
| npm run pi -- --port 7860 --extensions /app/agent-pi/pi-extensions --skills /app/agent-pi/skills --prompts /app/agent-pi/commands |
|
|