mirror of
https://github.com/openai/codex.git
synced 2026-04-29 00:55:38 +00:00
Warn users on enabling underdevelopment features (#9954)
<img width="938" height="73" alt="image" src="https://github.com/user-attachments/assets/a2d5ac46-92c5-4828-b35e-0965c30cdf36" />
This commit is contained in:
@@ -74,6 +74,7 @@ mod tools;
|
||||
mod truncation;
|
||||
mod undo;
|
||||
mod unified_exec;
|
||||
mod unstable_features_warning;
|
||||
mod user_notification;
|
||||
mod user_shell_cmd;
|
||||
mod view_image;
|
||||
|
||||
90
codex-rs/core/tests/suite/unstable_features_warning.rs
Normal file
90
codex-rs/core/tests/suite/unstable_features_warning.rs
Normal file
@@ -0,0 +1,90 @@
|
||||
#![allow(clippy::unwrap_used, clippy::expect_used)]
|
||||
|
||||
use codex_core::AuthManager;
|
||||
use codex_core::CodexAuth;
|
||||
use codex_core::NewThread;
|
||||
use codex_core::ThreadManager;
|
||||
use codex_core::config::CONFIG_TOML_FILE;
|
||||
use codex_core::features::Feature;
|
||||
use codex_core::protocol::EventMsg;
|
||||
use codex_core::protocol::InitialHistory;
|
||||
use codex_core::protocol::WarningEvent;
|
||||
use codex_utils_absolute_path::AbsolutePathBuf;
|
||||
use core::time::Duration;
|
||||
use core_test_support::load_default_config_for_test;
|
||||
use core_test_support::wait_for_event;
|
||||
use tempfile::TempDir;
|
||||
use tokio::time::timeout;
|
||||
use toml::toml;
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn emits_warning_when_unstable_features_enabled_via_config() {
|
||||
let home = TempDir::new().expect("tempdir");
|
||||
let mut config = load_default_config_for_test(&home).await;
|
||||
config.features.enable(Feature::ChildAgentsMd);
|
||||
let user_config_path =
|
||||
AbsolutePathBuf::from_absolute_path(config.codex_home.join(CONFIG_TOML_FILE))
|
||||
.expect("absolute user config path");
|
||||
config.config_layer_stack = config.config_layer_stack.with_user_config(
|
||||
&user_config_path,
|
||||
toml! { features = { child_agents_md = true } }.into(),
|
||||
);
|
||||
|
||||
let thread_manager = ThreadManager::with_models_provider(
|
||||
CodexAuth::from_api_key("test"),
|
||||
config.model_provider.clone(),
|
||||
);
|
||||
let auth_manager = AuthManager::from_auth_for_testing(CodexAuth::from_api_key("test"));
|
||||
|
||||
let NewThread {
|
||||
thread: conversation,
|
||||
..
|
||||
} = thread_manager
|
||||
.resume_thread_with_history(config, InitialHistory::New, auth_manager)
|
||||
.await
|
||||
.expect("spawn conversation");
|
||||
|
||||
let warning = wait_for_event(&conversation, |ev| matches!(ev, EventMsg::Warning(_))).await;
|
||||
let EventMsg::Warning(WarningEvent { message }) = warning else {
|
||||
panic!("expected warning event");
|
||||
};
|
||||
assert!(message.contains("child_agents_md"));
|
||||
assert!(message.contains("Under-development features enabled"));
|
||||
assert!(message.contains("suppress_unstable_features_warning = true"));
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn suppresses_warning_when_configured() {
|
||||
let home = TempDir::new().expect("tempdir");
|
||||
let mut config = load_default_config_for_test(&home).await;
|
||||
config.features.enable(Feature::ChildAgentsMd);
|
||||
config.suppress_unstable_features_warning = true;
|
||||
let user_config_path =
|
||||
AbsolutePathBuf::from_absolute_path(config.codex_home.join(CONFIG_TOML_FILE))
|
||||
.expect("absolute user config path");
|
||||
config.config_layer_stack = config.config_layer_stack.with_user_config(
|
||||
&user_config_path,
|
||||
toml! { features = { child_agents_md = true } }.into(),
|
||||
);
|
||||
|
||||
let thread_manager = ThreadManager::with_models_provider(
|
||||
CodexAuth::from_api_key("test"),
|
||||
config.model_provider.clone(),
|
||||
);
|
||||
let auth_manager = AuthManager::from_auth_for_testing(CodexAuth::from_api_key("test"));
|
||||
|
||||
let NewThread {
|
||||
thread: conversation,
|
||||
..
|
||||
} = thread_manager
|
||||
.resume_thread_with_history(config, InitialHistory::New, auth_manager)
|
||||
.await
|
||||
.expect("spawn conversation");
|
||||
|
||||
let warning = timeout(
|
||||
Duration::from_millis(150),
|
||||
wait_for_event(&conversation, |ev| matches!(ev, EventMsg::Warning(_))),
|
||||
)
|
||||
.await;
|
||||
assert!(warning.is_err());
|
||||
}
|
||||
Reference in New Issue
Block a user