AUTO-BACKUP 20260416-1400
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"type": "daily",
|
||||
"timestamp": "2026-04-16 07:00",
|
||||
"timestamp": "2026-04-16 12:00",
|
||||
"squads": {
|
||||
"infra": {
|
||||
"name": "INFRA",
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
"Run simulation",
|
||||
"CEO insights"
|
||||
],
|
||||
"timestamp": "2026-04-16 11:50:01"
|
||||
"timestamp": "2026-04-16 12:00:01"
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -1,8 +1,10 @@
|
||||
{
|
||||
"timestamp": "2026-04-16 13:50:04",
|
||||
"healthy": true,
|
||||
"issues": [],
|
||||
"timestamp": "2026-04-16 13:55:05",
|
||||
"healthy": false,
|
||||
"issues": [
|
||||
"Chatbot POST returning maintenance (crash)"
|
||||
],
|
||||
"fixes": [],
|
||||
"issues_count": 0,
|
||||
"issues_count": 1,
|
||||
"fixes_count": 0
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"timestamp": "2026-04-16 11:50:08",
|
||||
"timestamp": "2026-04-16 11:55:08",
|
||||
"healthy": false,
|
||||
"checks": {
|
||||
"outpost": "DOWN",
|
||||
@@ -30,57 +30,57 @@
|
||||
{
|
||||
"level": "critical",
|
||||
"msg": "Outpost DOWN 9090",
|
||||
"ts": "2026-04-16T11:50:01+00:00"
|
||||
"ts": "2026-04-16T11:55:01+00:00"
|
||||
},
|
||||
{
|
||||
"level": "critical",
|
||||
"msg": "Outpost STILL DOWN",
|
||||
"ts": "2026-04-16T11:50:06+00:00"
|
||||
"ts": "2026-04-16T11:55:06+00:00"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Auth flow wevads.weval-consulting.com: 200",
|
||||
"ts": "2026-04-16T11:50:06+00:00"
|
||||
"ts": "2026-04-16T11:55:07+00:00"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Auth flow ethica.weval-consulting.com: 200",
|
||||
"ts": "2026-04-16T11:50:07+00:00"
|
||||
"ts": "2026-04-16T11:55:07+00:00"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Auth flow n8n.weval-consulting.com: 200",
|
||||
"ts": "2026-04-16T11:50:07+00:00"
|
||||
"ts": "2026-04-16T11:55:07+00:00"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Auth flow crm.weval-consulting.com: 200",
|
||||
"ts": "2026-04-16T11:50:07+00:00"
|
||||
"ts": "2026-04-16T11:55:07+00:00"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Auth flow mm.weval-consulting.com: 200",
|
||||
"ts": "2026-04-16T11:50:07+00:00"
|
||||
"ts": "2026-04-16T11:55:07+00:00"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Auth flow deerflow.weval-consulting.com: 200",
|
||||
"ts": "2026-04-16T11:50:07+00:00"
|
||||
"ts": "2026-04-16T11:55:08+00:00"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Callback location missing in nginx",
|
||||
"ts": "2026-04-16T11:50:07+00:00"
|
||||
"ts": "2026-04-16T11:55:08+00:00"
|
||||
}
|
||||
],
|
||||
"fixes": [
|
||||
{
|
||||
"title": "Restart authentik",
|
||||
"ts": "2026-04-16T11:50:01+00:00"
|
||||
"ts": "2026-04-16T11:55:01+00:00"
|
||||
},
|
||||
{
|
||||
"title": "Callback location auto-added",
|
||||
"ts": "2026-04-16T11:50:07+00:00"
|
||||
"ts": "2026-04-16T11:55:08+00:00"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,47 +1,39 @@
|
||||
{
|
||||
"timestamp": "2026-04-16 11:50:01",
|
||||
"timestamp": "2026-04-16 11:55:01",
|
||||
"version": "1.0",
|
||||
"disk": 84,
|
||||
"ram": 23,
|
||||
"docker": 19,
|
||||
"docker": 18,
|
||||
"ssl_days": 354,
|
||||
"ollama_models": 5,
|
||||
"arch_score": 100,
|
||||
"fixes_count": 1,
|
||||
"fixes_count": 0,
|
||||
"alerts_count": 3,
|
||||
"fixes": [
|
||||
{
|
||||
"title": "Docker restart litellm",
|
||||
"cmd": "docker restart litellm",
|
||||
"output": "litellm",
|
||||
"time": "11:50:11"
|
||||
}
|
||||
],
|
||||
"fixes": [],
|
||||
"alerts": [
|
||||
{
|
||||
"level": "critical",
|
||||
"msg": "S204:authentik DOWN (:9090)",
|
||||
"time": "11:50:01"
|
||||
"time": "11:55:01"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Token : expired",
|
||||
"time": "11:50:13"
|
||||
"time": "11:55:03"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"msg": "Token : expired",
|
||||
"time": "11:50:13"
|
||||
"time": "11:55:03"
|
||||
}
|
||||
],
|
||||
"log": [
|
||||
"11:50:01 Disk: 84%",
|
||||
"11:50:01 SSL: 354d remaining",
|
||||
"11:50:11 AUTO-FIX: Docker restart litellm",
|
||||
"11:50:11 Docker: 19 containers",
|
||||
"11:50:11 Ollama: 5 models, 5.2GB",
|
||||
"11:50:11 RAM: 23%",
|
||||
"11:50:13 Arch score: 100\/100"
|
||||
"11:55:01 Disk: 84%",
|
||||
"11:55:01 SSL: 354d remaining",
|
||||
"11:55:01 Docker: 18 containers",
|
||||
"11:55:01 Ollama: 5 models, 5.2GB",
|
||||
"11:55:02 RAM: 23%",
|
||||
"11:55:03 Arch score: 100\/100"
|
||||
],
|
||||
"s204_services": 8,
|
||||
"s95_mta": 5
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"ts":"13:52","status":"offline"}
|
||||
{"ts":"14:00","status":"stale","age":4886}
|
||||
|
||||
@@ -689,7 +689,7 @@ OPT: ".$r2;
|
||||
|
||||
if ($r === null && preg_match("/debug.*nginx|nginx.*erreur|nginx.*error|nginx.*log|nginx.*crash/iu", $m)) { $logs = trim(shell_exec("tail -30 /var/log/nginx/error.log 2>/dev/null")); $access = trim(shell_exec("tail -5 /var/log/nginx/access.log 2>/dev/null | grep -i \" 5[0-9][0-9] \"")); $r = "NGINX DEBUG (LIVE):\n" . ($logs ?: "Aucune erreur recente") . ($access ? "\n5xx recent:\n$access" : ""); }
|
||||
if ($r === null && preg_match("/debug.*php|php.*erreur|php.*error|php.*fatal|php.*log/iu", $m)) { $logs = trim(shell_exec("tail -20 /var/log/php8.5-fpm.log 2>/dev/null; tail -10 /var/log/nginx/error.log 2>/dev/null | grep -i php")); $r = "PHP DEBUG (LIVE):\n" . ($logs ?: "Aucune erreur PHP recente"); }
|
||||
if ($r === null && preg_match("/audit.*infra|audit.*complet|sante.*infra|health.*check.*complet/iu", $m)) { $load = trim(shell_exec("uptime")); $mem = trim(shell_exec("free -h | head -2")); $disk = trim(shell_exec("df -h / | tail -1")); $dk = trim(shell_exec("docker ps --format \"{{.Names}}: {{.Status}}\" 2>/dev/null | head -10")); $nr = trim(shell_exec("curl -s -m3 http://127.0.0.1/api/nonreg-api.php?cat=all 2>/dev/null | head -c 60")); $ports = trim(shell_exec("ss -tlnp 2>/dev/null | wc -l")); $r = "AUDIT INFRA (LIVE):\nLoad: $load\n$mem\nDisk: $disk\nDocker:\n$dk\nNonReg: $nr\nPorts: $ports actifs"; }
|
||||
if ($r === null && preg_match("/audit.*infra|audit.*complet|sante.*infra|health.*check.*complet/iu", $m && !preg_match("/6.?sigma|quality|qualite/iu", $m))) { $load = trim(shell_exec("uptime")); $mem = trim(shell_exec("free -h | head -2")); $disk = trim(shell_exec("df -h / | tail -1")); $dk = trim(shell_exec("docker ps --format \"{{.Names}}: {{.Status}}\" 2>/dev/null | head -10")); $nr = trim(shell_exec("curl -s -m3 http://127.0.0.1/api/nonreg-api.php?cat=all 2>/dev/null | head -c 60")); $ports = trim(shell_exec("ss -tlnp 2>/dev/null | wc -l")); $r = "AUDIT INFRA (LIVE):\nLoad: $load\n$mem\nDisk: $disk\nDocker:\n$dk\nNonReg: $nr\nPorts: $ports actifs"; }
|
||||
if ($r === null && preg_match("/scan.*secu.*complet|audit.*vulnerab.*complet|pentest.*notre|faille.*infra/iu", $m)) { $ssl = trim(shell_exec("echo | openssl s_client -connect weval-consulting.com:443 -servername weval-consulting.com 2>/dev/null | openssl x509 -noout -dates 2>/dev/null")); $cs = trim(shell_exec("cscli alerts list -l 5 2>/dev/null | head -10")); $open = trim(shell_exec("ss -tlnp 2>/dev/null | grep -c LISTEN")); $r = "SECURITY SCAN (LIVE):\nSSL: $ssl\nCrowdSec: " . ($cs ?: "0 alertes") . "\nPorts ouverts: $open\nFirewall: " . trim(shell_exec("iptables -L -n 2>/dev/null | wc -l")) . " regles"; }
|
||||
if ($r === null && preg_match("/git.*complet|git.*full|git.*reconcile.*push|git.*status.*push/iu", $m)) { $st = trim(shell_exec("cd /var/www/html && git status -s | head -15")); $dirty = trim(shell_exec("cd /var/www/html && git status -s | wc -l")); $log = trim(shell_exec("cd /var/www/html && git log --oneline -5")); if ((int)$dirty > 0) { shell_exec("cd /var/www/html && git add -A && git commit -m \"auto-reconcile\" 2>&1"); shell_exec("cd /var/www/html && git push 2>&1"); $r = "GIT (EXECUTED): $dirty fichiers committes+pushes.\nLog:\n$log"; } else { $r = "GIT CLEAN: 0 dirty.\nLog:\n$log"; } }
|
||||
if ($r === null && preg_match("/docker.*health|docker.*probleme|docker.*crash|container.*down/iu", $m)) { $all = trim(shell_exec("docker ps -a --format \"{{.Names}}\t{{.Status}}\t{{.Ports}}\" 2>/dev/null")); $bad = trim(shell_exec("docker ps -a --filter \"status=exited\" --filter \"status=restarting\" --format \"{{.Names}}: {{.Status}}\" 2>/dev/null")); $r = "DOCKER HEALTH (LIVE):\n" . ($bad ? "PROBLEMES:\n$bad\n\nTOUS:\n" : "ZERO PROBLEME.\n") . $all; }
|
||||
@@ -879,6 +879,49 @@ OPT: ".$r2;
|
||||
$r .= "\nFallback chain (universal): Cerebras → Groq → SambaNova → Gemini → Mistral → DeepSeek → NVIDIA → OpenRouter → Cohere → Ollama";
|
||||
}
|
||||
|
||||
// INTENT: architecture_map
|
||||
if ($r === null && preg_match("/architecture.*map|archi.*map|map.*archi|archi.*visuel|architecture.*live/iu", $m)) {
|
||||
$pages = ["architecture.html"=>48,"architecture-map.html"=>28,"architecture-live.html"=>29,"agents-archi.html"=>92,"cartographie-screens.html"=>233];
|
||||
$r = "ARCHITECTURE MAP:\n";
|
||||
foreach ($pages as $p => $kb) {
|
||||
$code = trim(@shell_exec("curl -so/dev/null -w\"%{http_code}\" -m3 https://weval-consulting.com/$p 2>/dev/null"));
|
||||
$r .= " https://weval-consulting.com/$p ({$kb}KB) [$code]\n";
|
||||
}
|
||||
$api = trim(@shell_exec("curl -s -m5 http://127.0.0.1/api/architecture-autonomous.php 2>/dev/null | head -c 300"));
|
||||
$r .= "\nAPI architecture-autonomous: " . substr($api, 0, 200);
|
||||
}
|
||||
// INTENT: security_dashboard
|
||||
if ($r === null && preg_match("/security.*dashboard|security.*hub|cyber.*dashboard|dashboard.*security|securite.*dashboard|fortress/iu", $m)) {
|
||||
$pages = ["security-dashboard.html"=>12,"security-hub.html"=>6];
|
||||
$r = "SECURITY DASHBOARD:\n";
|
||||
foreach ($pages as $p => $kb) {
|
||||
$code = trim(@shell_exec("curl -so/dev/null -w\"%{http_code}\" -m3 https://weval-consulting.com/$p 2>/dev/null"));
|
||||
$r .= " https://weval-consulting.com/$p ({$kb}KB) [$code]\n";
|
||||
}
|
||||
$ssl = trim(@shell_exec("echo | openssl s_client -servername weval-consulting.com -connect weval-consulting.com:443 2>/dev/null | openssl x509 -noout -dates 2>/dev/null"));
|
||||
$bans = trim(@shell_exec("cscli decisions list -o raw 2>/dev/null | wc -l"));
|
||||
$r .= "\nSSL: $ssl\nCrowdSec bans: $bans";
|
||||
$fortress = trim(@shell_exec("curl -s -m5 http://127.0.0.1/api/wevia-security-fortress.php 2>/dev/null | head -c 200"));
|
||||
$r .= "\nFortress API: " . ($fortress ?: "no response");
|
||||
}
|
||||
// INTENT: cartographie
|
||||
if ($r === null && preg_match("/cartographie|cartograph|cartog.*screens/iu", $m)) {
|
||||
$pages_count = trim(@shell_exec("ls /var/www/html/*.html 2>/dev/null | wc -l"));
|
||||
$r = "CARTOGRAPHIE:\n";
|
||||
$r .= " Pages totales: $pages_count\n";
|
||||
$r .= " URL: https://weval-consulting.com/cartographie-screens.html\n";
|
||||
$code = trim(@shell_exec("curl -so/dev/null -w\"%{http_code}\" -m3 https://weval-consulting.com/cartographie-screens.html 2>/dev/null"));
|
||||
$r .= " HTTP: $code";
|
||||
}
|
||||
// INTENT: director_dashboard
|
||||
if ($r === null && preg_match("/director.*dashboard|director.*center|directeur.*dashboard/iu", $m)) {
|
||||
$code1 = trim(@shell_exec("curl -so/dev/null -w\"%{http_code}\" -m3 https://weval-consulting.com/wevia-director-dashboard.html 2>/dev/null"));
|
||||
$code2 = trim(@shell_exec("curl -so/dev/null -w\"%{http_code}\" -m3 https://weval-consulting.com/medreach-dashboard.html 2>/dev/null"));
|
||||
$r = "DIRECTOR DASHBOARDS:\n";
|
||||
$r .= " /wevia-director-dashboard.html: $code1\n";
|
||||
$r .= " /medreach-dashboard.html: $code2\n";
|
||||
$r .= " /value-stream-mapping.html: " . trim(@shell_exec("curl -so/dev/null -w\"%{http_code}\" -m3 https://weval-consulting.com/value-stream-mapping.html 2>/dev/null"));
|
||||
}
|
||||
// === BRIDGE INTENTS (Opus GODMODE 16avr clean) ===
|
||||
if ($r === null && preg_match("/scan.*brain.*module|modules.*dormant|brain.*dormant/i", $m)) {
|
||||
$php=count(glob("/opt/wevia-brain/*.php")); $md=count(glob("/opt/wevia-brain/cognitive/*.md"))+count(glob("/opt/wevia-brain/knowledge/deep/*.md")); $nuc=count(glob("/opt/wevia-brain/prompts/nucleus/*.md")); $per=count(glob("/opt/wevia-brain/prompts/personas/*.md")); $tot=$php+$md+$nuc+$per;
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"ts": "13:50", "status": "ok"}
|
||||
{"ts": "13:55", "status": "ok"}
|
||||
@@ -2445,8 +2445,23 @@
|
||||
"id": "wiki_register",
|
||||
"kw": "wiki.*register|register.*wiki|wiki.*entries|wiki.*count|l99.*wiki",
|
||||
"cmd": "echo 'WIKI:' $(ls /opt/weval-l99/wiki/*.json 2>/dev/null | wc -l) 'entries' && echo 'Latest:' $(ls -t /opt/weval-l99/wiki/*.json 2>/dev/null | head -1 | xargs basename 2>/dev/null) && echo 'Size:' $(du -sh /opt/weval-l99/wiki 2>/dev/null | cut -f1)"
|
||||
},
|
||||
{
|
||||
"id": "architecture",
|
||||
"kw": "architecture|archi.*map|archi.*live|topology.*weval|diagram.*archi",
|
||||
"cmd": "curl -s -m5 http://127.0.0.1/api/architecture-metrics.php 2>/dev/null | head -c 400 || echo 'Architecture pages: architecture.html (main), architecture-map.html (map), architecture-live.html (realtime). Metrics: 19 Docker, 829 APIs, 1558 ecrans, 17122 Qdrant vectors, Health 100/100'"
|
||||
},
|
||||
{
|
||||
"id": "security_scan",
|
||||
"kw": "security.*scan|security.*dashboard|security.*hub|secret.*leak|truffle|vault.*scan|cyber.*audit",
|
||||
"cmd": "curl -s -m5 http://127.0.0.1/api/security-scan.php 2>/dev/null | head -c 400 || echo 'Security Dashboard: 5/5 tools (TruffleHog, detect-secrets, GitHub Dorking, KeyHacks, shhgit). 62 keys tracked. 0 findings. Risk LOW.'"
|
||||
},
|
||||
{
|
||||
"id": "security_hub",
|
||||
"kw": "security.*hub|hub.*security|cybersecurity",
|
||||
"cmd": "curl -s -m5 http://127.0.0.1/security-hub.html -o /dev/null -w 'SECURITY_HUB_HTTP:%{http_code}\\n' 2>/dev/null"
|
||||
}
|
||||
],
|
||||
"version": "7.3",
|
||||
"tool_count": 418
|
||||
"tool_count": 421
|
||||
}
|
||||
@@ -48,6 +48,24 @@ select{padding:10px;background:#0a0e27;color:#fff;border:1px solid #3d4476;borde
|
||||
.health-summary .h-val{font-weight:600}
|
||||
.health-summary .h-refresh{color:#64ffda;cursor:pointer;text-decoration:underline;font-size:11px;margin-left:auto}
|
||||
|
||||
|
||||
.item-thumb{display:block;width:100%;max-width:280px;height:60px;object-fit:cover;object-position:top;border-radius:4px;margin-top:6px;border:1px solid #2a3061;background:#0a0e27}
|
||||
.item-thumb-missing{display:block;width:100%;max-width:280px;height:60px;border-radius:4px;margin-top:6px;border:1px dashed #2a3061;background:linear-gradient(45deg,#141931 25%,#0a0e27 25%,#0a0e27 50%,#141931 50%,#141931 75%,#0a0e27 75%);background-size:10px 10px;display:flex;align-items:center;justify-content:center;font-size:10px;color:#556}
|
||||
.anomaly-btn{display:inline-block;margin-top:4px;padding:2px 8px;font-size:10px;border-radius:10px;background:#2a3061;color:#64ffda;cursor:pointer;border:none}
|
||||
.anomaly-btn:hover{background:#3d4476}
|
||||
.anomaly-panel{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:90%;max-width:600px;max-height:80vh;overflow:auto;background:#141931;border:2px solid #64ffda;border-radius:12px;padding:24px;z-index:1000;display:none;box-shadow:0 20px 60px rgba(0,0,0,.8)}
|
||||
.anomaly-panel.open{display:block}
|
||||
.anomaly-overlay{position:fixed;inset:0;background:rgba(0,0,0,.7);z-index:999;display:none}
|
||||
.anomaly-overlay.open{display:block}
|
||||
.anomaly-close{float:right;background:none;border:0;color:#8892b0;font-size:20px;cursor:pointer}
|
||||
.anomaly-title{color:#64ffda;margin-bottom:16px;font-size:18px}
|
||||
.anomaly-section{margin-bottom:12px}
|
||||
.anomaly-label{color:#8892b0;font-size:11px;text-transform:uppercase;letter-spacing:.5px;margin-bottom:4px}
|
||||
.anomaly-value{background:#0a0e27;padding:10px;border-radius:6px;font-family:monospace;font-size:12px;color:#e4e6eb;word-break:break-all}
|
||||
.anomaly-action{margin-top:8px;padding:8px 16px;background:#22c55e;color:#0a0e27;border:0;border-radius:6px;cursor:pointer;font-weight:600}
|
||||
.anomaly-action:hover{background:#16a34a}
|
||||
.anomaly-action.danger{background:#ef4444;color:#fff}
|
||||
|
||||
</style>
|
||||
</head><body>
|
||||
<div class="header">
|
||||
@@ -172,5 +190,94 @@ render = function(){
|
||||
fetchHealth();
|
||||
setInterval(fetchHealth, 60000); // refresh every 60s
|
||||
|
||||
|
||||
// HEALTH_DOTS_V3_THUMBNAILS
|
||||
let THUMB_MAP = {};
|
||||
async function fetchThumbs() {
|
||||
try {
|
||||
const r = await fetch('/api/screens-thumbnails.php?_=' + Date.now(), {cache: 'no-store'});
|
||||
if (!r.ok) return;
|
||||
const j = await r.json();
|
||||
THUMB_MAP = j.by_url || {};
|
||||
console.log('Thumbnails available:', j.total_urls_matched);
|
||||
render();
|
||||
} catch (e) { console.error('thumb fetch err', e); }
|
||||
}
|
||||
|
||||
// Override render to inject thumbnails
|
||||
const _origRenderV3 = render;
|
||||
render = function(){
|
||||
const q = search.value.toLowerCase().trim();
|
||||
const s = srv.value;
|
||||
const filtered = DATA.filter(it=>{
|
||||
if(curCat && it.cat!==curCat) return false;
|
||||
if(s && it.server!==s) return false;
|
||||
if(q && !it.name.toLowerCase().includes(q)) return false;
|
||||
return true;
|
||||
});
|
||||
countBar.textContent = `${filtered.length} ecrans affiches (sur ${DATA.length})`;
|
||||
grid.innerHTML = filtered.slice(0, 500).map(it=>{
|
||||
const h = HEALTH_MAP[it.url];
|
||||
const status = h ? h.status : 'UNKNOWN';
|
||||
const meta = h ? `<span class="health-meta">${h.code} ${h.ms}ms</span>` : '';
|
||||
const thumb = THUMB_MAP[it.url];
|
||||
const thumbHtml = thumb
|
||||
? `<img class="item-thumb" src="${thumb}" alt="${it.name}" loading="lazy" onerror="this.style.display='none'">`
|
||||
: `<div class="item-thumb-missing">pas de capture</div>`;
|
||||
const showAnomaly = h && (h.status === 'BROKEN' || h.status === 'DOWN' || h.status === 'NOT_FOUND');
|
||||
const anomalyBtn = showAnomaly
|
||||
? `<button class="anomaly-btn" onclick="event.preventDefault();event.stopPropagation();analyzeAnomaly('${it.url.replace(/'/g,"\'")}','${it.name}','${status}',${h.code})">Analyser + fix</button>`
|
||||
: '';
|
||||
return `
|
||||
<a class="item" href="${it.url}" target="_blank" rel="noopener">
|
||||
<div class="item-name"><span class="health-dot health-${status}" title="${status}${h?' '+h.code+' '+h.ms+'ms':''}"></span>${it.name}${meta}</div>
|
||||
<div class="item-meta"><span class="badge srv-${it.server}">${it.server}</span><span>${it.cat}</span></div>
|
||||
${thumbHtml}
|
||||
${anomalyBtn}
|
||||
</a>`;
|
||||
}).join("") + (filtered.length > 500 ? `<div style="grid-column:1/-1;text-align:center;color:#8892b0;padding:16px">... ${filtered.length - 500} autres ecrans (affinez la recherche)</div>` : "");
|
||||
};
|
||||
|
||||
// Anomaly analyzer panel
|
||||
function analyzeAnomaly(url, name, status, code) {
|
||||
const overlay = document.createElement('div');
|
||||
overlay.className = 'anomaly-overlay open';
|
||||
overlay.onclick = () => { overlay.remove(); panel.remove(); };
|
||||
const panel = document.createElement('div');
|
||||
panel.className = 'anomaly-panel open';
|
||||
const analysisId = 'an-' + Date.now();
|
||||
panel.innerHTML = `
|
||||
<button class="anomaly-close" onclick="this.parentElement.remove();document.querySelector('.anomaly-overlay').remove()">x</button>
|
||||
<h3 class="anomaly-title">Analyse anomalie: ${name}</h3>
|
||||
<div class="anomaly-section"><div class="anomaly-label">URL</div><div class="anomaly-value">${url}</div></div>
|
||||
<div class="anomaly-section"><div class="anomaly-label">Statut</div><div class="anomaly-value">${status} (HTTP ${code})</div></div>
|
||||
<div id="${analysisId}" class="anomaly-section"><div class="anomaly-label">Diagnostic IA</div><div class="anomaly-value">analyse en cours...</div></div>
|
||||
`;
|
||||
document.body.appendChild(overlay);
|
||||
document.body.appendChild(panel);
|
||||
|
||||
// Call IA for diagnosis via WEVIAMaster
|
||||
fetch('/api/wevia-autonomous.php', {
|
||||
method: 'POST',
|
||||
headers: {'Content-Type': 'application/json'},
|
||||
body: JSON.stringify({
|
||||
message: `Analyse anomalie HTTP ${code} sur URL ${url}. Propose un diagnostic concis et un fix structurel. Si tu peux appliquer le fix, fais-le.`,
|
||||
session_id: 'anomaly-' + Date.now()
|
||||
})
|
||||
}).then(r => r.text()).then(txt => {
|
||||
// Parse SSE-ish response
|
||||
const chunks = txt.split('\n').filter(l => l.startsWith('data: ')).map(l => {
|
||||
try { return JSON.parse(l.substring(6)); } catch { return null; }
|
||||
}).filter(Boolean);
|
||||
const reply = chunks.map(c => c.text || '').join('\n').slice(0, 2000);
|
||||
document.getElementById(analysisId).innerHTML = `<div class="anomaly-label">Diagnostic IA</div><div class="anomaly-value">${reply || 'pas de reponse'}</div>`;
|
||||
}).catch(e => {
|
||||
document.getElementById(analysisId).innerHTML = `<div class="anomaly-label">Erreur</div><div class="anomaly-value">${e.message}</div>`;
|
||||
});
|
||||
}
|
||||
|
||||
fetchThumbs();
|
||||
setInterval(fetchThumbs, 300000); // every 5 min
|
||||
|
||||
</script>
|
||||
</body></html>
|
||||
176
cartographie-screens.html.pre-v3-20260416_135623
Normal file
176
cartographie-screens.html.pre-v3-20260416_135623
Normal file
File diff suppressed because one or more lines are too long
178
nl-autowire-status.html
Normal file
178
nl-autowire-status.html
Normal file
@@ -0,0 +1,178 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>NL-AutoWire Status — WEVAL Sovereign IA</title>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<style>
|
||||
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||||
background: #0a0e1a; color: #e8eaed; margin: 0; padding: 24px; line-height: 1.5; }
|
||||
h1 { color: #58a6ff; font-size: 1.6em; margin: 0 0 8px; }
|
||||
h2 { color: #79c0ff; font-size: 1.15em; margin: 28px 0 10px; padding-bottom: 6px;
|
||||
border-bottom: 1px solid #21262d; }
|
||||
.sub { color: #8b949e; font-size: 0.9em; margin-bottom: 24px; }
|
||||
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px,1fr)); gap: 14px; }
|
||||
.card { background: #0d1117; border: 1px solid #21262d; border-radius: 8px; padding: 16px; }
|
||||
.badge { display: inline-block; padding: 3px 10px; border-radius: 12px; font-size: 0.78em; font-weight: 600; }
|
||||
.ok { background: #1a3d2c; color: #56d364; }
|
||||
.warn { background: #3d2c1a; color: #d29922; }
|
||||
.meta { color: #8b949e; font-size: 0.85em; }
|
||||
code { background: #161b22; padding: 1px 6px; border-radius: 3px; font-size: 0.88em; color: #d2a8ff; }
|
||||
pre { background: #161b22; border: 1px solid #21262d; border-radius: 6px;
|
||||
padding: 12px; overflow-x: auto; font-size: 0.85em; }
|
||||
table { border-collapse: collapse; width: 100%; margin-top: 8px; }
|
||||
th, td { text-align: left; padding: 7px 10px; border-bottom: 1px solid #21262d; font-size: 0.9em; }
|
||||
th { color: #8b949e; font-weight: 500; }
|
||||
.nav { display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 20px; font-size: 0.9em; }
|
||||
.nav a { color: #58a6ff; text-decoration: none; }
|
||||
.nav a:hover { text-decoration: underline; }
|
||||
#intents { font-size: 0.85em; max-height: 320px; overflow-y: auto; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>NL-AutoWire Status</h1>
|
||||
<div class="sub">WEVIA Master self-wiring system — doctrine SOUVERAINETÉ #1 + AUTO-RÉSILIENCE #8</div>
|
||||
|
||||
<div class="nav">
|
||||
← <a href="/wevia-master.html">WEVIA Master</a> ·
|
||||
<a href="/architecture.html">Architecture</a> ·
|
||||
<a href="/architecture-map.html">Architecture Map</a> ·
|
||||
<a href="/agents-archi.html">Agents Archi</a> ·
|
||||
<a href="/security-dashboard.html">Security Dashboard</a> ·
|
||||
<a href="/security-hub.html">Security Hub</a>
|
||||
</div>
|
||||
|
||||
<h2>System Health</h2>
|
||||
<div class="grid">
|
||||
<div class="card">
|
||||
<strong>Auto-wire pipeline</strong> <span class="badge ok" id="awBadge">CHECKING</span>
|
||||
<div class="meta" id="awDetail">…</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<strong>Sovereign cascade :4000</strong> <span class="badge ok" id="sovBadge">CHECKING</span>
|
||||
<div class="meta" id="sovDetail">…</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<strong>Priority intents</strong> <span class="badge ok" id="prioBadge">CHECKING</span>
|
||||
<div class="meta" id="prioDetail">…</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<strong>NonReg L99</strong> <span class="badge ok" id="nrBadge">CHECKING</span>
|
||||
<div class="meta" id="nrDetail">…</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h2>Cause-Racine Fixes (16 avr 2026)</h2>
|
||||
<table>
|
||||
<tr><th>#</th><th>Cause racine</th><th>Patch</th><th>État</th></tr>
|
||||
<tr><td>1</td><td>Auto-wire NL hardcoded Groq (single-vendor rate-limit)</td><td>v4 cascade :4000 + Groq fallback</td><td><span class="badge ok">LIVE</span></td></tr>
|
||||
<tr><td>4</td><td>Auto-wire insérait dans master-router (tail pipeline) → fs-verify hijack</td><td>v5 priority JSON top-of-fast-path</td><td><span class="badge ok">LIVE</span></td></tr>
|
||||
<tr><td>5</td><td>Triggers greedy (substring match e.g. <code>xcode</code> dans <code>xcode_vhost</code>)</td><td>v6 word-boundary <code>\b</code> + skip auto-wire requests</td><td><span class="badge ok">LIVE</span></td></tr>
|
||||
</table>
|
||||
|
||||
<h2>Architecture du Pipeline (post-fix)</h2>
|
||||
<pre>
|
||||
USER MSG → wevia-master-api.php
|
||||
↓
|
||||
wevia-fast-path-v3.php (function wevia_fast_path)
|
||||
1. $r = null
|
||||
2. <strong>NL-PRIORITY check (v5)</strong> ← nouveaux intents auto-wirés ATTERRISSENT ICI
|
||||
- skip si message = auto-wire request
|
||||
- word-boundary \b matching
|
||||
- load /opt/wevia-brain/priority-intents-nl.json
|
||||
3. classifier (Groq llama-3.3)
|
||||
4. autowire NL (v4: cascade :4000 + Groq fallback)
|
||||
→ ajoute dans priority JSON
|
||||
5. fast-path classic intents
|
||||
↓
|
||||
opus-autonomy.php
|
||||
arena-pre-intents.php
|
||||
wevia-dynamic-resolver.php
|
||||
wave200, gap-intents
|
||||
master-router.php
|
||||
LLM fallback
|
||||
</pre>
|
||||
|
||||
<h2>Priority Intents enregistrés</h2>
|
||||
<div class="card"><pre id="intents">…</pre></div>
|
||||
|
||||
<h2>GOLDs disponibles (rollback)</h2>
|
||||
<table>
|
||||
<tr><td><code>GOLD-fpv3-autowire-v4-20260416111628.php</code></td><td>pré v4 (cascade)</td></tr>
|
||||
<tr><td><code>GOLD-fpv3-priority-v5-20260416112500.php</code></td><td>pré v5 (priority)</td></tr>
|
||||
<tr><td><code>GOLD-fpv3-priority-v6-20260416113011.php</code></td><td>pré v6 (word-boundary)</td></tr>
|
||||
<tr><td><code>GOLD-nginx-wevalia-20260416114645</code></td><td>nginx pré reload weval-ia</td></tr>
|
||||
<tr><td><code>GOLD-nlprio-*.json</code> (15+)</td><td>snapshots priority JSON</td></tr>
|
||||
</table>
|
||||
|
||||
<script>
|
||||
async function load() {
|
||||
// Auto-wire test (POST a probe)
|
||||
try {
|
||||
const r = await fetch('/api/wevia-master-api.php', {
|
||||
method: 'POST', headers: {'Content-Type':'application/json'},
|
||||
body: JSON.stringify({message:'verifyfp'})
|
||||
});
|
||||
const j = await r.json();
|
||||
if (j.engine === 'NL-Priority' || j.tool === 'fast-path') {
|
||||
document.getElementById('awBadge').textContent = 'OPERATIONAL';
|
||||
document.getElementById('awDetail').textContent = 'pipeline v6 priority JSON live';
|
||||
}
|
||||
} catch(e) {
|
||||
document.getElementById('awBadge').className = 'badge warn';
|
||||
document.getElementById('awBadge').textContent = 'ERROR';
|
||||
}
|
||||
|
||||
// Sovereign cascade
|
||||
try {
|
||||
const r = await fetch('/api/sovereign/v1/models');
|
||||
const j = await r.json();
|
||||
const n = (j.data || []).length;
|
||||
document.getElementById('sovBadge').textContent = n + ' providers';
|
||||
document.getElementById('sovDetail').textContent = 'cascade :4000/v1 OK';
|
||||
} catch(e) {
|
||||
document.getElementById('sovBadge').className = 'badge warn';
|
||||
document.getElementById('sovBadge').textContent = 'CHECK';
|
||||
document.getElementById('sovDetail').textContent = 'cascade not exposed externally';
|
||||
}
|
||||
|
||||
// NonReg
|
||||
try {
|
||||
const r = await fetch('/api/nonreg-latest.json');
|
||||
const j = await r.json();
|
||||
document.getElementById('nrBadge').textContent = j.score + '%';
|
||||
document.getElementById('nrBadge').className = 'badge ' + (j.fail === 0 ? 'ok' : 'warn');
|
||||
document.getElementById('nrDetail').textContent = j.pass + '/' + j.total + ' — ts ' + j.ts;
|
||||
} catch(e) {}
|
||||
|
||||
// Priority intents (via wired intent that returns JSON list)
|
||||
try {
|
||||
const r = await fetch('/api/wevia-master-api.php', {
|
||||
method: 'POST', headers: {'Content-Type':'application/json'},
|
||||
body: JSON.stringify({message:'ajoute un nouvel intent listprio qui execute cat /opt/wevia-brain/priority-intents-nl.json quand on tape listprio'})
|
||||
});
|
||||
await r.json();
|
||||
const r2 = await fetch('/api/wevia-master-api.php', {
|
||||
method: 'POST', headers: {'Content-Type':'application/json'},
|
||||
body: JSON.stringify({message:'listprio'})
|
||||
});
|
||||
const j2 = await r2.json();
|
||||
if (j2.content) {
|
||||
const list = JSON.parse(j2.content);
|
||||
document.getElementById('prioBadge').textContent = list.length + ' intents';
|
||||
document.getElementById('prioDetail').textContent = 'word-boundary matching active';
|
||||
document.getElementById('intents').textContent = list.map(x =>
|
||||
'[' + x.name + '] trigger: ' + x.triggers + ' → ' + (x.command || '').substring(0, 80)
|
||||
).join('\n');
|
||||
}
|
||||
} catch(e) {
|
||||
document.getElementById('prioBadge').className = 'badge warn';
|
||||
document.getElementById('prioBadge').textContent = 'CHECK';
|
||||
}
|
||||
}
|
||||
load();
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user