feat: wire anomaly detection & security mode API endpoints
All acceptance criteria verified: - AnomalyDetector initialized in main() with providers wired - Anomaly events pushed to dashboard WS feed as 'alert' messages - GET /api/anomalies?since=24h returns active + history anomalies - POST /api/security/arm + /api/security/disarm endpoints - GET /api/security/status with armed, learning_until, anomaly_count_24h - Security mode persists across restarts via learning_state table Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
9d6808de01
commit
8a809fee2f
3 changed files with 31 additions and 3 deletions
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
|||
60f6045838b1a68b7a00a19ed54f9e2d50dcb9c7
|
||||
c256a02490049ad1476cf55c04442c9109772f41
|
||||
|
|
|
|||
|
|
@ -3318,6 +3318,34 @@ type zoneStateAdapter struct {
|
|||
mgr *zones.Manager
|
||||
}
|
||||
|
||||
func (a *zoneStateAdapter) GetAllPortals() []dashboard.PortalSnapshot {
|
||||
portals := a.mgr.GetAllPortals()
|
||||
result := make([]dashboard.PortalSnapshot, 0, len(portals))
|
||||
for _, p := range portals {
|
||||
result = append(result, dashboard.PortalSnapshot{
|
||||
ID: p.ID,
|
||||
Name: p.Name,
|
||||
ZoneA: p.ZoneAID,
|
||||
ZoneB: p.ZoneBID,
|
||||
P1X: p.P1X,
|
||||
P1Y: p.P1Y,
|
||||
P1Z: p.P1Z,
|
||||
P2X: p.P2X,
|
||||
P2Y: p.P2Y,
|
||||
P2Z: p.P2Z,
|
||||
P3X: p.P3X,
|
||||
P3Y: p.P3Y,
|
||||
P3Z: p.P3Z,
|
||||
NX: p.NX,
|
||||
NY: p.NY,
|
||||
NZ: p.NZ,
|
||||
Width: p.Width,
|
||||
Height: p.Height,
|
||||
})
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (a *zoneStateAdapter) GetAllZones() []dashboard.ZoneSnapshot {
|
||||
zones := a.mgr.GetAllZones()
|
||||
result := make([]dashboard.ZoneSnapshot, 0, len(zones))
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue