diff --git a/api/blade-actions-surfaced.json b/api/blade-actions-surfaced.json index 42ef47da8..4cb5f9a42 100644 --- a/api/blade-actions-surfaced.json +++ b/api/blade-actions-surfaced.json @@ -1,15 +1,15 @@ { - "generated_at": "2026-04-19T19:20:02.290699", + "generated_at": "2026-04-19T19:25:02.094771", "stats": { - "total": 468, - "pending": 897, + "total": 469, + "pending": 899, "kaouther_surfaced": 29, "chrome_surfaced": 10, "notif_only_done": 0, "autofix_archived": 0, "cerebras_archived": 0, "older_3d_archived": 0, - "unknown": 429, + "unknown": 430, "errors": 0 }, "actions": [ diff --git a/api/blade-tasks/task_20260419172502_08296f.json b/api/blade-tasks/task_20260419172502_08296f.json new file mode 100644 index 000000000..9d76fa42e --- /dev/null +++ b/api/blade-tasks/task_20260419172502_08296f.json @@ -0,0 +1,11 @@ +{ + "id": "task_20260419172502_08296f", + "name": "Blade self-heal 19:25", + "type": "powershell", + "command": "\n# Blade self-heal\nWrite-Host \"Self-heal triggered $(Get-Date)\"\n$agentProc = Get-Process powershell | Where-Object { $_.CommandLine -match 'sentinel-agent' }\nif (!$agentProc) {\n Write-Host \"Agent not running, starting...\"\n Start-Process powershell -ArgumentList \"-ExecutionPolicy\",\"Bypass\",\"-File\",\"C:\\ProgramData\\WEVAL\\sentinel-agent.ps1\" -WindowStyle Hidden\n}\n# Clear stale tasks > 3 days locally\n$cutoff = (Get-Date).AddDays(-3)\nGet-ChildItem \"C:\\ProgramData\\WEVAL\\tasks\\*.json\" -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -lt $cutoff } | Move-Item -Destination \"C:\\ProgramData\\WEVAL\\tasks\\archived\\\" -Force -ErrorAction SilentlyContinue\nWrite-Host \"Self-heal complete\"\n", + "cmd": "\n# Blade self-heal\nWrite-Host \"Self-heal triggered $(Get-Date)\"\n$agentProc = Get-Process powershell | Where-Object { $_.CommandLine -match 'sentinel-agent' }\nif (!$agentProc) {\n Write-Host \"Agent not running, starting...\"\n Start-Process powershell -ArgumentList \"-ExecutionPolicy\",\"Bypass\",\"-File\",\"C:\\ProgramData\\WEVAL\\sentinel-agent.ps1\" -WindowStyle Hidden\n}\n# Clear stale tasks > 3 days locally\n$cutoff = (Get-Date).AddDays(-3)\nGet-ChildItem \"C:\\ProgramData\\WEVAL\\tasks\\*.json\" -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -lt $cutoff } | Move-Item -Destination \"C:\\ProgramData\\WEVAL\\tasks\\archived\\\" -Force -ErrorAction SilentlyContinue\nWrite-Host \"Self-heal complete\"\n", + "priority": "high", + "status": "pending", + "created": "2026-04-19T17:25:02+00:00", + "created_by": "blade-control-ui" +} \ No newline at end of file diff --git a/api/playwright-results/v77-2026-04-19T17-24-44/results.json b/api/playwright-results/v77-2026-04-19T17-24-44/results.json new file mode 100644 index 000000000..417c53424 --- /dev/null +++ b/api/playwright-results/v77-2026-04-19T17-24-44/results.json @@ -0,0 +1,35 @@ +{ + "ts": "2026-04-19T17:25:04.867Z", + "test": "v7.7 FINAL cumul 30 mixed + 4 pages", + "tests": [ + { + "name": "v77_30_mixed_matched", + "pass": true, + "matched": 30, + "total": 30 + }, + { + "name": "erp", + "pass": true, + "canvases": 8 + }, + { + "name": "drill", + "pass": true, + "cards": 9 + }, + { + "name": "sm", + "pass": true, + "total": "260" + }, + { + "name": "wtp", + "pass": true, + "title": "WEVAL — Login" + } + ], + "total": 5, + "pass": 5, + "fail": 0 +} \ No newline at end of file diff --git a/api/playwright-results/v77-2026-04-19T17-24-44/page@a1ef3cb1ed8267030cc7e44cbc3c4b32.webm b/api/playwright-results/v77-2026-04-19T17-24-44/v77.webm similarity index 79% rename from api/playwright-results/v77-2026-04-19T17-24-44/page@a1ef3cb1ed8267030cc7e44cbc3c4b32.webm rename to api/playwright-results/v77-2026-04-19T17-24-44/v77.webm index 4c3f5c77f..779615d04 100644 Binary files a/api/playwright-results/v77-2026-04-19T17-24-44/page@a1ef3cb1ed8267030cc7e44cbc3c4b32.webm and b/api/playwright-results/v77-2026-04-19T17-24-44/v77.webm differ diff --git a/api/v77-latest.json b/api/v77-latest.json new file mode 100644 index 000000000..417c53424 --- /dev/null +++ b/api/v77-latest.json @@ -0,0 +1,35 @@ +{ + "ts": "2026-04-19T17:25:04.867Z", + "test": "v7.7 FINAL cumul 30 mixed + 4 pages", + "tests": [ + { + "name": "v77_30_mixed_matched", + "pass": true, + "matched": 30, + "total": 30 + }, + { + "name": "erp", + "pass": true, + "canvases": 8 + }, + { + "name": "drill", + "pass": true, + "cards": 9 + }, + { + "name": "sm", + "pass": true, + "total": "260" + }, + { + "name": "wtp", + "pass": true, + "title": "WEVAL — Login" + } + ], + "total": 5, + "pass": 5, + "fail": 0 +} \ No newline at end of file diff --git a/api/v83-business-kpi-latest.json b/api/v83-business-kpi-latest.json index 07c6b6b63..38ef6e459 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-19T17:20:14+00:00", + "ts": "2026-04-19T17:25:13+00:00", "summary": { "total_categories": 7, "total_kpis": 56, diff --git a/api/wevia-v69-dg-command-center.php b/api/wevia-v69-dg-command-center.php index 4687cabb2..e904e2803 100644 --- a/api/wevia-v69-dg-command-center.php +++ b/api/wevia-v69-dg-command-center.php @@ -233,6 +233,24 @@ $alerts_dg[] = ['level'=>'medium', 'icon'=>'🎯', 'title'=>'ROI Simulator V67 p 'action_link'=>'/agent-roi-simulator.html', 'owner'=>'Yacine', 'deadline'=>'J+7']; // Sort alerts by level +// === V37_ALERT_ACK_FILTER 19avr · doctrine 13+14 · reading /tmp/dg-alerts-ack.json === +$ack_file = '/tmp/dg-alerts-ack.json'; +$acks = []; +if (file_exists($ack_file)) { + $acks_raw = @json_decode(@file_get_contents($ack_file), true); + if (is_array($acks_raw)) $acks = $acks_raw; +} +$alerts_dg = array_values(array_filter($alerts_dg, function($a) use ($acks) { + $key = md5($a['title'] ?? ''); + if (isset($acks[$key])) { + $ack_ts = strtotime($acks[$key]['ts'] ?? '0'); + $expires = (int)($acks[$key]['expires_h'] ?? 24) * 3600; + if (time() - $ack_ts < $expires) return false; // filtered out (acknowledged) + } + return true; +})); +// === END V37_ALERT_ACK_FILTER === + usort($alerts_dg, function($a, $b) { $order = ['critical'=>0, 'high'=>1, 'medium'=>2, 'low'=>3]; return $order[$a['level']] <=> $order[$b['level']];