using Microsoft.AspNetCore.SignalR; namespace ZB.MOM.WW.OtOpcUa.Admin.Hubs; /// /// Pushes sticky alerts (crash-loop circuit trips, failed applies, reservation-release /// anomalies) to subscribed admin clients. Alerts don't auto-clear — the operator acks them /// from the UI via . /// public sealed class AlertHub : Hub { public const string AllAlertsGroup = "__alerts__"; public override async Task OnConnectedAsync() { await Groups.AddToGroupAsync(Context.ConnectionId, AllAlertsGroup); await base.OnConnectedAsync(); } /// Client-initiated ack. The server side of ack persistence is deferred — v2.1. public Task AcknowledgeAsync(string alertId) => Task.CompletedTask; } public sealed record AlertMessage( string AlertId, string Severity, string Title, string Detail, DateTime RaisedAtUtc, string? ClusterId, string? NodeId);