[codex] Remove async_trait from first-party code (#27475)

## Why

First-party async traits should expose their `Send` contracts explicitly
without requiring `async_trait`. This completes the migration pattern
established in #27303 and #27304.

## What changed

- Replaced the remaining first-party `async_trait` traits with native
return-position `impl Future + Send` where statically dispatched and
explicit boxed `Send` futures where object safety is required.
- Kept implementations behavior-preserving, outlining existing async
bodies into inherent methods where that keeps the diff reviewable.
- Removed all direct first-party `async-trait` dependencies and the
workspace dependency declaration.
- Added a cargo-deny policy that permits `async-trait` only through the
remaining transitive wrapper crates.
- Updated `rand` from 0.8.5 to 0.8.6 to resolve RUSTSEC-2026-0097 and
keep the full cargo-deny check passing.

## Validation

- `just test -p codex-exec-server`: 216 passed, 2 skipped.
- `just test -p codex-model-provider`: 39 passed.
- `just test -p codex-core` and `just test`: changed tests passed;
remaining failures are environment-sensitive suites unrelated to this
migration.
- `cargo deny check`
- `just fix`
- `just fmt`
- `cargo shear`
- `just bazel-lock-check`
This commit is contained in:
Adam Perry @ OpenAI authored and GitHub committed 2026-06-11 18:16:39 -07:00
1 parent 1829ed1122
commit 5a56caf18c
98 files changed
+2010 -1050

No files matched your search

+31 -6
View File
@@ -3,7 +3,6 @@ use std::collections::HashMap;
use std::num::NonZeroU64;
use std::time::Duration;
use async_trait::async_trait;
use codex_model_provider_info::ModelProviderInfo;
use codex_model_provider_info::WireApi;
use codex_protocol::config_types::ModelProviderAuthInfo;
@@ -14,6 +13,7 @@ use super::ThreadConfigContext;
use super::ThreadConfigLoadError;
use super::ThreadConfigLoadErrorCode;
use super::ThreadConfigLoader;
use super::ThreadConfigLoaderFuture;
use super::ThreadConfigSource;
use super::UserThreadConfig;
use proto::thread_config_loader_client::ThreadConfigLoaderClient;
@@ -49,10 +49,7 @@ impl RemoteThreadConfigLoader {
)
})
}
}
#[async_trait]
impl ThreadConfigLoader for RemoteThreadConfigLoader {
async fn load(
&self,
context: ThreadConfigContext,
@@ -73,6 +70,15 @@ impl ThreadConfigLoader for RemoteThreadConfigLoader {
}
}
impl ThreadConfigLoader for RemoteThreadConfigLoader {
fn load(
&self,
context: ThreadConfigContext,
) -> ThreadConfigLoaderFuture<'_, Vec<ThreadConfigSource>> {
Box::pin(RemoteThreadConfigLoader::load(self, context))
}
}
fn load_thread_config_request(
context: ThreadConfigContext,
) -> tonic::Request<proto::LoadThreadConfigRequest> {
@@ -321,8 +327,7 @@ mod tests {
expected_cwd: String,
}
#[tonic::async_trait]
impl thread_config_loader_server::ThreadConfigLoader for TestServer {
impl TestServer {
async fn load(
&self,
request: Request<proto::LoadThreadConfigRequest>,
@@ -341,6 +346,26 @@ mod tests {
}
}
impl thread_config_loader_server::ThreadConfigLoader for TestServer {
fn load<'a, 'async_trait>(
&'a self,
request: Request<proto::LoadThreadConfigRequest>,
) -> std::pin::Pin<
Box<
dyn std::future::Future<
Output = Result<Response<proto::LoadThreadConfigResponse>, Status>,
> + Send
+ 'async_trait,
>,
>
where
'a: 'async_trait,
Self: 'async_trait,
{
Box::pin(TestServer::load(self, request))
}
}
#[tokio::test]
async fn load_thread_config_calls_remote_service() {
let cwd = workspace_dir().join("project");