diff --git a/src/tools/bash.rs b/src/tools/bash.rs index d2c1e85..9b9cd92 100644 --- a/src/tools/bash.rs +++ b/src/tools/bash.rs @@ -61,16 +61,22 @@ impl BashTool { } fn truncate_output(&self, output: &str) -> String { - if output.len() <= MAX_OUTPUT_CHARS { + let char_count = output.chars().count(); + if char_count <= MAX_OUTPUT_CHARS { return output.to_string(); } let half = MAX_OUTPUT_CHARS / 2; + let head: String = output.chars().take(half).collect(); + let tail: String = output + .chars() + .skip(char_count.saturating_sub(half)) + .collect(); format!( "{}...\n\n(... {} chars truncated ...)\n\n{}", - &output[..half], - output.len() - MAX_OUTPUT_CHARS, - &output[output.len() - half..] + head, + char_count - MAX_OUTPUT_CHARS, + tail ) } } @@ -312,4 +318,15 @@ mod tests { assert!(!result.success); assert!(result.error.unwrap().contains("timed out")); } + + #[test] + fn test_truncate_output_handles_utf8_char_boundaries() { + let tool = BashTool::new(); + let input = "全".repeat(MAX_OUTPUT_CHARS + 100); + + let output = tool.truncate_output(&input); + + assert!(output.contains("chars truncated")); + assert!(output.is_char_boundary(output.len())); + } }