@@ -133,7 +133,7 @@ pub(crate) enum HistoryCell {
133
133
PatchApplyResult { view : TextBlock } ,
134
134
}
135
135
136
- const TOOL_CALL_MAX_LINES : usize = 3 ;
136
+ const TOOL_CALL_MAX_LINES : usize = 5 ;
137
137
138
138
fn title_case ( s : & str ) -> String {
139
139
if s. is_empty ( ) {
@@ -194,6 +194,48 @@ impl HistoryCell {
194
194
. unwrap_or ( 0 )
195
195
}
196
196
197
+ fn output_lines ( src : & str ) -> Vec < Line < ' static > > {
198
+ let lines: Vec < & str > = src. lines ( ) . collect ( ) ;
199
+ let total = lines. len ( ) ;
200
+ let limit = TOOL_CALL_MAX_LINES ;
201
+
202
+ let mut out = Vec :: new ( ) ;
203
+
204
+ let head_end = total. min ( limit) ;
205
+ for ( i, raw) in lines[ ..head_end] . iter ( ) . enumerate ( ) {
206
+ let mut line = ansi_escape_line ( raw) ;
207
+ let prefix = if i == 0 { " ⎿ " } else { " " } ;
208
+ line. spans . insert ( 0 , prefix. into ( ) ) ;
209
+ line. spans . iter_mut ( ) . for_each ( |span| {
210
+ span. style = span. style . add_modifier ( Modifier :: DIM ) ;
211
+ } ) ;
212
+ out. push ( line) ;
213
+ }
214
+
215
+ // If we will ellipsize less than the limit, just show it.
216
+ let show_ellipsis = total > 2 * limit;
217
+ if show_ellipsis {
218
+ let omitted = total - 2 * limit;
219
+ out. push ( Line :: from ( format ! ( "… +{omitted} lines" ) ) ) ;
220
+ }
221
+
222
+ let tail_start = if show_ellipsis {
223
+ total - limit
224
+ } else {
225
+ head_end
226
+ } ;
227
+ for raw in lines[ tail_start..] . iter ( ) {
228
+ let mut line = ansi_escape_line ( raw) ;
229
+ line. spans . insert ( 0 , " " . into ( ) ) ;
230
+ line. spans . iter_mut ( ) . for_each ( |span| {
231
+ span. style = span. style . add_modifier ( Modifier :: DIM ) ;
232
+ } ) ;
233
+ out. push ( line) ;
234
+ }
235
+
236
+ out
237
+ }
238
+
197
239
pub ( crate ) fn new_session_info (
198
240
config : & Config ,
199
241
event : SessionConfiguredEvent ,
@@ -308,27 +350,7 @@ impl HistoryCell {
308
350
}
309
351
310
352
let src = if exit_code == 0 { stdout } else { stderr } ;
311
-
312
- let mut lines_iter = src. lines ( ) ;
313
- for ( idx, raw) in lines_iter. by_ref ( ) . take ( TOOL_CALL_MAX_LINES ) . enumerate ( ) {
314
- let mut line = ansi_escape_line ( raw) ;
315
- let prefix = if idx == 0 { " ⎿ " } else { " " } ;
316
- line. spans . insert ( 0 , prefix. into ( ) ) ;
317
- line. spans . iter_mut ( ) . for_each ( |span| {
318
- span. style = span. style . add_modifier ( Modifier :: DIM ) ;
319
- } ) ;
320
- lines. push ( line) ;
321
- }
322
- let remaining = lines_iter. count ( ) ;
323
- if remaining > 0 {
324
- let mut more = Line :: from ( format ! ( "... +{remaining} lines" ) ) ;
325
- // Continuation/ellipsis is treated as a subsequent line for prefixing
326
- more. spans . insert ( 0 , " " . into ( ) ) ;
327
- more. spans . iter_mut ( ) . for_each ( |span| {
328
- span. style = span. style . add_modifier ( Modifier :: DIM ) ;
329
- } ) ;
330
- lines. push ( more) ;
331
- }
353
+ lines. extend ( Self :: output_lines ( & src) ) ;
332
354
lines. push ( Line :: from ( "" ) ) ;
333
355
334
356
HistoryCell :: CompletedExecCommand {
@@ -813,17 +835,7 @@ impl HistoryCell {
813
835
lines. push ( Line :: from ( "✘ Failed to apply patch" . magenta ( ) . bold ( ) ) ) ;
814
836
815
837
if !stderr. trim ( ) . is_empty ( ) {
816
- let mut iter = stderr. lines ( ) ;
817
- for ( i, raw) in iter. by_ref ( ) . take ( TOOL_CALL_MAX_LINES ) . enumerate ( ) {
818
- let prefix = if i == 0 { " ⎿ " } else { " " } ;
819
- let s = format ! ( "{prefix}{raw}" ) ;
820
- lines. push ( ansi_escape_line ( & s) . dim ( ) ) ;
821
- }
822
- let remaining = iter. count ( ) ;
823
- if remaining > 0 {
824
- lines. push ( Line :: from ( "" ) ) ;
825
- lines. push ( Line :: from ( format ! ( "... +{remaining} lines" ) ) . dim ( ) ) ;
826
- }
838
+ lines. extend ( Self :: output_lines ( & stderr) ) ;
827
839
}
828
840
829
841
lines. push ( Line :: from ( "" ) ) ;
0 commit comments