Merge remote-tracking branch 'origin/rhan/surface-updates' into codex/emittance-mergefix

# Conflicts:
#	codex-rs/core/tests/suite/items.rs
This commit is contained in:
Roy Han
2026-03-19 23:24:03 -07:00
294 changed files with 8726 additions and 1774 deletions

View File

@@ -42,6 +42,8 @@ use core_test_support::wait_for_event_match;
use pretty_assertions::assert_eq;
use serde_json::Value;
use serde_json::json;
use std::path::Path;
use std::path::PathBuf;
use tempfile::tempdir;
use tokio::time::Duration;
use tokio::time::Instant;
@@ -68,6 +70,30 @@ fn user_message_item_by_text<'a>(input: &'a [Value], text: &str) -> &'a Value {
.unwrap_or_else(|| panic!("submitted user message input item not found for text: {text}"))
}
fn image_generation_artifact_path(codex_home: &Path, session_id: &str, call_id: &str) -> PathBuf {
fn sanitize(value: &str) -> String {
let mut sanitized: String = value
.chars()
.map(|ch| {
if ch.is_ascii_alphanumeric() || ch == '-' || ch == '_' {
ch
} else {
'_'
}
})
.collect();
if sanitized.is_empty() {
sanitized = "generated_image".to_string();
}
sanitized
}
codex_home
.join("generated_images")
.join(sanitize(session_id))
.join(format!("{}.png", sanitize(call_id)))
}
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
async fn user_message_item_is_emitted() -> anyhow::Result<()> {
skip_if_no_network!(Ok(()));
@@ -523,9 +549,18 @@ async fn image_generation_call_event_is_emitted() -> anyhow::Result<()> {
let server = start_mock_server().await;
let TestCodex { codex, .. } = test_codex().build(&server).await?;
let TestCodex {
codex,
config,
session_configured,
..
} = test_codex().build(&server).await?;
let call_id = "ig_image_saved_to_temp_dir_default";
let expected_saved_path = std::env::temp_dir().join(format!("{call_id}.png"));
let expected_saved_path = image_generation_artifact_path(
config.codex_home.as_path(),
&session_configured.session_id.to_string(),
call_id,
);
let _ = std::fs::remove_file(&expected_saved_path);
let first_response = sse(vec![
@@ -577,8 +612,17 @@ async fn image_generation_call_event_is_emitted_when_image_save_fails() -> anyho
let server = start_mock_server().await;
let TestCodex { codex, .. } = test_codex().build(&server).await?;
let expected_saved_path = std::env::temp_dir().join("ig_invalid.png");
let TestCodex {
codex,
config,
session_configured,
..
} = test_codex().build(&server).await?;
let expected_saved_path = image_generation_artifact_path(
config.codex_home.as_path(),
&session_configured.session_id.to_string(),
"ig_invalid",
);
let _ = std::fs::remove_file(&expected_saved_path);
let first_response = sse(vec![