Files
wevads-platform/scripts/mind-autonomous.sh
2026-02-26 04:53:11 +01:00

176 lines
10 KiB
Bash
Executable File

#!/bin/bash
# ╔═══════════════════════════════════════════════════════════════╗
# ║ 🧠 WEVAL MIND — Autonomous Intelligence Cycle ║
# ║ Every 30min: health scan → AI analysis → learn → act ║
# ╚═══════════════════════════════════════════════════════════════╝
LOG="/opt/wevads/logs/mind-autonomous.log"
DB="psql -U postgres -d adx_system -t -A"
HAMID_API="http://127.0.0.1:5890/api/hamid-chef.php"
MIND_API="http://127.0.0.1:5890/api/weval-mind-core.php"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
mkdir -p /opt/wevads/logs
log() { echo "[$TIMESTAMP] $1" >> "$LOG"; }
log "===== MIND AUTONOMOUS CYCLE ====="
# ═══════════════════════════════════════
# PHASE 1: COLLECT SYSTEM METRICS
# ═══════════════════════════════════════
WARMUP_WARMING=$($DB -c "SELECT COUNT(*) FROM admin.warmup_accounts WHERE status='warming'" 2>/dev/null || echo 0)
WARMUP_ACTIVE=$($DB -c "SELECT COUNT(*) FROM admin.warmup_accounts WHERE status='active'" 2>/dev/null || echo 0)
SENT_TODAY=$($DB -c "SELECT COALESCE(SUM(sent_today),0) FROM admin.warmup_accounts" 2>/dev/null || echo 0)
OPENS_TODAY=$($DB -c "SELECT COUNT(*) FROM admin.tracking_events WHERE event_type='open' AND created_at >= CURRENT_DATE" 2>/dev/null || echo 0)
CLICKS_TODAY=$($DB -c "SELECT COUNT(*) FROM admin.tracking_events WHERE event_type='click' AND created_at >= CURRENT_DATE" 2>/dev/null || echo 0)
BRAIN_WINNERS=$($DB -c "SELECT COUNT(*) FROM admin.brain_winners" 2>/dev/null || echo 0)
O365_TOTAL=$($DB -c "SELECT COUNT(*) FROM admin.o365_accounts" 2>/dev/null || echo 0)
PROVIDERS_ACTIVE=$($DB -c "SELECT COUNT(*) FROM admin.ia_provider_accounts WHERE status='active'" 2>/dev/null || echo 0)
SENTINEL_SCORE=$($DB -c "SELECT COALESCE(MAX(health_score),0) FROM admin.sentinel_scans" 2>/dev/null || echo 0)
GUARDIAN_STATUS=$(cat /opt/wevads/logs/html-guardian-status.json 2>/dev/null || echo '{}')
VAULT_RESTORES=$($DB -c "SELECT COUNT(*) FROM admin.vault_guard_log" 2>/dev/null || echo 0)
# Calculate health score
HEALTH=0
[ "$WARMUP_WARMING" -gt 100 ] && HEALTH=$((HEALTH+15))
[ "$OPENS_TODAY" -gt 0 ] && HEALTH=$((HEALTH+15))
[ "$CLICKS_TODAY" -gt 0 ] && HEALTH=$((HEALTH+10))
[ "$BRAIN_WINNERS" -gt 3 ] && HEALTH=$((HEALTH+15))
[ "$PROVIDERS_ACTIVE" -gt 2 ] && HEALTH=$((HEALTH+15))
[ "$O365_TOTAL" -gt 100 ] && HEALTH=$((HEALTH+10))
# Check critical services
curl -s "http://127.0.0.1:5890/" > /dev/null 2>&1 && HEALTH=$((HEALTH+10))
curl -s "http://127.0.0.1:5821/" > /dev/null 2>&1 && HEALTH=$((HEALTH+10))
METRICS="warmup=$WARMUP_WARMING active=$WARMUP_ACTIVE sent=$SENT_TODAY opens=$OPENS_TODAY clicks=$CLICKS_TODAY winners=$BRAIN_WINNERS providers=$PROVIDERS_ACTIVE"
log "METRICS: $METRICS health=$HEALTH"
#
# PHASE 1.5: PIPELINE METRICS (NEW)
#
BOUNCE_HARD=$($DB -c "SELECT COUNT(*) FROM admin.bounce_log WHERE bounce_type='hard'" 2>/dev/null || echo 0)
SUPPRESSED=$($DB -c "SELECT COUNT(*) FROM admin.suppression_list" 2>/dev/null || echo 0)
CLICK_LOG=$($DB -c "SELECT COUNT(*) FROM admin.click_log" 2>/dev/null || echo 0)
OPEN_LOG=$($DB -c "SELECT COUNT(*) FROM admin.open_log" 2>/dev/null || echo 0)
CONV_LOG=$($DB -c "SELECT COUNT(*) FROM admin.conversion_log" 2>/dev/null || echo 0)
REVENUE=$($DB -c "SELECT COALESCE(SUM(revenue),0)::numeric FROM admin.revenue" 2>/dev/null || echo 0)
CRM_LEADS=$($DB -c "SELECT COUNT(*) FROM admin.leads" 2>/dev/null || echo 0)
CRM_CONTACTS=$($DB -c "SELECT COUNT(*) FROM admin.crm_contacts" 2>/dev/null || echo 0)
SEND_CONTACTS=$($DB -c "SELECT COUNT(*) FROM admin.send_contacts" 2>/dev/null || echo 0)
DOMAINS=$($DB -c "SELECT COUNT(*) FROM admin.domain_pool" 2>/dev/null || echo 0)
OFFERS=$($DB -c "SELECT COUNT(*) FROM admin.affiliate_offers WHERE is_active=true" 2>/dev/null || echo 0)
HOOKS_LEARN=$($DB -c "SELECT COUNT(*) FROM admin.brain_learning_log" 2>/dev/null || echo 0)
CREATIVE_PERF=$($DB -c "SELECT COUNT(*) FROM admin.creative_performance" 2>/dev/null || echo 0)
N8N_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:5678/ 2>/dev/null || echo 0)
PIPELINE_METRICS="bounces=$BOUNCE_HARD supp=$SUPPRESSED clicks=$CLICK_LOG opens=$OPEN_LOG conv=$CONV_LOG rev=$$REVENUE leads=$CRM_LEADS crm=$CRM_CONTACTS pool=$SEND_CONTACTS domains=$DOMAINS offers=$OFFERS learn=$HOOKS_LEARN n8n=$N8N_STATUS"
log "PIPELINE: $PIPELINE_METRICS"
[ "$CLICK_LOG" -gt 0 ] && HEALTH=$((HEALTH+5))
[ "$CONV_LOG" -gt 0 ] && HEALTH=$((HEALTH+5))
[ "$SEND_CONTACTS" -gt 100000 ] && HEALTH=$((HEALTH+5))
[ "$OFFERS" -gt 50 ] && HEALTH=$((HEALTH+5))
[ "$HEALTH" -gt 100 ] && HEALTH=100
# ═══════════════════════════════════════
# PHASE 2: DETECT ISSUES
# ═══════════════════════════════════════
ISSUES=""
SEVERITY="info"
# Check warmup progression
if [ "$WARMUP_WARMING" -gt 0 ] && [ "$SENT_TODAY" -eq 0 ]; then
ISSUES="${ISSUES}|NO_SENDS:$WARMUP_WARMING warming accounts but 0 sent today"
SEVERITY="warning"
fi
# Check tracking pipeline
if [ "$OPENS_TODAY" -eq 0 ] && [ "$SENT_TODAY" -gt 50 ]; then
ISSUES="${ISSUES}|TRACKING_DOWN:Sent $SENT_TODAY but 0 opens detected"
SEVERITY="critical"
fi
# Check Brain performance
if [ "$BRAIN_WINNERS" -lt 3 ]; then
ISSUES="${ISSUES}|LOW_WINNERS:Only $BRAIN_WINNERS winning configs (need 3+)"
SEVERITY="warning"
fi
# Check providers
if [ "$PROVIDERS_ACTIVE" -lt 2 ]; then
ISSUES="${ISSUES}|LOW_PROVIDERS:Only $PROVIDERS_ACTIVE active AI providers"
SEVERITY="critical"
fi
# Check Guardian
GUARDIAN_ISSUES=$(echo "$GUARDIAN_STATUS" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('issues',0))" 2>/dev/null || echo 0)
if [ "$GUARDIAN_ISSUES" -gt 0 ]; then
ISSUES="${ISSUES}|FILE_ISSUES:Guardian detected $GUARDIAN_ISSUES file issues"
# Pipeline-specific issues
if [ "$BOUNCE_HARD" -gt 100 ] && [ "$SUPPRESSED" -lt "$BOUNCE_HARD" ]; then
ISSUES="${ISSUES}|BOUNCE_LEAK:$BOUNCE_HARD hard bounces but only $SUPPRESSED suppressed"
SEVERITY="critical"
fi
if [ "$N8N_STATUS" != "200" ] 2>/dev/null; then
ISSUES="${ISSUES}|N8N_STATUS:n8n returned $N8N_STATUS"
fi
fi
log "ISSUES: ${ISSUES:-none} SEVERITY: $SEVERITY"
# ═══════════════════════════════════════
# PHASE 3: AI ANALYSIS (call HAMID)
# ═══════════════════════════════════════
AI_ANALYSIS=""
if [ -n "$ISSUES" ] || [ $((RANDOM % 3)) -eq 0 ]; then
# Build context for HAMID
PROMPT="Tu es WEVAL Mind, le cerveau autonome. Analyse rapide du système:
Health: ${HEALTH}% | Warming: $WARMUP_WARMING | Sent: $SENT_TODAY | Opens: $OPENS_TODAY | Clicks: $CLICKS_TODAY
Brain winners: $BRAIN_WINNERS | Providers: $PROVIDERS_ACTIVE | O365: $O365_TOTAL
Issues: ${ISSUES:-aucune}
Donne 1-2 recommandations concrètes en 2 lignes max."
ENCODED_PROMPT=$(python3 -c "import urllib.parse; print(urllib.parse.quote('''$PROMPT'''))" 2>/dev/null)
AI_RESPONSE=$(curl -s --max-time 15 "$HAMID_API?action=chat&message=$ENCODED_PROMPT" 2>/dev/null)
AI_ANALYSIS=$(echo "$AI_RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('response','')[:500])" 2>/dev/null || echo "")
AI_PROVIDER=$(echo "$AI_RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('provider','unknown'))" 2>/dev/null || echo "unknown")
AI_LATENCY=$(echo "$AI_RESPONSE" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('latency_ms',0))" 2>/dev/null || echo 0)
log "AI: provider=$AI_PROVIDER latency=${AI_LATENCY}ms"
log "AI ANALYSIS: $(echo "$AI_ANALYSIS" | head -2)"
# Update provider usage counter
if [ -n "$AI_PROVIDER" ] && [ "$AI_PROVIDER" != "unknown" ]; then
$DB -c "UPDATE admin.ia_provider_accounts SET requests_total = requests_total + 1, requests_today = requests_today + 1, last_used = NOW() WHERE provider_name = '$AI_PROVIDER' AND status = 'active' LIMIT 1" 2>/dev/null
fi
fi
# ═══════════════════════════════════════
# PHASE 4: LOG TO DB
# ═══════════════════════════════════════
CYCLE_NUM=$($DB -c "SELECT COALESCE(MAX(cycle_number),0)+1 FROM admin.weval_mind_cycles" 2>/dev/null || echo 1)
$DB -c "INSERT INTO admin.weval_mind_cycles (cycle_number, health_score, services_checked, services_ok, services_down, details)
VALUES ($CYCLE_NUM, $HEALTH, 8, $(( (HEALTH+9)/10 )), $((8 - (HEALTH+9)/10)),
'$(echo "{\"metrics\":\"$METRICS\",\"issues\":\"${ISSUES:-none}\",\"severity\":\"$SEVERITY\",\"ai_provider\":\"${AI_PROVIDER:-none}\",\"ai_analysis\":\"$(echo "$AI_ANALYSIS" | head -1 | sed "s/'/''/g" | head -c 200)\"}" | sed "s/'/\\\\'/g")'
)" 2>/dev/null
# Log learning if AI provided analysis
if [ -n "$AI_ANALYSIS" ]; then
$DB -c "INSERT INTO admin.weval_mind_learning (action, success) VALUES ('mind_cycle_' || '$CYCLE_NUM', true)" 2>/dev/null
fi
# Log diagnostics if issues found
if [ -n "$ISSUES" ]; then
DIAG_MSG=$(echo "$ISSUES" | tr "|" " " | head -c 300)
$DB -c "INSERT INTO admin.mind_diagnostics (severity, module, message, suggested_action) VALUES ('$SEVERITY', 'mind_auto', '$DIAG_MSG', 'check')" 2>/dev/null
fi
# ═══════════════════════════════════════
# PHASE 5: WRITE STATUS FILE
# ═══════════════════════════════════════
cat > /opt/wevads/logs/mind-status.json << JSONEOF
{"last_cycle":"$TIMESTAMP","cycle_number":$CYCLE_NUM,"health":$HEALTH,"severity":"$SEVERITY","metrics":{"warming":$WARMUP_WARMING,"active":$WARMUP_ACTIVE,"sent":$SENT_TODAY,"opens":$OPENS_TODAY,"clicks":$CLICKS_TODAY,"winners":$BRAIN_WINNERS,"providers":$PROVIDERS_ACTIVE},"ai_provider":"${AI_PROVIDER:-none}","ai_latency":${AI_LATENCY:-0},"issues_count":$(echo "$ISSUES" | tr '|' '\n' | grep -c '.' || echo 0)}
JSONEOF
echo "Mind Cycle #$CYCLE_NUM: health=$HEALTH% issues=$(echo "$ISSUES" | tr '|' '\n' | grep -c '.' || echo 0) ai=${AI_PROVIDER:-skipped}"