1+ use crate :: conversation:: message:: MessageMetadata ;
12use crate :: conversation:: Conversation ;
23use crate :: session:: Session ;
34use anyhow:: Result ;
@@ -70,6 +71,7 @@ pub fn load_session(session_name: &str, session_path: &Path) -> Result<Session>
7071 . or_insert ( serde_json:: json!( DateTime :: <Utc >:: from( modified_time) ) ) ;
7172 obj. entry ( "extension_data" ) . or_insert ( serde_json:: json!( { } ) ) ;
7273 obj. entry ( "message_count" ) . or_insert ( serde_json:: json!( 0 ) ) ;
74+ obj. entry ( "working_dir" ) . or_insert ( serde_json:: json!( "" ) ) ;
7375
7476 if let Some ( desc) = obj. get_mut ( "description" ) {
7577 if let Some ( desc_str) = desc. as_str ( ) {
@@ -85,8 +87,14 @@ pub fn load_session(session_name: &str, session_path: &Path) -> Result<Session>
8587 }
8688
8789 for line in lines. map_while ( Result :: ok) {
88- if let Ok ( message) = serde_json:: from_str ( & line) {
89- messages. push ( message) ;
90+ if let Ok ( mut message_json) = serde_json:: from_str :: < serde_json:: Value > ( & line) {
91+ if let Some ( obj) = message_json. as_object_mut ( ) {
92+ obj. entry ( "metadata" )
93+ . or_insert ( serde_json:: to_value ( MessageMetadata :: default ( ) ) ?) ;
94+ }
95+ if let Ok ( message) = serde_json:: from_value ( message_json) {
96+ messages. push ( message) ;
97+ }
9098 }
9199 }
92100
@@ -103,3 +111,31 @@ fn parse_session_timestamp(session_name: &str) -> Option<SystemTime> {
103111 . and_then ( |dt| Local . from_local_datetime ( & dt) . single ( ) )
104112 . map ( SystemTime :: from)
105113}
114+
115+ #[ cfg( test) ]
116+ mod tests {
117+ use super :: * ;
118+ use rmcp:: model:: Role ;
119+ use tempfile:: TempDir ;
120+
121+ #[ test]
122+ fn test_load_legacy_session_without_metadata ( ) {
123+ let temp_dir = TempDir :: new ( ) . unwrap ( ) ;
124+ let session_path = temp_dir. path ( ) . join ( "20240101_120000.jsonl" ) ;
125+
126+ let legacy_content = r#"{"description":"test","id":"20240101_120000","created_at":"2024-01-01T12:00:00Z","updated_at":"2024-01-01T12:00:00Z","extension_data":{},"message_count":0}
127+ {"id":"msg1","role":"user","created":1704110400,"content":[{"type":"text","text":"Hello"}]}
128+ {"id":"msg2","role":"assistant","created":1704110401,"content":[{"type":"text","text":"Hi there"}]}"# ;
129+
130+ fs:: write ( & session_path, legacy_content) . unwrap ( ) ;
131+
132+ let session = load_session ( "20240101_120000" , & session_path) . unwrap ( ) ;
133+
134+ assert_eq ! ( session. id, "20240101_120000" ) ;
135+ let conversation = session. conversation . as_ref ( ) . unwrap ( ) ;
136+ let messages = conversation. messages ( ) ;
137+ assert_eq ! ( messages. len( ) , 2 ) ;
138+ assert_eq ! ( messages[ 0 ] . role, Role :: User ) ;
139+ assert_eq ! ( messages[ 1 ] . role, Role :: Assistant ) ;
140+ }
141+ }
0 commit comments