pub fn join_text_blocks(blocks: &[ContentBlock]) -> String
Join text blocks with newlines; skip non-text.