Phase 17: Health-Tab Filter + Org-Spalte + History-View + URL-Schema-Fix

Backend:
- shared/services/source_health.py: URL ohne https://-Prefix wird normalisiert
  bevor httpx.get() aufgerufen wird (Bug-Fix: t.me/kanal liess httpx mit
  ValueError crashen, Synchron mit Monitor-Fix 1ee6c4d).
- routers/sources.py /health: Query erweitert um tenant_id, category,
  language, bias, org_name (LEFT JOIN organizations) - Frontend kann jetzt
  pro Issue Tenant-Info anzeigen.
- routers/sources.py /health/history NEU: letzte N Runs aus
  source_health_history aggregiert (run_id, archived_at, errors/warnings/ok).

Frontend (source-health.js):
- healthFilters State: status / check_type / org.
- applyHealthFilter() reduziert die Anzeige.
- Filter-Bar mit 3 Dropdowns + Counter "X / Y Ergebnisse".
- Tabelle erweitert: Org-Spalte ("global" oder Org-Name), Sprache-Spalte.
- History-View neu: letzte 10 Runs als Tabelle (Zeitpunkt, Run-ID, Counts).

Cache-Buster auf 20260509c gebumpt.
Dieser Commit ist enthalten in:
claude-dev
2026-05-09 04:47:05 +00:00
Ursprung 07a426561c
Commit bff934d673
5 geänderte Dateien mit 136 neuen und 16 gelöschten Zeilen

Datei anzeigen

@@ -6,7 +6,7 @@
<title>AegisSight Monitor-Verwaltung</title>
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
<link rel="apple-touch-icon" href="/static/favicon.svg">
<link rel="stylesheet" href="/static/css/style.css?v=20260509b">
<link rel="stylesheet" href="/static/css/style.css?v=20260509c">
<style>
.source-badge { display:inline-block; padding:2px 8px; border-radius:4px; font-size:12px; font-weight:600; }
@@ -697,10 +697,10 @@
</div>
</div>
<script src="/static/js/app.js?v=20260509b"></script>
<script src="/static/js/sources.js?v=20260509b"></script>
<script src="/static/js/source-health.js?v=20260509b"></script>
<script src="/static/js/audit.js?v=20260509b"></script>
<script src="/static/js/app.js?v=20260509c"></script>
<script src="/static/js/sources.js?v=20260509c"></script>
<script src="/static/js/source-health.js?v=20260509c"></script>
<script src="/static/js/audit.js?v=20260509c"></script>
<div id="toastContainer" class="toast-container" aria-live="polite" aria-atomic="true"></div>
</body>
</html>