From 6954b78398ed30e479f8827d189a9e9265e85aa5 Mon Sep 17 00:00:00 2001 From: sungdark Date: Sat, 28 Mar 2026 08:27:01 +0000 Subject: [PATCH] fix: use char-aware truncation to prevent UTF-8 panics Fixes 3 byte-boundary panics in agent_cmd handlers when agent descriptions/prompts contain multi-byte UTF-8 characters (emojis, international text) near truncation boundaries. - list.rs: use chars().take(35) instead of byte slice [..35] - show.rs: use chars().take(500) instead of byte slice [..500] - generate.rs: use chars().take(500) instead of byte slice [..500] These panics crashed the entire CLI when users had emojis or non-ASCII characters in their agent descriptions/prompts. --- src/cortex-cli/src/agent_cmd/handlers/generate.rs | 6 +++--- src/cortex-cli/src/agent_cmd/handlers/list.rs | 4 ++-- src/cortex-cli/src/agent_cmd/handlers/show.rs | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cortex-cli/src/agent_cmd/handlers/generate.rs b/src/cortex-cli/src/agent_cmd/handlers/generate.rs index b3bbabd6..af23b9d6 100644 --- a/src/cortex-cli/src/agent_cmd/handlers/generate.rs +++ b/src/cortex-cli/src/agent_cmd/handlers/generate.rs @@ -117,11 +117,11 @@ pub async fn run_generate(args: CreateArgs) -> Result<()> { println!(" {}", "-".repeat(36)); // Show truncated prompt - let prompt_preview = if generated.system_prompt.len() > 500 { + let prompt_preview = if generated.system_prompt.chars().count() > 500 { format!( "{}...\n\n (truncated, {} chars total)", - &generated.system_prompt[..500], - generated.system_prompt.len() + generated.system_prompt.chars().take(500).collect::(), + generated.system_prompt.chars().count() ) } else { generated.system_prompt.clone() diff --git a/src/cortex-cli/src/agent_cmd/handlers/list.rs b/src/cortex-cli/src/agent_cmd/handlers/list.rs index d81f25d9..9bf79702 100644 --- a/src/cortex-cli/src/agent_cmd/handlers/list.rs +++ b/src/cortex-cli/src/agent_cmd/handlers/list.rs @@ -91,8 +91,8 @@ pub async fn run_list(args: ListArgs) -> Result<()> { .description .as_ref() .map(|d| { - if d.len() > 38 { - format!("{}...", &d[..35]) + if d.chars().count() > 38 { + format!("{}...", d.chars().take(35).collect::()) } else { d.clone() } diff --git a/src/cortex-cli/src/agent_cmd/handlers/show.rs b/src/cortex-cli/src/agent_cmd/handlers/show.rs index e77c2549..d572a894 100644 --- a/src/cortex-cli/src/agent_cmd/handlers/show.rs +++ b/src/cortex-cli/src/agent_cmd/handlers/show.rs @@ -136,11 +136,11 @@ pub async fn run_show(args: ShowArgs) -> Result<()> { if let Some(ref prompt) = agent.prompt { println!("\nSystem Prompt:"); println!("{}", "-".repeat(40)); - let preview = if prompt.len() > 500 { + let preview = if prompt.chars().count() > 500 { format!( "{}...\n\n(truncated, {} chars total)", - &prompt[..500], - prompt.len() + prompt.chars().take(500).collect::(), + prompt.chars().count() ) } else { prompt.clone()