Keep async user messages on the direct tool surface (#39601)

## What changed

- Register `send_user_message_async` as `DirectModelOnly` so supported models can call it directly without exposing it through code mode.
- Exercise the async message flow with a code-mode-only model configuration and verify that the tool remains directly visible.

GitOrigin-RevId: ce22d5f63471ce90ac55ae2f3d0048f6cda57e01
This commit is contained in:
rka-oai
2026-08-19 19:21:09 +00:00
committed by copyberry
parent f6950546e5
commit 198f42067a
2 changed files with 3 additions and 1 deletions

View File

@@ -1069,7 +1069,7 @@ fn add_core_utility_tools(context: &CoreToolPlanContext<'_>, registry: &mut Tool
.iter()
.any(|tool| tool == "send_user_message_async")
{
registry.add(SendUserMessageAsyncHandler);
registry.add_with_exposure(SendUserMessageAsyncHandler, ToolExposure::DirectModelOnly);
}
if environment_mode.has_environment() && features.enabled(Feature::RequestPermissionsTool) {

View File

@@ -5,6 +5,7 @@ use codex_protocol::items::AgentMessageDelivery;
use codex_protocol::items::AgentMessageItem;
use codex_protocol::items::TurnItem;
use codex_protocol::models::MessagePhase;
use codex_protocol::openai_models::ToolMode;
use codex_protocol::protocol::EventMsg;
use codex_protocol::user_input::UserInput;
use core_test_support::responses::ev_assistant_message;
@@ -52,6 +53,7 @@ async fn send_user_message_async_emits_item_and_does_not_end_the_turn() -> Resul
.await;
let test = test_codex()
.with_model_info_override("gpt-5.2", |model| {
model.tool_mode = Some(ToolMode::CodeModeOnly);
model
.experimental_supported_tools
.push("send_user_message_async".to_string());