monitor/html/js/demo-data.js
fds2610-bot 9af2f82801 Neue Agenten-Rolle "ops" mit Schreibtischplatz (Issue #66)
Fuer den Betrieb fehlte bisher eine Rolle: "user" meldet zwar Daten, bleibt in der
Buero-Visualisierung aber unsichtbar, weil sie nie einen Schreibtisch bekommt. Der
Ping-Check aus check_fds.sh (Weg 3 im README) lief deshalb als "user" und tauchte im
Buero nicht auf.

"ops" fuellt die Luecke: die Schreibtischvergabe in AgentRepository::register() greift
automatisch, sobald die Rolle erlaubt ist - nur "user" bleibt ohne Platz.

Der CHECK-Constraint auf agents.role braucht dafuer eine eigene Migration. Ein Edit von
001_initial.sql wuerde nur frische Datenbanken erreichen: bestehende Installationen haben
die Migration laut schema_migrations laengst angewandt und wuerden bei role='ops'
weiterhin abbrechen. SQLite kann CHECK nicht per ALTER TABLE aendern, 004 baut die Tabelle
deshalb neu (Verfahren aus der SQLite-Doku, foreign_keys kurz aus, weil
tickets.assignee_agent_id auf agents zeigt).

Im Frontend bekommt die Rolle Label "OPs", eine Akzentfarbe und ein Zahnrad als
Schreibtisch-Deko - ohne Eintrag in der ROLES-Map rendert der Avatar grau und ohne Label.

Neu ist ausserdem register-ops-agent.sh neben der docker-compose.yml: es liest Admin-Key
und Basis-URL aus der .env, registriert den lokalen OPs-Agenten und schreibt den nur
einmalig ausgegebenen API-Key mit chmod 600 nach monitor-api.conf - also genau die beiden
Schritte aus Weg 3, die hosts.conf und credentials.conf nicht abdecken. Eine vorhandene
monitor-api.conf ueberschreibt es nicht, und ein zweiter Agent gleichen Namens (der einen
weiteren der acht Schreibtische belegen wuerde) wird vorher abgefangen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 21:21:05 +02:00

52 lines
2.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Statische Demo-Daten fuer Phase 2 ("Statische Buero-Szene", Visualization.md Abschnitt 9).
// Die Form entspricht bewusst den echten API-Responses (siehe API.md), damit ab Phase 3 nur
// noch die Quelle (fetch() statt dieses Moduls) getauscht werden muss.
// Entspricht der Struktur von GET /api/v1/tickets, hier aber bereits zu Zaehlern je Spalte
// aggregiert (die eigentliche Aggregation aus Einzel-Tickets kommt mit der Live-Anbindung
// in Phase 3).
export const DEMO_TICKET_COUNTS = {
backlog: 8,
bereit: 3,
in_arbeit: 2,
qa: 1,
testing: 0,
fertig: 2,
done: 12,
};
// Entspricht GET /api/v1/agents, "pose" ist reine Darstellungs-Deko fuer Phase 2 (ohne
// Animation) und kein Feld der echten API.
export const DEMO_AGENTS = [
{ name: "Alice", role: "entwickler", pose: "working" },
{ name: "Bob", role: "entwickler", pose: "reading_newspaper" },
{ name: "Petra", role: "product_owner", pose: "working" },
{ name: "Quentin", role: "qa", pose: "idle" },
{ name: "Dirk", role: "entwickler", pose: "working" },
{ name: "Nadja", role: "qa", pose: "coffee" },
{ name: "Olaf", role: "ops", pose: "working" },
null,
];
// Entspricht GET /api/v1/systems.
export const DEMO_SYSTEMS = [
{ id: "srv1", name: "Webserver", status: "ok" },
{ id: "srv2", name: "Mailserver", status: "ok" },
{ id: "srv3", name: "Datenbank", status: "error" },
{ id: "srv4", name: "Backup", status: "ok" },
{ id: "srv5", name: "VPN", status: "ok" },
{ id: "srv6", name: "DNS", status: "ok" },
];
// Entspricht GET /api/v1/events, bereits absteigend nach Zeit sortiert (neuestes zuerst).
export const DEMO_EVENTS = [
{ time: "14:32", system: "Datenbank", message: "Verbindung fehlgeschlagen", severity: "error" },
{ time: "14:20", system: "Backup", message: "Backup dauert laenger als ueblich", severity: "warning" },
{ time: "13:58", system: "Webserver", message: "Hohe Antwortzeit", severity: "warning" },
{ time: "12:10", system: "VPN", message: "Client getrennt", severity: "warning" },
{ time: "09:05", system: "Datenbank", message: "Reconnect erfolgreich", severity: "warning" },
];
// KPI-Monitor: F7 ist noch offen ("kommt spaeter") - Phase 2 zeigt daher nur einen leeren
// Rahmen mit Platzhaltertext, bewusst keine erfundenen Kennzahlen.
export const DEMO_KPI_PLACEHOLDER = "KPI-Monitor – Kennzahlen folgen in einer späteren Phase";