diff --git a/codex-rs/core/tests/suite/sqlite_state.rs b/codex-rs/core/tests/suite/sqlite_state.rs index 19c06b6b58..8ee65d89dc 100644 --- a/codex-rs/core/tests/suite/sqlite_state.rs +++ b/codex-rs/core/tests/suite/sqlite_state.rs @@ -301,6 +301,18 @@ async fn thread_rename_updates_state_db_name() -> Result<()> { let thread_id = test.session_configured.session_id; let new_name = "renamed thread"; + let mut metadata = None; + for _ in 0..100 { + metadata = db.get_thread(thread_id).await?; + if metadata.is_some() { + break; + } + tokio::time::sleep(Duration::from_millis(25)).await; + } + let metadata = metadata.expect("thread should exist in state db"); + let previous_updated_at = metadata.updated_at; + + tokio::time::sleep(Duration::from_secs(1)).await; test.codex .submit(Op::SetThreadName { name: new_name.to_string(), @@ -325,6 +337,10 @@ async fn thread_rename_updates_state_db_name() -> Result<()> { let metadata = metadata.expect("thread should exist in state db"); assert_eq!(metadata.name, new_name); + assert!( + metadata.updated_at > previous_updated_at, + "expected updated_at to bump after rename" + ); Ok(()) } diff --git a/codex-rs/state/src/runtime.rs b/codex-rs/state/src/runtime.rs index fad7311ae6..7acefabc2b 100644 --- a/codex-rs/state/src/runtime.rs +++ b/codex-rs/state/src/runtime.rs @@ -394,8 +394,10 @@ ON CONFLICT(id) DO UPDATE SET /// Update the thread name for an existing thread. pub async fn update_thread_name(&self, thread_id: ThreadId, name: &str) -> anyhow::Result<()> { - sqlx::query("UPDATE threads SET name = ? WHERE id = ?") + let updated_at = datetime_to_epoch_seconds(Utc::now()); + sqlx::query("UPDATE threads SET name = ?, updated_at = ? WHERE id = ?") .bind(name) + .bind(updated_at) .bind(thread_id.to_string()) .execute(self.pool.as_ref()) .await?;