diff --git a/flutter/lib/models/terminal_model.dart b/flutter/lib/models/terminal_model.dart index cd7167805..8961d2dd8 100644 --- a/flutter/lib/models/terminal_model.dart +++ b/flutter/lib/models/terminal_model.dart @@ -288,7 +288,8 @@ class TerminalModel with ChangeNotifier { // On reconnect, the server may replay recent output. That replay can include // terminal queries like DSR/DA; xterm answers them through onOutput as // "^[[1;1R^[[2;2R^[[>0;0;0c", which must not be sent back to the peer. - _suppressNextTerminalDataOutput = + final replayTerminalOutput = evt['replay_terminal_output']; + _suppressNextTerminalDataOutput = replayTerminalOutput == true || message == 'Reconnected to existing terminal with pending output'; // Fallback: if terminal view is not yet ready but already has valid diff --git a/src/flutter.rs b/src/flutter.rs index c7e07f892..f8b04bf6c 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -1135,6 +1135,10 @@ impl InvokeUiSession for FlutterHandler { ("message", json!(&opened.message)), ("pid", json!(opened.pid)), ("service_id", json!(&opened.service_id)), + ( + "replay_terminal_output", + json!(opened.replay_terminal_output), + ), ]; if !opened.persistent_sessions.is_empty() { event_data.push(("persistent_sessions", json!(opened.persistent_sessions))); diff --git a/src/server/terminal_service.rs b/src/server/terminal_service.rs index 6aceabba1..973a399a0 100644 --- a/src/server/terminal_service.rs +++ b/src/server/terminal_service.rs @@ -1118,6 +1118,7 @@ impl TerminalServiceProxy { }; opened.pid = session.pid; opened.service_id = self.service_id.clone(); + opened.replay_terminal_output = has_pending; if service.needs_session_sync { if service.sessions.len() > 1 { // No need to include the current terminal in the list.