Fix UTF-8 panics and inconsistent retry logic
- Fix 7 UTF-8 byte slicing panics that crash on multi-byte characters:
- acd.rs: extract_topic_from_text() [..50] slice
- streaming.rs: log_stream_error() [..500] slice
- tools/acd.rs: rehydrate message truncation [..2000] slice
- history.rs: git commit message truncation [..69] slice
- planner.rs: commit summary/description truncation [..69] slices
- llm.rs: requirements summary line truncation [..117] slice
- All now use chars().count() and chars().take(N).collect() for
UTF-8 safe truncation
- Fix inconsistent retry logic in task_execution.rs:
- Previously only retried on Timeout errors
- Now retries on ALL recoverable errors (rate limits, network,
server errors, model busy, token limits, context length)
- Added error-specific base delays (rate limit: 5s, server: 2s, etc.)
- Added exponential backoff with ±20% jitter
- Consistent with autonomous mode retry behavior
This commit is contained in:
@@ -335,12 +335,13 @@ fn extract_topic_from_text(text: &str) -> String {
|
||||
let first_line = text.lines().next().unwrap_or("");
|
||||
let cleaned = first_line.trim();
|
||||
|
||||
if cleaned.len() <= 50 {
|
||||
if cleaned.chars().count() <= 50 {
|
||||
cleaned.to_string()
|
||||
} else {
|
||||
// Find a good break point
|
||||
let truncated = &cleaned[..50];
|
||||
// Find a good break point (UTF-8 safe)
|
||||
let truncated: String = cleaned.chars().take(50).collect();
|
||||
if let Some(last_space) = truncated.rfind(' ') {
|
||||
// last_space is a byte index into truncated, which is safe since truncated is a new String
|
||||
format!("{}...", &truncated[..last_space])
|
||||
} else {
|
||||
format!("{}...", truncated)
|
||||
|
||||
Reference in New Issue
Block a user