@@ -76,6 +76,27 @@ class EngineProvider extends ChangeNotifier {
7676 List <SystemEvent > _events = [];
7777 List <SystemEvent > get events => _events;
7878
79+ /// Each [/ws/alerts] push (one per fired alert). Merged with engine [recent_alerts] for UI.
80+ static const int _maxAlertFeed = 120 ;
81+ final List <AlertRecord > _alertFeedFromWs = [];
82+
83+ /// Newest-first list for Diagnostics; deduped against live state history.
84+ List <AlertRecord > get mergedAlertHistory {
85+ final fromEngine =
86+ _currentState? .alert.recentAlerts ?? const < AlertRecord > [];
87+ final seen = < String > {};
88+ String dedupeKey (AlertRecord r) =>
89+ '${r .timestamp .toStringAsFixed (3 )}::${r .message }' ;
90+ final merged = < AlertRecord > [];
91+ for (final r in [..._alertFeedFromWs, ...fromEngine]) {
92+ if (seen.add (dedupeKey (r))) {
93+ merged.add (r);
94+ }
95+ }
96+ merged.sort ((a, b) => b.timestamp.compareTo (a.timestamp));
97+ return merged;
98+ }
99+
79100 // ── Subscriptions ──
80101 StreamSubscription ? _liveSub;
81102 StreamSubscription ? _alertSub;
@@ -96,6 +117,7 @@ class EngineProvider extends ChangeNotifier {
96117 }
97118
98119 Future <void > reconnect () async {
120+ _alertFeedFromWs.clear ();
99121 _liveSub? .cancel ();
100122 _alertSub? .cancel ();
101123 _processFetchTimer? .cancel ();
@@ -208,6 +230,12 @@ class EngineProvider extends ChangeNotifier {
208230 }
209231
210232 void _onAlertPayload (Map <String , dynamic > payload) {
233+ try {
234+ _alertFeedFromWs.insert (0 , AlertRecord .fromJson (payload));
235+ if (_alertFeedFromWs.length > _maxAlertFeed) {
236+ _alertFeedFromWs.removeRange (_maxAlertFeed, _alertFeedFromWs.length);
237+ }
238+ } catch (_) {}
211239 final message = payload['message' ] as String ? ?? 'System stress alert' ;
212240 if (_settings.desktopNotificationsEnabled) {
213241 unawaited (_notifications.show (
@@ -216,6 +244,7 @@ class EngineProvider extends ChangeNotifier {
216244 message.length > 256 ? '${message .substring (0 , 253 )}...' : message,
217245 ));
218246 }
247+ notifyListeners ();
219248 }
220249
221250 void _syncCooldownTicker (SystemState state) {
0 commit comments