fix: use safe_truncate to truncate charactor (#3263) (#3264)

Signed-off-by: toyamagu2021@gmail.com <toyamagu2021@gmail.com>
This commit is contained in:
toyamagu-2021
2025-07-15 19:34:40 +09:00
committed by GitHub
parent c6225e38d0
commit d3beeace95
13 changed files with 46 additions and 52 deletions
+18 -21
View File
@@ -7,6 +7,7 @@
use crate::message::Message;
use crate::providers::base::Provider;
use crate::utils::safe_truncate;
use anyhow::Result;
use chrono::Local;
use etcetera::{choose_app_strategy, AppStrategy, AppStrategyArgs};
@@ -605,7 +606,7 @@ pub fn read_messages_with_truncation(
// Log details about corrupted lines (with limited detail for security)
for (num, line) in &corrupted_lines {
let preview = if line.len() > 50 {
format!("{}... (truncated)", &line[..50])
format!("{}... (truncated)", safe_truncate(line, 50))
} else {
line.clone()
};
@@ -678,11 +679,11 @@ fn truncate_message_content_in_place(message: &mut Message, max_content_size: us
for content in &mut message.content {
match content {
MessageContent::Text(text_content) => {
if text_content.text.len() > max_content_size {
if text_content.text.chars().count() > max_content_size {
let truncated = format!(
"{}\n\n[... content truncated during session loading from {} to {} characters ...]",
&text_content.text[..max_content_size.min(text_content.text.len())],
text_content.text.len(),
safe_truncate(&text_content.text, max_content_size),
text_content.text.chars().count(),
max_content_size
);
text_content.text = truncated;
@@ -693,11 +694,11 @@ fn truncate_message_content_in_place(message: &mut Message, max_content_size: us
for content_item in result {
match content_item {
Content::Text(ref mut text_content) => {
if text_content.text.len() > max_content_size {
if text_content.text.chars().count() > max_content_size {
let truncated = format!(
"{}\n\n[... tool response truncated during session loading from {} to {} characters ...]",
&text_content.text[..max_content_size.min(text_content.text.len())],
text_content.text.len(),
safe_truncate(&text_content.text, max_content_size),
text_content.text.chars().count(),
max_content_size
);
text_content.text = truncated;
@@ -707,11 +708,11 @@ fn truncate_message_content_in_place(message: &mut Message, max_content_size: us
if let ResourceContents::TextResourceContents { text, .. } =
&mut resource_content.resource
{
if text.len() > max_content_size {
if text.chars().count() > max_content_size {
let truncated = format!(
"{}\n\n[... resource content truncated during session loading from {} to {} characters ...]",
&text[..max_content_size.min(text.len())],
text.len(),
safe_truncate(text, max_content_size),
text.chars().count(),
max_content_size
);
*text = truncated;
@@ -751,7 +752,7 @@ fn attempt_corruption_recovery(json_str: &str, max_content_size: Option<usize>)
// Strategy 4: Create a placeholder message with the raw content
println!("[SESSION] All recovery strategies failed, creating placeholder message");
let preview = if json_str.len() > 200 {
format!("{}...", &json_str[..200])
format!("{}...", safe_truncate(json_str, 200))
} else {
json_str.to_string()
};
@@ -968,7 +969,7 @@ fn truncate_json_string(json_str: &str, max_content_size: usize) -> String {
if text_content.len() > max_content_size {
let truncated_text = format!(
"{}\n\n[... content truncated during JSON parsing from {} to {} characters ...]",
&text_content[..max_content_size.min(text_content.len())],
safe_truncate(text_content, max_content_size),
text_content.len(),
max_content_size
);
@@ -1269,11 +1270,7 @@ pub async fn generate_description_with_schedule_id(
.take(3) // Use up to first 3 user messages for context
.map(|m| {
let text = m.as_concat_text();
if text.len() > 300 {
format!("{}...", &text[..300])
} else {
text
}
safe_truncate(&text, 300)
})
.collect();
@@ -1302,9 +1299,9 @@ pub async fn generate_description_with_schedule_id(
let description = result.0.as_concat_text();
// Validate description length for security
let sanitized_description = if description.len() > 100 {
let sanitized_description = if description.chars().count() > 100 {
tracing::warn!("Generated description too long, truncating");
format!("{}...", &description[..97])
safe_truncate(&description, 100)
} else {
description
};
@@ -1379,9 +1376,9 @@ mod tests {
println!(
"[TEST] Input: {}",
if corrupt_json.len() > 100 {
&corrupt_json[..100]
safe_truncate(corrupt_json, 100)
} else {
corrupt_json
corrupt_json.to_string()
}
);