From 1bf6e76e31383aef77e42943fc2caf350cf7e096 Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Mon, 06 Apr 2026 13:35:05 +0200
Subject: [PATCH] fix: resume message reload, direct session writes, MQTT trace pipe to server

---
 lib/services/trace_service.dart |   39 +++++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/lib/services/trace_service.dart b/lib/services/trace_service.dart
index baeef9f..5ef89b8 100644
--- a/lib/services/trace_service.dart
+++ b/lib/services/trace_service.dart
@@ -1,4 +1,10 @@
+import 'dart:convert';
+
 import 'package:flutter/foundation.dart';
+import 'package:mqtt_client/mqtt_client.dart';
+import 'package:mqtt_client/mqtt_server_client.dart';
+
+import 'mqtt_service.dart';
 
 /// A single trace entry capturing a message-handling event.
 class TraceEntry {
@@ -22,17 +28,28 @@
 /// Captures message-handling events from MQTT, chat screen, and other
 /// components. The buffer is capped at [maxEntries] (default 200).
 /// Works in both debug and release builds.
+///
+/// When an MqttService is attached via [attachMqtt], trace entries are
+/// automatically published to the server on `pailot/control/in` so they
+/// can be read from the daemon log.
 class TraceService {
   TraceService._();
   static final TraceService instance = TraceService._();
 
   static const int maxEntries = 200;
   final List<TraceEntry> _entries = [];
+  MqttService? _mqtt;
+
+  /// Attach an MQTT service for auto-publishing traces to the server.
+  void attachMqtt(MqttService mqtt) {
+    _mqtt = mqtt;
+  }
 
   /// All entries, oldest first.
   List<TraceEntry> get entries => List.unmodifiable(_entries);
 
   /// Add a trace entry. Oldest entry is evicted once the buffer is full.
+  /// If MQTT is attached and connected, the entry is also published to the server.
   void addTrace(String event, String details) {
     _entries.add(TraceEntry(
       timestamp: DateTime.now(),
@@ -43,6 +60,28 @@
       _entries.removeAt(0);
     }
     debugPrint('[TRACE] $event — $details');
+
+    // Auto-publish to server if MQTT is connected
+    _publishTrace(event, details);
+  }
+
+  void _publishTrace(String event, String details) {
+    final mqtt = _mqtt;
+    if (mqtt == null || !mqtt.isConnected) return;
+    try {
+      final payload = jsonEncode({
+        'type': 'command',
+        'command': 'app_trace',
+        'event': event,
+        'details': details,
+        'ts': DateTime.now().millisecondsSinceEpoch,
+      });
+      final builder = MqttClientPayloadBuilder();
+      builder.addString(payload);
+      mqtt.publishRaw('pailot/control/in', builder.payload!, MqttQos.atMostOnce);
+    } catch (_) {
+      // Non-fatal — don't let trace logging break the app
+    }
   }
 
   /// Clear all entries.

--
Gitblit v1.3.1