@@ -201,18 +201,12 @@ impl SessionStore {
201201 }
202202 // Distinguish between "no sessions at all" and "sessions exist but
203203 // all are empty" so the user gets a clear signal about what to do.
204- let has_any_session = self
205- . list_sessions ( ) ?
206- . iter ( )
207- . any ( |s| s. id != exclude)
208- || self
209- . scan_global_sessions ( ) ?
210- . iter ( )
211- . any ( |s| s. id != exclude) ;
204+ let has_any_session = self . list_sessions ( ) ?. iter ( ) . any ( |s| s. id != exclude)
205+ || self . scan_global_sessions ( ) ?. iter ( ) . any ( |s| s. id != exclude) ;
212206 if has_any_session {
213- return Err ( SessionControlError :: Format (
214- format_all_sessions_empty ( & self . sessions_root ) ,
215- ) ) ;
207+ return Err ( SessionControlError :: Format ( format_all_sessions_empty (
208+ & self . sessions_root ,
209+ ) ) ) ;
216210 }
217211 Err ( SessionControlError :: Format ( format_no_managed_sessions (
218212 & self . sessions_root ,
@@ -1308,7 +1302,10 @@ mod tests {
13081302
13091303 // when — latest_session should fail with the "all sessions empty" message
13101304 let result = store. latest_session ( ) ;
1311- assert ! ( result. is_err( ) , "latest_session should fail when all sessions are empty" ) ;
1305+ assert ! (
1306+ result. is_err( ) ,
1307+ "latest_session should fail when all sessions are empty"
1308+ ) ;
13121309 let err_msg = result. unwrap_err ( ) . to_string ( ) ;
13131310 assert ! (
13141311 err_msg. contains( "all sessions are empty" ) ,
@@ -1322,6 +1319,82 @@ mod tests {
13221319 fs:: remove_dir_all ( base) . expect ( "temp dir should clean up" ) ;
13231320 }
13241321
1322+ #[ test]
1323+ fn latest_session_excluding_skips_excluded_id_and_returns_previous ( ) {
1324+ // given — two sessions WITH messages, newest excluded
1325+ let base = temp_dir ( ) ;
1326+ fs:: create_dir_all ( & base) . expect ( "base dir should exist" ) ;
1327+ let store = SessionStore :: from_cwd ( & base) . expect ( "store should build" ) ;
1328+ let older = persist_session_via_store ( & store, "older work" ) ;
1329+ wait_for_next_millisecond ( ) ;
1330+ let newer = persist_session_via_store ( & store, "newer work" ) ;
1331+
1332+ // when — exclude the newest session
1333+ let latest = store
1334+ . latest_session_excluding ( Some ( & newer. session_id ) )
1335+ . expect ( "latest excluding newest should resolve" ) ;
1336+
1337+ // then — the older session wins because the newest is skipped
1338+ assert_eq ! (
1339+ latest. id, older. session_id,
1340+ "excluded id must be skipped, returning the previous session"
1341+ ) ;
1342+ fs:: remove_dir_all ( base) . expect ( "temp dir should clean up" ) ;
1343+ }
1344+
1345+ #[ test]
1346+ fn latest_session_filters_out_zero_message_sessions ( ) {
1347+ // given — one empty (0-message) session and one non-empty session
1348+ let base = temp_dir ( ) ;
1349+ fs:: create_dir_all ( & base) . expect ( "base dir should exist" ) ;
1350+ let store = SessionStore :: from_cwd ( & base) . expect ( "store should build" ) ;
1351+
1352+ let empty_handle = store. create_handle ( "empty-session" ) ;
1353+ Session :: new ( )
1354+ . with_persistence_path ( empty_handle. path . clone ( ) )
1355+ . save_to_path ( & empty_handle. path )
1356+ . expect ( "empty session should save" ) ;
1357+ wait_for_next_millisecond ( ) ;
1358+ let non_empty = persist_session_via_store ( & store, "real conversation" ) ;
1359+
1360+ // when
1361+ let latest = store. latest_session ( ) . expect ( "latest should resolve" ) ;
1362+
1363+ // then — the non-empty session wins; the 0-message one is filtered out
1364+ assert_eq ! (
1365+ latest. id, non_empty. session_id,
1366+ "0-message session must be filtered out, non-empty session wins"
1367+ ) ;
1368+ assert ! (
1369+ latest. message_count > 0 ,
1370+ "resolved session must have messages"
1371+ ) ;
1372+ fs:: remove_dir_all ( base) . expect ( "temp dir should clean up" ) ;
1373+ }
1374+
1375+ #[ test]
1376+ fn resolve_reference_excluding_latest_skips_excluded_id ( ) {
1377+ // given — two sessions WITH messages
1378+ let base = temp_dir ( ) ;
1379+ fs:: create_dir_all ( & base) . expect ( "base dir should exist" ) ;
1380+ let store = SessionStore :: from_cwd ( & base) . expect ( "store should build" ) ;
1381+ let older = persist_session_via_store ( & store, "older work" ) ;
1382+ wait_for_next_millisecond ( ) ;
1383+ let newer = persist_session_via_store ( & store, "newer work" ) ;
1384+
1385+ // when — resolve the "latest" alias while excluding the newest session
1386+ let handle = store
1387+ . resolve_reference_excluding ( "latest" , Some ( & newer. session_id ) )
1388+ . expect ( "latest alias excluding newest should resolve" ) ;
1389+
1390+ // then — the excluded id is skipped, so the older session resolves
1391+ assert_eq ! (
1392+ handle. id, older. session_id,
1393+ "excluded id must be skipped when resolving the latest alias"
1394+ ) ;
1395+ fs:: remove_dir_all ( base) . expect ( "temp dir should clean up" ) ;
1396+ }
1397+
13251398 #[ test]
13261399 fn session_exists_and_delete_are_scoped_to_workspace_store ( ) {
13271400 // given
0 commit comments