@@ -25,6 +25,7 @@ pub struct Repl {
2525 max_tokens : u32 ,
2626 recursion_depth : u32 ,
2727 session_id : String ,
28+ display_messages : Vec < crate :: history:: DisplayMessage > ,
2829}
2930
3031impl Repl {
@@ -62,6 +63,7 @@ impl Repl {
6263 max_tokens,
6364 recursion_depth : 0 ,
6465 session_id,
66+ display_messages : Vec :: new ( ) ,
6567 } )
6668 }
6769
@@ -93,6 +95,7 @@ impl Repl {
9395 }
9496 "clear" => {
9597 self . conversation . clear ( ) ;
98+ self . display_messages . clear ( ) ;
9699 self . session_id = HistoryManager :: generate_session_id ( ) ;
97100 println ! ( "{}" , "Conversation history cleared." . bright_yellow( ) ) ;
98101 continue ;
@@ -150,6 +153,11 @@ impl Repl {
150153
151154 fn process_message ( & mut self , user_input : & str ) -> Result < ( ) > {
152155 self . conversation . add_user_message ( user_input. to_string ( ) ) ;
156+
157+ // Track display message
158+ self . display_messages . push ( crate :: history:: DisplayMessage :: UserMessage {
159+ content : user_input. to_string ( ) ,
160+ } ) ;
153161
154162 let request = CreateMessageRequest {
155163 model : self . model . clone ( ) ,
@@ -230,6 +238,12 @@ impl Repl {
230238 println ! ( "{}" , highlighted) ;
231239 }
232240 println ! ( ) ;
241+
242+ // Track assistant display message
243+ let combined_text = text_output. join ( "\n " ) ;
244+ self . display_messages . push ( crate :: history:: DisplayMessage :: AssistantMessage {
245+ content : combined_text,
246+ } ) ;
233247 }
234248
235249 // Store the full assistant response with content blocks
@@ -291,6 +305,13 @@ impl Repl {
291305
292306 println ! ( "{}" , output. dimmed( ) ) ;
293307 println ! ( ) ;
308+
309+ // Track tool execution in display_messages
310+ self . display_messages . push ( crate :: history:: DisplayMessage :: ToolExecution {
311+ tool_name : tool_name. clone ( ) ,
312+ tool_input : tool_input. clone ( ) ,
313+ tool_output : output. clone ( ) ,
314+ } ) ;
294315
295316 // Collect tool result instead of adding immediately
296317 tool_results. push ( crate :: api:: MessageContentBlock :: ToolResult {
@@ -315,6 +336,13 @@ impl Repl {
315336 let error_msg = format ! ( "Tool execution failed: {}" , e) ;
316337 eprintln ! ( "{} {}" , "Error:" . bright_red( ) . bold( ) , error_msg) ;
317338 println ! ( ) ;
339+
340+ // Track tool execution error in display_messages
341+ self . display_messages . push ( crate :: history:: DisplayMessage :: ToolExecution {
342+ tool_name : tool_name. clone ( ) ,
343+ tool_input : tool_input. clone ( ) ,
344+ tool_output : error_msg. clone ( ) ,
345+ } ) ;
318346
319347 // Collect error as tool result
320348 tool_results. push ( crate :: api:: MessageContentBlock :: ToolResult {
@@ -543,6 +571,7 @@ impl Repl {
543571 self . history_manager . save_session (
544572 & self . session_id ,
545573 self . conversation . messages ( ) ,
574+ & self . display_messages ,
546575 self . conversation . system_prompt ( ) ,
547576 ) ?;
548577
@@ -577,15 +606,74 @@ impl Repl {
577606
578607 self . session_id = session. id . clone ( ) ;
579608 self . conversation . clear ( ) ;
580- self . conversation . restore_messages ( session. messages . clone ( ) ) ;
609+ self . conversation . restore_messages ( session. api_messages . clone ( ) ) ;
610+ self . display_messages = session. display_messages . clone ( ) ;
581611
582612 println ! (
583613 "{} {} ({} messages)" ,
584614 "Loaded session:" . bright_green( ) ,
585615 session. id,
586- session. messages . len( )
616+ session. api_messages . len( )
587617 ) ;
618+ println ! ( ) ;
619+
620+ // Display the original conversation
621+ self . display_session ( & session) ;
588622
589623 Ok ( ( ) )
590624 }
625+
626+ fn display_session ( & self , session : & crate :: history:: Session ) {
627+ if session. display_messages . is_empty ( ) {
628+ println ! ( "{}" , "Note: This is a legacy session without display history. Only API messages are available." . dimmed( ) ) ;
629+ println ! ( ) ;
630+ return ;
631+ }
632+
633+ println ! ( "{}" , "═" . repeat( 80 ) . bright_cyan( ) ) ;
634+ println ! ( "{}" , "Previous Conversation:" . bright_cyan( ) . bold( ) ) ;
635+ println ! ( "{}" , "═" . repeat( 80 ) . bright_cyan( ) ) ;
636+ println ! ( ) ;
637+
638+ for display_msg in & session. display_messages {
639+ match display_msg {
640+ crate :: history:: DisplayMessage :: UserMessage { content } => {
641+ println ! ( "{} {}" , ">>>" . bright_green( ) , content) ;
642+ println ! ( ) ;
643+ }
644+ crate :: history:: DisplayMessage :: AssistantMessage { content } => {
645+ println ! ( "{}" , "Assistant:" . bright_blue( ) . bold( ) ) ;
646+ let highlighted = self . highlighter . highlight_text ( content) ;
647+ println ! ( "{}" , highlighted) ;
648+ println ! ( ) ;
649+ }
650+ crate :: history:: DisplayMessage :: ToolExecution { tool_name, tool_input : _, tool_output } => {
651+ if tool_name == "execute_bash" {
652+ if let Ok ( input_val) = serde_json:: from_value :: < serde_json:: Value > (
653+ serde_json:: to_value ( & tool_output) . unwrap_or_default ( )
654+ ) {
655+ if let Some ( command) = input_val. get ( "command" ) . and_then ( |v| v. as_str ( ) ) {
656+ println ! (
657+ "{} {}" ,
658+ "Executing:" . bright_green( ) . bold( ) ,
659+ command. bright_cyan( )
660+ ) ;
661+ }
662+ }
663+ } else {
664+ println ! (
665+ "{} {}" ,
666+ "Using tool:" . bright_yellow( ) . bold( ) ,
667+ tool_name. bright_yellow( )
668+ ) ;
669+ }
670+ println ! ( "{}" , tool_output. dimmed( ) ) ;
671+ println ! ( ) ;
672+ }
673+ }
674+ }
675+
676+ println ! ( "{}" , "═" . repeat( 80 ) . bright_cyan( ) ) ;
677+ println ! ( ) ;
678+ }
591679}
0 commit comments