from typing import Optional

def truncate_output(output: str, max_lines: Optional[int] = 5000) -> str:
    """Truncate output string to keep only the most recent lines if it exceeds max_lines.
    
    When truncation occurs, adds a message indicating how many lines were removed.
    Preserves original line endings and handles Unicode characters correctly.
    
    Args:
        output: The string output to potentially truncate
        max_lines: Maximum number of lines to keep (default: 5000)
        
    Returns:
        The truncated string if it exceeded max_lines, or the original string if not
    """
    # Handle empty output
    if not output:
        return ""
        
    # Set max_lines to default if None
    if max_lines is None:
        max_lines = 5000
        
    # Split while preserving line endings
    lines = output.splitlines(keepends=True)
    total_lines = len(lines)
    
    # Return original if under limit
    if total_lines <= max_lines:
        return output
        
    # Calculate lines to remove
    lines_removed = total_lines - max_lines
    
    # Keep only the most recent lines
    truncated_lines = lines[-max_lines:]
    
    # Add truncation message at start
    truncation_msg = f"[{lines_removed} lines of output truncated]\n"
    
    # Combine message with remaining lines
    return truncation_msg + "".join(truncated_lines)
