diff --git a/all-ia-hub.html b/all-ia-hub.html index 5197f56c2..1bf438e05 100644 --- a/all-ia-hub.html +++ b/all-ia-hub.html @@ -664,6 +664,7 @@ setTimeout(refreshBladeStats, 1500); // V116-DASHBOARDS-TAB: load 70 dashboards tiles let __dashData = null; async function loadDashboards(){ + // V117-HTTP-BADGES: load with optional status check try { const r = await fetch('/api/dashboards-registry.php'); const d = await r.json(); @@ -671,8 +672,19 @@ async function loadDashboards(){ renderDashStats(d); renderDashFilters(d); renderDashGrid(d.dashboards, 'all'); + // async load status badges in background + loadDashboardsStatus(); } catch(e){ console.error('[dashboards]',e); } } + +async function loadDashboardsStatus(){ + try { + const r = await fetch('/api/dashboards-registry.php?check=1'); + const d = await r.json(); + __dashData = d; + renderDashGrid(d.dashboards, document.querySelector('.dash-filter.on')?.getAttribute('data-cat') || 'all'); + } catch(e){ console.error('[dashboards-status]',e); } +} function renderDashStats(d){ const box = document.getElementById('dash-stats'); if (!box) return; @@ -697,12 +709,19 @@ function renderDashFilters(d){ }); } function renderDashGrid(items, cat){ + /* V117-HTTP-BADGES: status badge */ const box = document.getElementById('dash-grid'); if (!box) return; const filtered = cat === 'all' ? items : items.filter(x => x.category === cat); + function statusBadge(s){ + if(!s) return ''; + if(s===200) return '● 200'; + if(s===302) return '● auth'; + return '● '+s+''; + } box.innerHTML = filtered.map(e => '' + - '
'+e.icon+' '+e.category+'
' + + '
'+e.icon+' '+e.category+''+statusBadge(e.http_status)+'
' + '
'+e.display+'
' + '
'+e.name+' - '+e.size_kb+'KB
' + '
' diff --git a/api/blade-actions-surfaced.json b/api/blade-actions-surfaced.json index d4574e6a0..fa9145ee0 100644 --- a/api/blade-actions-surfaced.json +++ b/api/blade-actions-surfaced.json @@ -1,15 +1,15 @@ { - "generated_at": "2026-04-21T09:40:02.127601", + "generated_at": "2026-04-21T09:45:02.061355", "stats": { "total": 47, - "pending": 32, + "pending": 30, "kaouther_surfaced": 18, "chrome_surfaced": 2, "notif_only_done": 0, "autofix_archived": 0, "cerebras_archived": 0, "older_3d_archived": 0, - "unknown": 6, + "unknown": 5, "errors": 0 }, "actions": [ diff --git a/api/blade-tasks/v117-badges-proof/01-badges.png b/api/blade-tasks/v117-badges-proof/01-badges.png new file mode 100644 index 000000000..8ade0ccae Binary files /dev/null and b/api/blade-tasks/v117-badges-proof/01-badges.png differ diff --git a/api/blade-tasks/v117-badges-proof/6f5159d328ea31cb93784468d7366c94.webm b/api/blade-tasks/v117-badges-proof/6f5159d328ea31cb93784468d7366c94.webm new file mode 100644 index 000000000..de8ede2e7 Binary files /dev/null and b/api/blade-tasks/v117-badges-proof/6f5159d328ea31cb93784468d7366c94.webm differ diff --git a/api/blade-tasks/v117-badges-proof/proof.json b/api/blade-tasks/v117-badges-proof/proof.json new file mode 100644 index 000000000..34b3f7c0f --- /dev/null +++ b/api/blade-tasks/v117-badges-proof/proof.json @@ -0,0 +1,10 @@ +{ + "v117": "badges", + "state": { + "tiles": 69, + "badges_200": 5, + "badges_auth": 5, + "badges_error": 5 + }, + "VERDICT": "PARTIAL" +} \ No newline at end of file diff --git a/api/dashboards-registry.php b/api/dashboards-registry.php index 793ca8fcb..0c4dc4dd9 100644 --- a/api/dashboards-registry.php +++ b/api/dashboards-registry.php @@ -43,13 +43,15 @@ $byCategory = []; $checkStatus = isset($_GET['check']) && $_GET['check'] === '1'; // V117-HTTP-STATUS: optional live HTTP status via local curl function checkHttp($name) { - $ch = curl_init("http://127.0.0.1/$name"); + /* V117-CURL-FIX: https with self-signed + follow 1 redirect to get real status */ + $ch = curl_init("https://weval-consulting.com/$name"); curl_setopt_array($ch, [ CURLOPT_NOBODY => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 2, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_SSL_VERIFYHOST => false, CURLOPT_FOLLOWLOCATION => false, - CURLOPT_HTTPHEADER => ['Host: weval-consulting.com'] ]); curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); diff --git a/api/em-kpi-cache.json b/api/em-kpi-cache.json index 33440a5c5..e69de29bb 100644 --- a/api/em-kpi-cache.json +++ b/api/em-kpi-cache.json @@ -1,281 +0,0 @@ -{ - "ts": "2026-04-21T07:40:01+00:00", - "server": "s204", - "s204": { - "load": 2.84, - "uptime": "2026-04-14 11:51:24", - "ram_total_mb": 31335, - "ram_used_mb": 12090, - "ram_free_mb": 19244, - "disk_total": "150G", - "disk_used": "116G", - "disk_free": "29G", - "disk_pct": "81%", - "fpm_workers": 141, - "docker_containers": 19, - "cpu_cores": 8 - }, - "s95": { - "load": 0.17, - "disk_pct": "81%", - "status": "UP", - "ram_total_mb": 15610, - "ram_free_mb": 11922 - }, - "pmta": [ - { - "name": "SER6", - "ip": "110.239.84.121", - "status": "DOWN" - }, - { - "name": "SER7", - "ip": "110.239.65.64", - "status": "DOWN" - }, - { - "name": "SER8", - "ip": "182.160.55.107", - "status": "DOWN" - }, - { - "name": "SER9", - "ip": "110.239.86.68", - "status": "DOWN" - } - ], - "assets": { - "html_pages": 293, - "php_apis": 774, - "wiki_entries": 1928, - "vault_doctrines": 59, - "vault_sessions": 104, - "vault_decisions": 12 - }, - "tools": { - "total": 627, - "registry_version": "?" - }, - "sovereign": { - "status": "UP", - "providers": [ - "Cerebras-fast", - "Cerebras-think", - "Groq", - "Cloudflare-AI", - "Gemini", - "SambaNova", - "NVIDIA-NIM", - "Mistral", - "Groq-OSS", - "HF-Space", - "HF-Router", - "OpenRouter", - "GitHub-Models" - ], - "active": 13, - "total": 13, - "primary": "Cerebras-fast", - "cost": "0€" - }, - "ethica": { - "total_hcps": 161733, - "with_email": 110580, - "with_phone": 155149, - "gap_email": 51153, - "pct_email": 68.4, - "pct_phone": 95.9, - "by_country": [ - { - "country": "DZ", - "hcps": 122337, - "with_email": 78484, - "with_tel": 119394, - "pct_email": 64.2, - "pct_tel": 97.6 - }, - { - "country": "MA", - "hcps": 19723, - "with_email": 15074, - "with_tel": 18737, - "pct_email": 76.4, - "pct_tel": 95 - }, - { - "country": "TN", - "hcps": 17794, - "with_email": 15143, - "with_tel": 17018, - "pct_email": 85.1, - "pct_tel": 95.6 - }, - { - "country": "INTL", - "hcps": 1879, - "with_email": 1879, - "with_tel": 0, - "pct_email": 100, - "pct_tel": 0 - } - ] - }, - "docker": [ - { - "name": "loki", - "status": "Up 4 days", - "ports": "" - }, - { - "name": "listmonk", - "status": "Up 4 days", - "ports": "" - }, - { - "name": "plausible-plausible-1", - "status": "Up 3 days", - "ports": "" - }, - { - "name": "plausible-plausible-db-1", - "status": "Up 3 days", - "ports": "" - }, - { - "name": "plausible-plausible-events-db-1", - "status": "Up 3 days", - "ports": "" - }, - { - "name": "n8n-docker-n8n-1", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "mattermost-docker-mm-db-1", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "mattermost-docker-mattermost-1", - "status": "Up 5 days (healthy)", - "ports": "" - }, - { - "name": "twenty", - "status": "Up 4 days", - "ports": "" - }, - { - "name": "twenty-redis", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "langfuse", - "status": "Up 5 days", - "ports": "" - }, - { - "name": "redis-weval", - "status": "Up 6 days", - "ports": "" - }, - { - "name": "gitea", - "status": "Up 6 days", - "ports": "" - }, - { - "name": "node-exporter", - "status": "Up 6 days", - "ports": "" - }, - { - "name": "prometheus", - "status": "Up 6 days", - "ports": "" - }, - { - "name": "searxng", - "status": "Up 6 days", - "ports": "" - }, - { - "name": "uptime-kuma", - "status": "Up 32 hours (healthy)", - "ports": "" - }, - { - "name": "vaultwarden", - "status": "Up 6 days (healthy)", - "ports": "" - }, - { - "name": "qdrant", - "status": "Up 6 days", - "ports": "" - } - ], - "crons": { - "active": 35 - }, - "git": { - "head": "4dd5f94e7 auto-sync-0940", - "dirty": 4, - "status": "DIRTY" - }, - "nonreg": { - "total": 153, - "passed": 153, - "score": "100%" - }, - "services": [ - { - "name": "DeerFlow", - "port": 3002, - "status": "UP" - }, - { - "name": "DeerFlow API", - "port": 8001, - "status": "UP" - }, - { - "name": "Qdrant", - "port": 6333, - "status": "UP" - }, - { - "name": "Ollama", - "port": 11434, - "status": "UP" - }, - { - "name": "Redis", - "port": 6379, - "status": "UP" - }, - { - "name": "Sovereign", - "port": 4000, - "status": "UP" - }, - { - "name": "SearXNG", - "port": 8080, - "status": "UP" - } - ], - "whisper": { - "binary": "COMPILED", - "model": "142MB" - }, - "grand_total": 3700, - "health": { - "score": 5, - "max": 6, - "pct": 83 - }, - "elapsed_ms": 11307 -} \ No newline at end of file diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json index 1bbebb6ce..7c0956207 100644 --- a/api/v83-business-kpi-latest.json +++ b/api/v83-business-kpi-latest.json @@ -1,7 +1,7 @@ { "ok": true, "version": "V83-business-kpi", - "ts": "2026-04-21T07:40:16+00:00", + "ts": "2026-04-21T07:44:02+00:00", "summary": { "total_categories": 8, "total_kpis": 64,