diff --git a/codex-rs/cli/src/queue_cmd.rs b/codex-rs/cli/src/queue_cmd.rs index 9fa64e4633..df66a9fa62 100644 --- a/codex-rs/cli/src/queue_cmd.rs +++ b/codex-rs/cli/src/queue_cmd.rs @@ -144,6 +144,12 @@ fn queue_timer_success_message( async fn resolve_queue_thread_id(codex_home: &Path, target: &str) -> anyhow::Result { if let Ok(thread_id) = ThreadId::from_string(target) { + if codex_core::find_thread_path_by_id_str(codex_home, &thread_id.to_string()) + .await? + .is_none() + { + anyhow::bail!("no thread with id `{thread_id}`"); + } return Ok(thread_id.to_string()); } @@ -349,6 +355,40 @@ mod tests { ); } + #[tokio::test] + async fn queue_thread_id_requires_existing_thread() { + let temp = TempDir::new().expect("tempdir"); + let thread_id = ThreadId::new(); + let sessions_dir = temp + .path() + .join("sessions") + .join("2026") + .join("04") + .join("10"); + std::fs::create_dir_all(&sessions_dir).expect("create sessions dir"); + std::fs::write( + sessions_dir.join(format!("rollout-2026-04-10T12-00-00-{thread_id}.jsonl")), + "", + ) + .expect("write rollout"); + + assert_eq!( + resolve_queue_thread_id(temp.path(), &thread_id.to_string()) + .await + .expect("resolve"), + thread_id.to_string() + ); + + let missing = ThreadId::new(); + assert_eq!( + resolve_queue_thread_id(temp.path(), &missing.to_string()) + .await + .expect_err("missing id should fail") + .to_string(), + format!("no thread with id `{missing}`") + ); + } + #[tokio::test] async fn queue_thread_name_rejects_missing_and_ambiguous_names() { let temp = TempDir::new().expect("tempdir"); diff --git a/codex-rs/core/src/codex/timer_runtime.rs b/codex-rs/core/src/codex/timer_runtime.rs index e7fbf85e66..4c6461e1b1 100644 --- a/codex-rs/core/src/codex/timer_runtime.rs +++ b/codex-rs/core/src/codex/timer_runtime.rs @@ -186,7 +186,8 @@ impl Session { return Ok(deleted); }; if !deleted { - self.timers.lock().await.restore_runtime(runtime); + TimersState::cancel_runtime(&runtime); + self.emit_timer_updated_notification().await; return Ok(false); } TimersState::cancel_runtime(&runtime);