diff --git a/web/src/App.vue b/web/src/App.vue index 914984d..f6a1b48 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -76,6 +76,7 @@ const navLinks = [ { to: '/search', label: 'Search' }, { to: '/diagnose', label: 'Diagnose' }, { to: '/incidents', label: 'Incidents' }, + { to: '/alerts', label: 'Alerts' }, { to: '/bundles', label: 'Bundles' }, { to: '/sources', label: 'Sources' }, { to: '/context', label: 'Context' }, diff --git a/web/src/router/index.ts b/web/src/router/index.ts index b2c7f97..e5bba57 100644 --- a/web/src/router/index.ts +++ b/web/src/router/index.ts @@ -8,6 +8,7 @@ import BundlesView from '@/views/BundlesView.vue' import SettingsView from '@/views/SettingsView.vue' import ContextView from '@/views/ContextView.vue' import BlocklistView from '@/views/BlocklistView.vue' +import SecurityAlertsView from '@/views/SecurityAlertsView.vue' export default createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -17,6 +18,7 @@ export default createRouter({ { path: '/search', component: LogSearchView }, { path: '/diagnose', component: DiagnoseView }, { path: '/incidents', component: IncidentsView }, + { path: '/alerts', component: SecurityAlertsView }, { path: '/bundles', component: BundlesView }, { path: '/sources', component: SourcesView }, { path: '/context', component: ContextView }, diff --git a/web/src/views/DashboardView.vue b/web/src/views/DashboardView.vue index 98a9c4f..3d6a73a 100644 --- a/web/src/views/DashboardView.vue +++ b/web/src/views/DashboardView.vue @@ -52,6 +52,16 @@ {{ incidentsLoading ? '…' : activeIncidents }}
+Unreviewed Alerts
++ {{ alertsLoading ? '…' : unackedAlerts }} +
++ Anomaly detections from the scoring pipeline. + Acknowledge entries after review to track your triage state. +
+TURNSTONE_ANOMALY_MODEL
+ in your .env and restart Turnstone.
+ No unacknowledged detections — all clear.
+Enable anomaly scoring to start detecting.
+No detections yet. Run the scorer after gleaning to populate this list.
+| Sev | +Label | +Score | +Source | +Log entry | +Detected | ++ |
|---|---|---|---|---|---|---|
| + + {{ det.severity }} + + | ++ + {{ det.anomaly_label }} + + | +
+
+
+
+
+
+ {{ Math.round(det.anomaly_score * 100) }}%
+ |
+ {{ det.source_id }} | +{{ det.text }} | +{{ formatTs(det.detected_at) }} | ++ reviewed + + | +
+ source: {{ drawer.source_id }} + · {{ formatTs(drawer.timestamp_iso) }} +
+Acknowledged {{ formatTs(drawer.acknowledged_at) }}
+{{ drawer.notes }}
+