Matthias Nott
2026-03-23 78f101ac853aeea5d17067bec4215e070fc71fed
lib/services/mqtt_service.dart
....@@ -141,7 +141,8 @@
141141 client.keepAlivePeriod = 30;
142142 client.autoReconnect = false; // Don't auto-reconnect during trial — enable after success
143143 client.connectTimeoutPeriod = timeout;
144
- client.logging(on: true);
144
+ // client.maxConnectionAttempts is final — can't set it
145
+ client.logging(on: false);
145146
146147 client.onConnected = _onConnected;
147148 client.onDisconnected = _onDisconnected;
....@@ -407,7 +408,6 @@
407408 }
408409
409410 if (type == 'image' && sessionId != null) {
410
- // Image message
411411 _publish('pailot/$sessionId/in', {
412412 'msgId': _uuid(),
413413 'type': 'image',
....@@ -420,6 +420,34 @@
420420 return;
421421 }
422422
423
+ if (type == 'bundle' && sessionId != null) {
424
+ // Atomic multi-attachment message
425
+ _publish('pailot/$sessionId/in', {
426
+ 'msgId': _uuid(),
427
+ 'type': 'bundle',
428
+ 'sessionId': sessionId,
429
+ 'caption': message['caption'] ?? '',
430
+ if (message['audioBase64'] != null) 'audioBase64': message['audioBase64'],
431
+ 'attachments': message['attachments'] ?? [],
432
+ 'ts': _now(),
433
+ }, MqttQos.atLeastOnce);
434
+ return;
435
+ }
436
+
437
+ if (type == 'file' && sessionId != null) {
438
+ _publish('pailot/$sessionId/in', {
439
+ 'msgId': _uuid(),
440
+ 'type': 'file',
441
+ 'sessionId': sessionId,
442
+ 'fileBase64': message['fileBase64'] ?? '',
443
+ 'fileName': message['fileName'] ?? 'file',
444
+ 'mimeType': message['mimeType'] ?? 'application/octet-stream',
445
+ 'fileSize': message['fileSize'] ?? 0,
446
+ 'ts': _now(),
447
+ }, MqttQos.atLeastOnce);
448
+ return;
449
+ }
450
+
423451 if (type == 'tts' && sessionId != null) {
424452 // TTS request — route as command
425453 _publish('pailot/control/in', {