@@ -200,13 +200,7 @@ func (s *Agent) Init(ctx context.Context) error {
200200 }
201201
202202 if session , ok := s .ChatMessageStore .(* sessions.Session ); ok {
203- metadata , err := session .LoadMetadata ()
204- if err != nil {
205- return fmt .Errorf ("failed to load session metadata: %w" , err )
206- }
207- s .session .ID = session .ID
208- s .session .CreatedAt = metadata .CreatedAt
209- s .session .LastModified = metadata .LastAccessed
203+ s .loadSession (session .ID )
210204 } else {
211205 s .session .ID = uuid .New ().String ()
212206 s .session .CreatedAt = time .Now ()
@@ -747,36 +741,62 @@ func (c *Agent) handleMetaQuery(ctx context.Context, query string) (answer strin
747741 return "Invalid command. Usage: resume-session <session_id>" , true , nil
748742 }
749743 sessionID := parts [1 ]
750-
751- manager , err := sessions .NewSessionManager ()
752- if err != nil {
753- return "" , false , fmt .Errorf ("failed to create session manager: %w" , err )
744+ if err := c .loadSession (sessionID ); err != nil {
745+ return "" , false , err
754746 }
747+ return fmt .Sprintf ("Resumed session %s." , sessionID ), true , nil
748+ }
755749
756- session , err := manager .FindSessionByID (sessionID )
750+ return "" , false , nil
751+ }
752+
753+ // loadSession loads a session by ID (or latest), updates the agent's state, and re-initializes the chat.
754+ func (c * Agent ) loadSession (sessionID string ) error {
755+ manager , err := sessions .NewSessionManager ()
756+ if err != nil {
757+ return fmt .Errorf ("failed to create session manager: %w" , err )
758+ }
759+
760+ var session * sessions.Session
761+ if sessionID == "" || sessionID == "latest" {
762+ s , err := manager .GetLatestSession ()
757763 if err != nil {
758- return "" , false , fmt .Errorf ("failed to get session: %w" , err )
764+ return fmt .Errorf ("failed to get latest session: %w" , err )
759765 }
760-
761- c .sessionMu .Lock ()
762- c .ChatMessageStore = session
763- c .session .ChatMessageStore = session
764- c .session .Messages = session .ChatMessages ()
765- metadata , err := session .LoadMetadata ()
766+ if s == nil {
767+ // This can happen if GetLatestSession returns nil, nil (no sessions exist)
768+ return fmt .Errorf ("no sessions found to resume" )
769+ }
770+ session = s
771+ } else {
772+ s , err := manager .FindSessionByID (sessionID )
766773 if err != nil {
767- c .sessionMu .Unlock ()
768- return "" , false , fmt .Errorf ("failed to load session metadata: %w" , err )
774+ return fmt .Errorf ("failed to get session %q: %w" , sessionID , err )
769775 }
770- c .session .ID = session .ID
771- c .session .CreatedAt = metadata .CreatedAt
772- c .session .LastModified = metadata .LastAccessed
773- c .llmChat .Initialize (c .session .ChatMessageStore .ChatMessages ())
774- c .sessionMu .Unlock ()
776+ session = s
777+ }
775778
776- return fmt .Sprintf ("Resumed session %s." , sessionID ), true , nil
779+ c .sessionMu .Lock ()
780+ defer c .sessionMu .Unlock ()
781+
782+ c .ChatMessageStore = session
783+ c .session .ChatMessageStore = session
784+ c .session .Messages = session .ChatMessages ()
785+ metadata , err := session .LoadMetadata ()
786+ if err != nil {
787+ return fmt .Errorf ("failed to load session metadata: %w" , err )
777788 }
789+ c .session .ID = session .ID
790+ c .session .CreatedAt = metadata .CreatedAt
791+ c .session .LastModified = metadata .LastAccessed
778792
779- return "" , false , nil
793+ if c .llmChat != nil {
794+ if err := c .llmChat .Initialize (c .session .ChatMessageStore .ChatMessages ()); err != nil {
795+ return fmt .Errorf ("failed to re-initialize chat with new session: %w" , err )
796+ }
797+ }
798+
799+ return nil
780800}
781801
782802func (c * Agent ) listModels (ctx context.Context ) ([]string , error ) {
0 commit comments