@ -44,7 +44,7 @@ fn content_preview(entry: &crate::models::session::RawEntry, max_len: usize) ->
/// Render a single entry to stdout in human-readable text format.
/// Render a single entry to stdout in human-readable text format.
///
///
/// Thinking blocks are shown only when `opts.include.thinking` is set.
/// Thinking blocks are shown only when `opts.include.thinking` is set.
/// Tool result blocks are shown only when `opts.include.output` is set .
/// Tool result blocks are always shown, truncated to 200 chars unless `opts.verbose` .
fn render_entry_text ( entry : & crate ::models ::session ::RawEntry , opts : & crate ::cli ::GlobalOpts ) {
fn render_entry_text ( entry : & crate ::models ::session ::RawEntry , opts : & crate ::cli ::GlobalOpts ) {
let Some ( msg ) = & entry . message else { return } ;
let Some ( msg ) = & entry . message else { return } ;
let role = msg . role . as_deref ( ) . unwrap_or ( "?" ) ;
let role = msg . role . as_deref ( ) . unwrap_or ( "?" ) ;
@ -74,7 +74,6 @@ fn render_entry_text(entry: &crate::models::session::RawEntry, opts: &crate::cli
crate ::models ::session ::ContentBlock ::ToolResult {
crate ::models ::session ::ContentBlock ::ToolResult {
content , is_error , ..
content , is_error , ..
} = > {
} = > {
if opts . include . output {
let err_flag = if is_error . unwrap_or ( false ) {
let err_flag = if is_error . unwrap_or ( false ) {
" (error)"
" (error)"
} else {
} else {
@ -86,6 +85,9 @@ fn render_entry_text(entry: &crate::models::session::RawEntry, opts: &crate::cli
. unwrap_or_else ( | | {
. unwrap_or_else ( | | {
content . as_ref ( ) . map ( | c | c . to_string ( ) ) . unwrap_or_default ( )
content . as_ref ( ) . map ( | c | c . to_string ( ) ) . unwrap_or_default ( )
} ) ;
} ) ;
if opts . verbose {
println! ( "[tool_result{err_flag}]: {preview}" ) ;
} else {
let boundary = preview . floor_char_boundary ( 200 ) ;
let boundary = preview . floor_char_boundary ( 200 ) ;
let short = & preview [ .. boundary ] ;
let short = & preview [ .. boundary ] ;
println! ( "[tool_result{err_flag}]: {short}" ) ;
println! ( "[tool_result{err_flag}]: {short}" ) ;
@ -696,9 +698,9 @@ mod tests {
render_entry_text ( & entry , & opts ) ; // must not panic
render_entry_text ( & entry , & opts ) ; // must not panic
}
}
/// `render_entry_text` does not panic when tool results are present but gated off .
/// `render_entry_text` always shows tool results (truncated by default) without panicking .
#[ test ]
#[ test ]
fn render_entry_text_tool_result_ gated ( ) {
fn render_entry_text_tool_result_ always_shown ( ) {
let entry = make_raw_entry (
let entry = make_raw_entry (
"user" ,
"user" ,
"user" ,
"user" ,
@ -708,7 +710,7 @@ mod tests {
is_error : Some ( false ) ,
is_error : Some ( false ) ,
} ] ) ,
} ] ) ,
) ;
) ;
let opts = default_opts ( ) ;
let opts = default_opts ( ) ; // verbose = false → truncated at 200 chars
render_entry_text ( & entry , & opts ) ; // must not panic
render_entry_text ( & entry , & opts ) ; // must not panic
}
}
}
}