fix(read_file): clamp end position instead of erroring when it exceeds file length
When read_file is called with an end position beyond the file length, instead of returning an error that forces a retry, now clamps to the actual file length and returns the content with an informative message. This eliminates wasteful retry cycles where the LLM had to make a second request with the corrected end position.
This commit is contained in:
@@ -110,13 +110,13 @@ pub async fn execute_read_file<W: UiWriter>(
|
||||
}
|
||||
|
||||
let user_end = end_char.unwrap_or(total_file_len);
|
||||
if user_end > total_file_len {
|
||||
return Ok(format!(
|
||||
"❌ End position {} exceeds file length {}",
|
||||
user_end,
|
||||
total_file_len
|
||||
));
|
||||
}
|
||||
// Clamp end position to file length (don't error, just read what's available)
|
||||
let (user_end, end_was_clamped) = if user_end > total_file_len {
|
||||
(total_file_len, true)
|
||||
} else {
|
||||
(user_end, false)
|
||||
};
|
||||
|
||||
if user_start > user_end {
|
||||
return Ok(format!(
|
||||
"❌ Start position {} is greater than end position {}",
|
||||
@@ -164,6 +164,12 @@ pub async fn execute_read_file<W: UiWriter>(
|
||||
"{}\n🔍 {} lines read (truncated, chars {}-{} of {}, context {}%)",
|
||||
partial_content, line_count, start_boundary, end_boundary, total_file_len, context_pct
|
||||
))
|
||||
} else if end_was_clamped {
|
||||
// End position exceeded file length, clamped to actual length
|
||||
Ok(format!(
|
||||
"{}\n🔍 {} lines read (chars {}-{}, end clamped from {} to file length {})",
|
||||
partial_content, line_count, start_boundary, end_boundary, end_char.unwrap(), total_file_len
|
||||
))
|
||||
} else if start_char.is_some() || end_char.is_some() {
|
||||
Ok(format!(
|
||||
"{}\n🔍 {} lines read (chars {}-{})",
|
||||
|
||||
Reference in New Issue
Block a user