@@ -10,6 +10,7 @@ use crate::models::*;
1010use crate :: storage:: {
1111 CreateCheckpointRequest as StorageCreateCheckpointRequest ,
1212 CreateSessionRequest as StorageCreateSessionRequest ,
13+ UpdateSessionRequest as StorageUpdateSessionRequest ,
1314} ;
1415use async_trait:: async_trait;
1516use futures_util:: Stream ;
@@ -664,34 +665,17 @@ impl AgentClient {
664665 } ) ;
665666 }
666667
667- // Create new session
668- // Generate title with fallback - don't fail session creation if title generation fails
669- let title = match self . generate_session_title ( messages) . await {
670- Ok ( title) => title,
671- Err ( _) => {
672- // Extract first few words from user message as fallback title
673- messages
674- . iter ( )
675- . find ( |m| m. role == Role :: User )
676- . and_then ( |m| m. content . as_ref ( ) )
677- . map ( |c| {
678- let text = c. to_string ( ) ;
679- text. split_whitespace ( )
680- . take ( 5 )
681- . collect :: < Vec < _ > > ( )
682- . join ( " " )
683- } )
684- . unwrap_or_else ( || "New Session" . to_string ( ) )
685- }
686- } ;
668+ // Create new session with a fast local title.
669+ let fallback_title = Self :: fallback_session_title ( messages) ;
687670
688671 // Get current working directory
689672 let cwd = std:: env:: current_dir ( )
690673 . ok ( )
691674 . map ( |p| p. to_string_lossy ( ) . to_string ( ) ) ;
692675
693676 // Create session via storage trait
694- let mut session_request = StorageCreateSessionRequest :: new ( title, messages. to_vec ( ) ) ;
677+ let mut session_request =
678+ StorageCreateSessionRequest :: new ( fallback_title. clone ( ) , messages. to_vec ( ) ) ;
695679 if let Some ( cwd) = cwd {
696680 session_request = session_request. with_cwd ( cwd) ;
697681 }
@@ -702,13 +686,46 @@ impl AgentClient {
702686 . await
703687 . map_err ( |e| e. to_string ( ) ) ?;
704688
689+ // Generate a better title asynchronously and update the session when ready.
690+ let client = self . clone ( ) ;
691+ let messages_for_title = messages. to_vec ( ) ;
692+ let session_id = result. session_id ;
693+ tokio:: spawn ( async move {
694+ if let Ok ( title) = client. generate_session_title ( & messages_for_title) . await {
695+ let trimmed = title. trim ( ) ;
696+ if !trimmed. is_empty ( ) && trimmed != fallback_title {
697+ let request =
698+ StorageUpdateSessionRequest :: new ( ) . with_title ( trimmed. to_string ( ) ) ;
699+ let _ = client
700+ . session_storage
701+ . update_session ( session_id, & request)
702+ . await ;
703+ }
704+ }
705+ } ) ;
706+
705707 Ok ( SessionInfo {
706708 session_id : result. session_id ,
707709 checkpoint_id : result. checkpoint . id ,
708710 checkpoint_created_at : result. checkpoint . created_at ,
709711 } )
710712 }
711713
714+ fn fallback_session_title ( messages : & [ ChatMessage ] ) -> String {
715+ messages
716+ . iter ( )
717+ . find ( |m| m. role == Role :: User )
718+ . and_then ( |m| m. content . as_ref ( ) )
719+ . map ( |c| {
720+ let text = c. to_string ( ) ;
721+ text. split_whitespace ( )
722+ . take ( 5 )
723+ . collect :: < Vec < _ > > ( )
724+ . join ( " " )
725+ } )
726+ . unwrap_or_else ( || "New Session" . to_string ( ) )
727+ }
728+
712729 /// Save a new checkpoint for the current session
713730 pub ( crate ) async fn save_checkpoint (
714731 & self ,
0 commit comments