From efe7ae53cee3eae27c3fe81a921393ca276a7b60 Mon Sep 17 00:00:00 2001 From: Argenis Date: Sun, 15 Feb 2026 10:36:03 -0500 Subject: [PATCH] fix: use UTF-8 safe truncation in bootstrap file preview Fix panic when displaying workspace files containing multibyte UTF-8 characters by using char_indices().nth() to find safe character boundaries --- src/channels/mod.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/channels/mod.rs b/src/channels/mod.rs index 3f4b37a..061aa22 100644 --- a/src/channels/mod.rs +++ b/src/channels/mod.rs @@ -209,8 +209,18 @@ fn inject_workspace_file(prompt: &mut String, workspace_dir: &std::path::Path, f return; } let _ = writeln!(prompt, "### {filename}\n"); - if trimmed.len() > BOOTSTRAP_MAX_CHARS { - prompt.push_str(&trimmed[..BOOTSTRAP_MAX_CHARS]); + // Use character-boundary-safe truncation for UTF-8 + let truncated = if trimmed.chars().count() > BOOTSTRAP_MAX_CHARS { + trimmed + .char_indices() + .nth(BOOTSTRAP_MAX_CHARS) + .map(|(idx, _)| &trimmed[..idx]) + .unwrap_or(trimmed) + } else { + trimmed + }; + if truncated.len() < trimmed.len() { + prompt.push_str(truncated); let _ = writeln!( prompt, "\n\n[... truncated at {BOOTSTRAP_MAX_CHARS} chars — use `read` for full file]\n"