diff --git a/correlation.py b/src/fgai/correlation.py similarity index 100% rename from correlation.py rename to src/fgai/correlation.py diff --git a/src/fgai/dashboard.py b/src/fgai/dashboard.py index 76c036a..cb53e9d 100644 --- a/src/fgai/dashboard.py +++ b/src/fgai/dashboard.py @@ -155,7 +155,9 @@ async function refresh() { ]); const d = data.diagnostics || {}; const context = data.event_context || {}; + const correlations = data.cross_source_correlations || []; document.getElementById('diagnostics').innerHTML = + '

Cross-Source Correlations

' + table(correlations, [{label:'Source IP', key:'source_ip'}, {label:'Streams', render:r => esc((r.streams || []).join(', '))}, {label:'Events', key:'events'}, {label:'Security Events', key:'security_events'}]) + '

Entities

' + table(context.source_profiles || [], [{label:'Entity', key:'entity'}, {label:'Events', key:'events'}, {label:'UTM', key:'utm_events'}, {label:'Deny', key:'deny_or_threat_actions'}, {label:'Destinations', key:'distinct_destinations'}, {label:'Actions', render:r => esc((r.top_actions || []).join(', '))}]) + '

Security Event Samples

' + table(context.security_event_samples || [], [{label:'Entity', key:'entity'}, {label:'Type', key:'type'}, {label:'Action', key:'action'}, {label:'Severity', key:'severity'}, {label:'Destination', key:'dst'}, {label:'Service', key:'service'}]) + '

Top Sources

' + table(d.top_source_ips || [], [{label:'Value', key:'value'}, {label:'Count', key:'count'}]) +