From fe77c2a688da94057fe95a115d50857a2432a237 Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Sat, 9 May 2026 16:18:58 -0400 Subject: [PATCH] fix(sandbox): hide Daytona terminal control frames --- lib/crates/fabro-sandbox/src/terminal.rs | 29 ++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/lib/crates/fabro-sandbox/src/terminal.rs b/lib/crates/fabro-sandbox/src/terminal.rs index 533cdacf7..939b18203 100644 --- a/lib/crates/fabro-sandbox/src/terminal.rs +++ b/lib/crates/fabro-sandbox/src/terminal.rs @@ -294,6 +294,9 @@ mod daytona_terminal { match message { Ok(ProviderMessage::Binary(bytes)) => return Ok(Some(bytes.to_vec())), Ok(ProviderMessage::Text(text)) => { + if is_daytona_terminal_control_text(text.as_str()) { + continue; + } return Ok(Some(text.as_str().as_bytes().to_vec())); } Ok(ProviderMessage::Close(_)) @@ -505,6 +508,17 @@ mod daytona_terminal { format!("fabro-terminal-{:016x}", rand::rng().random::()) } + fn is_daytona_terminal_control_text(text: &str) -> bool { + let Ok(value) = serde_json::from_str::(text) else { + return false; + }; + value + .as_object() + .and_then(|object| object.get("type")) + .and_then(serde_json::Value::as_str) + == Some("control") + } + fn daytona_ws_request( ws_url: &str, api_key: &str, @@ -640,6 +654,21 @@ mod daytona_terminal { ); proxy.assert_async().await; } + + #[test] + fn identifies_daytona_terminal_control_text() { + assert!(is_daytona_terminal_control_text( + r#"{"status":"connected","type":"control"}"# + )); + assert!(is_daytona_terminal_control_text( + r#"{"type":"control","status":"resized"}"# + )); + assert!(!is_daytona_terminal_control_text("hello\n")); + assert!(!is_daytona_terminal_control_text( + r#"{"type":"output","text":"hello"}"# + )); + assert!(!is_daytona_terminal_control_text("{")); + } } }