Files
weval-l99/l99-autonomous.sh
2026-04-13 12:43:21 +02:00

126 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# L99 AUTONOMOUS v2 — ADAPTIVE (merge, never overwrite)
TS=$(date -Iseconds)
REPORT=/var/www/html/api/l99-autonomous-report.json
STATE=/var/www/html/api/l99-state.json
LOG=/var/log/l99-autonomous.log
PREV=/var/www/html/api/l99-autonomous-prev.json
echo "$TS === L99 AUTONOMOUS v2 ADAPTIVE ===" >> $LOG
# BACKUP previous report for diff
[ -f "$REPORT" ] && cp "$REPORT" "$PREV"
# DISCOVER
HTML=$(find /var/www/html -maxdepth 1 -name '*.html'|wc -l)
API=$(ls /var/www/html/api/*.php 2>/dev/null|wc -l)
SS=$(find /opt/weval-l99 -name '*.png' 2>/dev/null|wc -l)
VID=$(find /opt/weval-l99 -name '*.webm' -o -name '*.mp4' 2>/dev/null|wc -l)
# DETECT NEW vs PREVIOUS
NEW_PAGES=""
if [ -f "$PREV" ]; then
PREV_PAGES=$(python3 -c "import json;[print(p['path']) for p in json.load(open('$PREV')).get('tested',[])]" 2>/dev/null)
fi
# TEST pages
PASS=0;FAIL=0;TOTAL=0;TESTED="["
for page in $(find /var/www/html -maxdepth 1 -name '*.html' -exec basename {} \;|sort|head -100); do
CODE=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 3 "https://127.0.0.1/$page" -H 'Host: weval-consulting.com' 2>/dev/null)
TOTAL=$((TOTAL+1))
STATUS="F"
if [ "$CODE" = "200" ] || [ "$CODE" = "302" ]; then
PASS=$((PASS+1));STATUS="P"
else
FAIL=$((FAIL+1))
fi
[ $TOTAL -gt 1 ] && TESTED="$TESTED,"
TESTED="$TESTED{\"path\":\"/$page\",\"code\":$CODE,\"status\":\"$STATUS\"}"
# Detect new
if [ -f "$PREV" ]; then
echo "$PREV_PAGES" | grep -q "/$page" || NEW_PAGES="$NEW_PAGES /$page"
fi
done
TESTED="$TESTED]"
# APIs
APASS=0;ATOTAL=0
for api in nonreg-api.php?cat=all ecosystem-health.php wevia-deep-test.php wevia-master-autoheal.php architecture-index.json l99-state.json; do
CODE=$(curl -sk -o /dev/null -w '%{http_code}' --max-time 5 "https://127.0.0.1/api/$api" -H 'Host: weval-consulting.com' 2>/dev/null)
ATOTAL=$((ATOTAL+1))
[ "$CODE" = "200" ] && APASS=$((APASS+1))
done
# NR + SIGMA
NR_PASS=$(python3 -c "import json;print(json.load(open('/var/www/html/api/nonreg-latest.json'))['pass'])" 2>/dev/null || echo 0)
NR_TOTAL=$(python3 -c "import json;print(json.load(open('/var/www/html/api/nonreg-latest.json'))['total'])" 2>/dev/null || echo 1)
SCORE=$(python3 -c "print(round($PASS/max(1,$TOTAL)*100,1))" 2>/dev/null)
DPMO=$(python3 -c "print(round((1-$NR_PASS/max(1,$NR_TOTAL))*1000000))" 2>/dev/null || echo 999999)
SIGMA=3;[ "$DPMO" -lt 6210 ] && SIGMA=4;[ "$DPMO" -lt 233 ] && SIGMA=5;[ "$DPMO" -lt 4 ] && SIGMA=6
# WRITE REPORT (full replace — this is the autonomous report, not state)
cat > $REPORT << ENDJSON
{"ts":"$TS","pass":$PASS,"fail":$FAIL,"total":$TOTAL,"score":$SCORE,"sigma":{"dpmo":$DPMO,"level":"$SIGMA","nr":"$NR_PASS/$NR_TOTAL"},"apis":"$APASS/$ATOTAL","html":$HTML,"apis_total":$API,"ss":$SS,"vid":$VID,"new_pages":"$(echo $NEW_PAGES|xargs)","tested":$TESTED}
ENDJSON
# ADAPTIVE STATE UPDATE — MERGE not overwrite
python3 << 'PYEND'
import json,time
fp="/var/www/html/api/l99-state.json"
d=json.load(open(fp))
# Only update autonomous-owned fields, preserve everything else
d["screenshots"]=SCREENSHOTS
d["videos"]=VIDEOS
d["pages_html"]=HTML_COUNT
d["apis_php"]=API_COUNT
d["last_update"]="TIMESTAMP"
d["timestamp"]="TIMESTAMP"
d["tests_pass"]=NR_P
d["tests_total"]=NR_T
d["sigma"]={"dpmo":DPMO_VAL,"level":"SIGMA_VAL","nr":"NR_P/NR_T"}
# MERGE autonomous block, don't overwrite custom fields
auto=d.get("autonomous",{})
auto["last_run"]="TIMESTAMP"
auto["pages"]=PAGES_PASS
auto["total"]=PAGES_TOTAL
auto["score"]=SCORE_VAL
auto["apis"]="APIS_STR"
auto["new_pages"]="NEW_STR"
d["autonomous"]=auto
# PRESERVE: consolidated, sigma history, layers, custom keys from other tools
json.dump(d,open(fp,"w"),indent=2)
PYEND
# Replace placeholders
python3 -c "
fp='/var/www/html/api/l99-state.json'
# Actually just do the merge properly
import json
d=json.load(open(fp))
d['screenshots']=$SS;d['videos']=$VID;d['pages_html']=$HTML;d['apis_php']=$API
d['last_update']='$TS';d['timestamp']='$TS'
d['tests_pass']=$NR_PASS;d['tests_total']=$NR_TOTAL
d['sigma']={'dpmo':$DPMO,'level':'$SIGMA','nr':'$NR_PASS/$NR_TOTAL'}
auto=d.get('autonomous',{})
auto['last_run']='$TS';auto['pages']=$PASS;auto['total']=$TOTAL;auto['score']=$SCORE
auto['apis']='$APASS/$ATOTAL';auto['new_pages']='$(echo $NEW_PAGES|xargs)'
d['autonomous']=auto
json.dump(d,open(fp,'w'),indent=2)
" 2>/dev/null
# SEMANTIC BRAND CHECK
SEM_PASS=0;SEM_TOTAL=3
for Q in "Qui est WEVAL" "WEVAL Consulting" "Est-ce que WEVAL existe"; do
RESP=$(curl -sk --max-time 10 -X POST https://127.0.0.1/api/weval-ia-fast.php -H "Host: weval-consulting.com" -H "Content-Type: application/json" -d "{"message":"$Q"}" 2>/dev/null)
if echo "$RESP" | grep -qi "cabinet\|casablanca\|consulting\|digitale"; then
SEM_PASS=$((SEM_PASS+1))
else
echo "$TS SEMANTIC FAIL: $Q -> $(echo $RESP|head -c 60)" >> $LOG
fi
done
echo "$TS SEMANTIC: ${SEM_PASS}/$SEM_TOTAL" >> $LOG
echo "$TS DONE: ${SCORE}% Sigma${SIGMA} ${PASS}P/${TOTAL} APIs:${APASS}/$ATOTAL New:$(echo $NEW_PAGES|wc -w)" >> $LOG
echo '{"pass":'$PASS',"total":'$TOTAL',"score":'$SCORE',"sigma":"'$SIGMA'","dpmo":'$DPMO',"apis":"'$APASS'/'$ATOTAL'","ss":'$SS',"vid":'$VID',"new":"'$(echo $NEW_PAGES|xargs)'"}'