From 8e246c852fbd400eb2bd221cd4d2d53404822136 Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Wed, 29 Apr 2026 00:38:43 -0700 Subject: [PATCH] codex: address PR review feedback (#20158) --- codex-rs/tui/src/session_resume.rs | 48 ++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/codex-rs/tui/src/session_resume.rs b/codex-rs/tui/src/session_resume.rs index b4a4c04b96..169a096d1e 100644 --- a/codex-rs/tui/src/session_resume.rs +++ b/codex-rs/tui/src/session_resume.rs @@ -154,28 +154,20 @@ async fn read_rollout_resume_state(path: &Path) -> io::Result(trimmed) else { + continue; + }; saw_record = true; - let record = serde_json::from_str::(trimmed).map_err(|err| { - io::Error::other(format!( - "failed to parse rollout line in {}: {err}", - path.display() - )) - })?; let Some(payload) = record.payload else { continue; }; match record.item_type.as_str() { "session_meta" if state.thread_id.is_none() => { - let metadata = - serde_json::from_value::(payload).map_err(|err| { - io::Error::other(format!( - "failed to parse session metadata in {}: {err}", - path.display() - )) - })?; - state.thread_id = Some(metadata.id); - state.cwd.get_or_insert(metadata.cwd); + if let Ok(metadata) = serde_json::from_value::(payload) { + state.thread_id = Some(metadata.id); + state.cwd.get_or_insert(metadata.cwd); + } } "turn_context" => { if let Ok(turn_context) = serde_json::from_value::(payload) @@ -293,4 +285,30 @@ mod tests { assert_eq!(state.model, None); Ok(()) } + + #[tokio::test] + async fn rollout_resume_state_skips_malformed_lines() -> std::io::Result<()> { + let temp_dir = TempDir::new()?; + let thread_id = ThreadId::new(); + let cwd = temp_dir.path().join("session"); + let rollout_path = temp_dir.path().join("rollout.jsonl"); + let valid_line = serde_json::to_string(&rollout_line( + "t0", + "session_meta", + serde_json::json!({ + "id": thread_id, + "cwd": cwd.clone(), + "originator": "test", + "cli_version": "test", + }), + )) + .expect("serialize rollout line"); + std::fs::write(&rollout_path, format!("{valid_line}\n{{"))?; + + let state = read_rollout_resume_state(&rollout_path).await?; + + assert_eq!(state.thread_id, Some(thread_id)); + assert_eq!(state.cwd, Some(cwd)); + Ok(()) + } }