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