import { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { FileText, ArrowLeft, CheckCircle2, XCircle, Clock, Filter, Search, Activity, Lock } from 'lucide-react'; interface AuditEvent { id: string; event: string; actor: string; timestamp: string; result?: 'success' | 'failure'; metadata?: Record; } export function AuditLogger() { const navigate = useNavigate(); const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [filter, setFilter] = useState<{ type?: string; actor?: string }>({}); useEffect(() => { const t = setTimeout(() => { setEvents([ { id: '1', event: 'command_executed', actor: 'command_router', timestamp: new Date().toISOString(), result: 'success', metadata: { tool: 'fs.read', path: './src/App.tsx' } }, { id: '2', event: 'policy_denial', actor: 'policy_engine', timestamp: new Date(Date.now() - 3600000).toISOString(), result: 'failure', metadata: { reason: 'tool_not_in_allowlist', tool: 'shell.exec' } }, { id: '3', event: 'secret_detected', actor: 'secrets_guard', timestamp: new Date(Date.now() - 7200000).toISOString(), result: 'success', metadata: { violationCount: 1, type: 'api_key' } }, ]); setLoading(false); }, 500); return () => clearTimeout(t); }, []); const getEventIcon = (event: string) => { if (event.includes('command')) return Activity; if (event.includes('policy')) return XCircle; if (event.includes('secret')) return Lock; return FileText; }; const filtered = events.filter((e) => { if (filter.type && e.event !== filter.type) return false; if (filter.actor && e.actor !== filter.actor) return false; return true; }); if (loading) { return (
{[1, 2, 3].map((i) =>
)}
); } return (

Журнал аудита

Просмотр и анализ всех действий в системе

Фильтры

События

Всего: {filtered.length}
{filtered.length === 0 ? (

Нет событий для отображения

) : (
{filtered.map((event) => { const Icon = getEventIcon(event.event); const isSuccess = event.result === 'success'; return (
{event.event} {isSuccess ? <>Успех : <>Ошибка} {event.actor}
{new Date(event.timestamp).toLocaleString('ru-RU')}
{event.metadata && Object.keys(event.metadata).length > 0 && (
{JSON.stringify(event.metadata, null, 2)}
)}
); })}
)}
); }