Retire the daemon_auto_start feature flag (#58940)

## What changed

Eligible interactive launches now start or reuse the shared daemon regardless of `features.daemon_auto_start`. Remote-control daemon eligibility also no longer checks this flag. Use `--no-daemon` to run without the shared background server.

Treat `daemon_auto_start` as removed: ignore configured values with a migration notice, ignore managed requirements with a warning, and hide the flag from experimental feature discovery. Remove its launch telemetry tag.

## Testing

Extend retired-feature requirement coverage and add a migration-notice snapshot. Update CLI and TUI integration tests for daemon startup and explicit `--no-daemon` usage.

GitOrigin-RevId: e0290e5acd4bc0169a0f71c3296c567e46269ce3
This commit is contained in:
Eric Traut
2026-11-02 18:31:19 +00:00
committed by copyberry
parent 1a604d58da
commit a5c4092437
20 changed files with 111 additions and 99 deletions
+1 -3
View File
@@ -16,7 +16,6 @@ use codex_app_server_protocol::RemoteControlPairingStartResponse;
use codex_arg0::Arg0DispatchPaths;
use codex_config::LoaderOverrides;
use codex_core::config::ConfigBuilder;
use codex_features::Feature;
use codex_protocol::protocol::SessionSource;
use codex_utils_absolute_path::AbsolutePathBuf;
use codex_utils_cli::CliConfigOverrides;
@@ -161,8 +160,7 @@ async fn daemon_eligible(root_config_overrides: &CliConfigOverrides) -> anyhow::
let Ok(config) = ConfigBuilder::default().build().await else {
return Ok(false);
};
Ok(config.features.enabled(Feature::DaemonAutoStart)
&& !codex_tui::uses_wsl_drvfs(&config.codex_home))
Ok(!codex_tui::uses_wsl_drvfs(&config.codex_home))
}
fn print_remote_control_progress(json: bool, message: &str) -> anyhow::Result<()> {
+5 -4
View File
@@ -40,7 +40,7 @@ async fn agents_checks_trust_when_starting_after_dismissing_overview() -> Result
#[tokio::test]
#[cfg(unix)]
async fn discovered_managed_daemon_can_restart_with_auto_start_disabled() -> Result<()> {
async fn discovered_managed_daemon_can_restart() -> Result<()> {
daemon_startup("discovered").await
}
@@ -194,8 +194,10 @@ async fn daemon_startup(command: &str) -> Result<()> {
{}\n\
notice.model_migrations.\"gpt-5.6-terra\" = \"gpt-6-sol\"\n\
[projects.{}]\ntrust_level = \"{}\"\n",
if command == "discovered" {
"tui.status_line=[\"model\",\"thread-id\",\"thread-name\"]\nfeatures.daemon_auto_start=false"
if command == "start" {
"features.daemon_auto_start=false"
} else if command == "discovered" {
"tui.status_line=[\"model\",\"thread-id\",\"thread-name\"]"
} else if bedrock_onboarding {
"features.gcp_setup_wizard=false"
} else {
@@ -321,7 +323,6 @@ async fn daemon_startup(command: &str) -> Result<()> {
}
"entercontinue·escback"
} else if command == "discovered" {
args.extend(["--disable".into(), "daemon_auto_start".into()]);
// Empty drafts need not survive a daemon restart. Renaming materializes the
// thread; wait for the confirmed footer name, not the echoed command.
steps.push_back(("GPT-5.6-Terra", b"/rename daemon-restart-test\r"));
+3 -10
View File
@@ -192,7 +192,6 @@ cli_auth_credentials_store = "file"
chatgpt_base_url = "{}/source/backend-api"
analytics.enabled = false
check_for_update_on_startup = false
features.daemon_auto_start = {}
features.mcp_oauth_refresh_coordination = true
model_provider = "local"
model = "test-model"
@@ -211,7 +210,6 @@ trust_level = "trusted"
trust_level = "trusted"
"#,
server.uri(),
backend == "daemon",
server.uri(),
serde_json::to_string(&source)?,
serde_json::to_string(&launcher)?
@@ -390,6 +388,9 @@ trust_level = "trusted"
.mount(&server)
.await;
let mut args = worktree_args.clone();
if backend == "embedded" && !analytics {
args.push("--no-daemon".into());
}
if backend == "daemon" && previous.is_empty() {
args.extend(["-c".into(), "features.auth_elicitation=true".into()]);
}
@@ -698,14 +699,6 @@ trust_level = "trusted"
("terminal_rows", "40-79"),
("multiplexer", "none"),
("daemon_selection_reason", "incompatible_option"),
(
"daemon_auto_start",
if backend == "daemon" {
"enabled"
} else {
"disabled"
},
),
("auto_update", "enabled"),
("auto_update_setting", "default"),
("update_interval_setting", "default"),