diff --git a/codex-rs/core/src/models_manager/collaboration_mode_presets.rs b/codex-rs/core/src/models_manager/collaboration_mode_presets.rs index b7efe156f..aff111b1a 100644 --- a/codex-rs/core/src/models_manager/collaboration_mode_presets.rs +++ b/codex-rs/core/src/models_manager/collaboration_mode_presets.rs @@ -27,7 +27,7 @@ fn plan_preset() -> CollaborationModeMask { CollaborationModeMask { name: "Plan".to_string(), mode: Some(ModeKind::Plan), - model: Some("gpt-5.2-codex".to_string()), + model: None, reasoning_effort: Some(Some(ReasoningEffort::High)), developer_instructions: Some(Some(COLLABORATION_MODE_PLAN.to_string())), } @@ -37,8 +37,8 @@ fn code_preset() -> CollaborationModeMask { CollaborationModeMask { name: "Code".to_string(), mode: Some(ModeKind::Code), - model: Some("gpt-5.2-codex".to_string()), - reasoning_effort: Some(Some(ReasoningEffort::Medium)), + model: None, + reasoning_effort: None, developer_instructions: Some(Some(COLLABORATION_MODE_CODE.to_string())), } } @@ -47,7 +47,7 @@ fn pair_programming_preset() -> CollaborationModeMask { CollaborationModeMask { name: "Pair Programming".to_string(), mode: Some(ModeKind::PairProgramming), - model: Some("gpt-5.2-codex".to_string()), + model: None, reasoning_effort: Some(Some(ReasoningEffort::Medium)), developer_instructions: Some(Some(COLLABORATION_MODE_PAIR_PROGRAMMING.to_string())), } @@ -57,7 +57,7 @@ fn execute_preset() -> CollaborationModeMask { CollaborationModeMask { name: "Execute".to_string(), mode: Some(ModeKind::Execute), - model: Some("gpt-5.2-codex".to_string()), + model: None, reasoning_effort: Some(Some(ReasoningEffort::High)), developer_instructions: Some(Some(COLLABORATION_MODE_EXECUTE.to_string())), } diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index 1252b792e..ce87b33ee 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -4662,8 +4662,10 @@ impl ChatWidget { if !config.features.enabled(Feature::CollaborationModes) { return None; } - let kind = config.experimental_mode?; - let mut mask = collaboration_modes::mask_for_kind(models_manager, kind)?; + let mut mask = match config.experimental_mode { + Some(kind) => collaboration_modes::mask_for_kind(models_manager, kind)?, + None => collaboration_modes::default_mask(models_manager)?, + }; if let Some(model_override) = model_override { mask.model = Some(model_override.to_string()); } diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 9eff1b2f4..e76abdbd7 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -2273,6 +2273,44 @@ async fn collab_slash_command_opens_picker_and_updates_mode() { } } +#[tokio::test] +async fn collaboration_modes_defaults_to_code_on_startup() { + let codex_home = tempdir().expect("tempdir"); + let cfg = ConfigBuilder::default() + .codex_home(codex_home.path().to_path_buf()) + .cli_overrides(vec![( + "features.collaboration_modes".to_string(), + TomlValue::Boolean(true), + )]) + .build() + .await + .expect("config"); + let resolved_model = ModelsManager::get_model_offline(cfg.model.as_deref()); + let otel_manager = test_otel_manager(&cfg, resolved_model.as_str()); + let thread_manager = Arc::new(ThreadManager::with_models_provider( + CodexAuth::from_api_key("test"), + cfg.model_provider.clone(), + )); + let auth_manager = AuthManager::from_auth_for_testing(CodexAuth::from_api_key("test")); + let init = ChatWidgetInit { + config: cfg, + frame_requester: FrameRequester::test_dummy(), + app_event_tx: AppEventSender::new(unbounded_channel::().0), + initial_user_message: None, + enhanced_keys_supported: false, + auth_manager, + models_manager: thread_manager.get_models_manager(), + feedback: codex_feedback::CodexFeedback::new(), + is_first_run: true, + model: Some(resolved_model.clone()), + otel_manager, + }; + + let chat = ChatWidget::new(init, thread_manager); + assert_eq!(chat.active_collaboration_mode_kind(), ModeKind::Code); + assert_eq!(chat.current_model(), resolved_model); +} + #[tokio::test] async fn experimental_mode_plan_applies_on_startup() { let codex_home = tempdir().expect("tempdir");