feat: punkt 5 (monitoring) — system dashboard backend+frontend, admin-only, auto-refresh 30s, alerting via notifications

This commit is contained in:
Agent Zero
2026-08-20 13:39:50 +02:00
parent fbd0324d6b
commit 9a20ae5528
9 changed files with 848 additions and 2 deletions
+104
View File
@@ -0,0 +1,104 @@
/**
* System Dashboard API hooks — admin-only system monitoring.
*/
import { useQuery } from '@tanstack/react-query';
import { apiGet } from './client';
// ── Types matching backend responses ──
export interface SystemDashboardData {
overall_status: string;
timestamp: string;
database: {
status: string;
connections?: number;
table_count?: number;
db_size_bytes?: number;
db_size_human?: string;
error?: string;
};
redis: {
status: string;
connections?: number;
used_memory?: number;
used_memory_human?: string;
peak_memory_human?: string;
uptime_seconds?: number;
error?: string;
};
worker: {
status: string;
queue_length?: number;
active_workers?: number;
error?: string;
};
api: {
total_requests?: number;
error_count?: number;
error_rate?: number;
avg_response_time_ms?: number;
error?: string;
};
plugins: {
total_discovered?: number;
active_plugins?: Array<{
name: string;
version: string;
is_core: boolean;
}>;
error_count?: number;
errors?: string[];
error?: string;
};
storage: {
status: string;
path?: string;
disk_total_bytes?: number;
disk_used_bytes?: number;
disk_free_bytes?: number;
disk_usage_percent?: number;
file_count?: number;
error?: string;
};
llm: {
total_tokens: number;
estimated_cost: number;
last_24h_tokens: number;
last_24h_cost: number;
};
}
export interface SystemAlert {
severity: 'critical' | 'warning';
type: string;
message: string;
}
export interface SystemAlertsData {
alerts: SystemAlert[];
alert_count: number;
timestamp: string;
}
// ── Hooks ──
const REFRESH_INTERVAL = 30 * 1000; // 30 seconds
export function useSystemDashboard() {
return useQuery({
queryKey: ['system-dashboard'],
queryFn: () => apiGet<SystemDashboardData>('/system/dashboard'),
refetchInterval: REFRESH_INTERVAL,
staleTime: REFRESH_INTERVAL,
});
}
export function useSystemAlerts() {
return useQuery({
queryKey: ['system-alerts'],
queryFn: () => apiGet<SystemAlertsData>('/system/alerts'),
refetchInterval: REFRESH_INTERVAL,
staleTime: REFRESH_INTERVAL,
});
}