monitor/html/office.html
fds2610-bot 62e5cb0751 Abgelaufene Claude-Anmeldung eines Agenten sichtbar machen
Laeuft einem Agenten die Claude-Anmeldung aus, laeuft das Cron-Skript um ihn
herum unbeeindruckt weiter: es meldet "working", ruft claude auf, bekommt nichts
Brauchbares zurueck und meldet am Ende "idle". last_seen_at ist frisch, der
Agent sieht beschaeftigt aus - waehrend Lauf fuer Lauf nichts entsteht. Der
Ausfall fiel bisher erst auf, wenn jemand merkte, dass keine PRs mehr kommen.

Agenten melden den Fall jetzt ueber zwei neue state-Werte (auth_expiring,
auth_expired) am bestehenden Activity-Endpunkt. state ist serverseitig nicht
eingeschraenkt, daher ohne Migration und ohne Aenderung an der API.

Dargestellt in drei Stufen der Aufmerksamkeit:
- Schloss ueber dem Avatar (bei auth_expired pulsierend), entsaettigter Koerper,
  eingefaerbter Bildschirm und Namensschild am Platz
- Header-Banner mit den betroffenen Agenten, gelb bei Vorwarnung, rot bei
  Ausfall - auch aus einigen Metern Entfernung noch lesbar
- KPI-Kachel "Problem: n", die sich nur einfaerbt, wenn n > 0

Kern ist isAgentVisible(), bewusst getrennt von isAgentPresent(): ein
blockierter Agent bleibt sichtbar, obwohl er sich nicht mehr meldet, zaehlt aber
nicht als "Online" mit. Ohne das verschwaende er nach dem Praesenz-Timeout genau
dann vom Schreibtisch, wenn seine Warnung dort stehen soll.

MAX_KPI_TILES von 4 auf 5, sonst verdraengen Agenten/Online/Problem/Hooks die
gemeldeten KPIs (F7) vollstaendig.

Nebenbei: "npm test" lief seit Node 24 nicht mehr (das Verzeichnis-Argument wird
nicht mehr als Testverzeichnis aufgeloest), jetzt per Glob.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 09:52:08 +02:00

33 lines
1.4 KiB
HTML

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="/favicon.png">
<title>FDS Buero-Visualisierung</title>
<link rel="stylesheet" href="css/office.css">
</head>
<body>
<header class="office-header">
<h1>Agent-Status</h1>
<span id="reload-countdown" class="reload-countdown" aria-hidden="true"></span>
</header>
<div id="api-status-banner" class="api-banner" role="alert" hidden>API nicht erreichbar!</div>
<!-- Agent blockiert (Claude-Anmeldung abgelaufen): anders als der API-Banner mit
dynamischem Text, weil er die betroffenen Agenten nennt. Siehe
setAgentProblemBanner() in js/office-render.js. -->
<div id="agent-problem-banner" class="api-banner" role="alert" hidden></div>
<main id="office-scene" aria-label="Buero-Szene"></main>
<!-- Laufzeit-Konfiguration (API-Basis-URL, Sync-Intervall fuer den kosmetischen
Reload-Countdown): wird vom Webserver aus den Umgebungsvariablen MONITOR_API_BASE
und MONITOR_SYNC_INTERVAL erzeugt, siehe docker/nginx/default.conf.template und
.env.example. Muss vor dem Modul stehen - ein klassisches Script laeuft synchron vor
jedem Modul. -->
<script src="/config.js"></script>
<script type="module" src="js/office-render.js"></script>
</body>
</html>