[codex-analytics] add queued submission metadata

This commit is contained in:
rhan-oai
2026-04-07 16:38:47 -07:00
parent 19caf41a21
commit 48dc8c21d0
82 changed files with 782 additions and 5 deletions
@@ -210,7 +210,7 @@ fn sample_turn_resolved_config(turn_id: &str) -> TurnResolvedConfigFact {
turn_id: turn_id.to_string(),
thread_id: "thread-2".to_string(),
num_input_images: 1,
submission_type: None,
submission_type: Some(codex_protocol::protocol::SubmissionType::Default),
model: "gpt-5".to_string(),
model_provider: "openai".to_string(),
sandbox_policy: SandboxPolicy::new_read_only_policy(),
@@ -1020,7 +1020,7 @@ fn turn_event_serializes_expected_shape() {
thread_id: "thread-2".to_string(),
turn_id: "turn-2".to_string(),
product_client_id: "codex-tui".to_string(),
submission_type: None,
submission_type: Some(codex_protocol::protocol::SubmissionType::Default),
model: Some("gpt-5".to_string()),
model_provider: "openai".to_string(),
sandbox_policy: Some("read_only"),
@@ -1061,7 +1061,7 @@ fn turn_event_serializes_expected_shape() {
"thread_id": "thread-2",
"turn_id": "turn-2",
"product_client_id": "codex-tui",
"submission_type": null,
"submission_type": "default",
"model": "gpt-5",
"model_provider": "openai",
"sandbox_policy": "read_only",
@@ -1135,6 +1135,89 @@ async fn turn_lifecycle_emits_turn_event() {
assert_eq!(payload["event_params"]["duration_ms"], json!(1234));
}
#[tokio::test]
async fn queued_submission_type_emits_queued_turn_event() {
let mut reducer = AnalyticsReducer::default();
let mut out = Vec::new();
reducer
.ingest(
AnalyticsFact::Initialize {
connection_id: 7,
params: InitializeParams {
client_info: ClientInfo {
name: "codex-tui".to_string(),
title: None,
version: "1.0.0".to_string(),
},
capabilities: None,
},
product_client_id: "codex-tui".to_string(),
runtime: CodexRuntimeMetadata {
codex_rs_version: "0.1.0".to_string(),
runtime_os: "macos".to_string(),
runtime_os_version: "15.3.1".to_string(),
runtime_arch: "aarch64".to_string(),
},
rpc_transport: AppServerRpcTransport::Stdio,
},
&mut out,
)
.await;
reducer
.ingest(
AnalyticsFact::Request {
connection_id: 7,
request_id: RequestId::Integer(3),
request: Box::new(sample_turn_start_request("thread-2", /*request_id*/ 3)),
},
&mut out,
)
.await;
reducer
.ingest(
AnalyticsFact::Response {
connection_id: 7,
response: Box::new(sample_turn_start_response("turn-2", /*request_id*/ 3)),
},
&mut out,
)
.await;
let mut resolved_config = sample_turn_resolved_config("turn-2");
resolved_config.submission_type = Some(codex_protocol::protocol::SubmissionType::Queued);
reducer
.ingest(
AnalyticsFact::Custom(CustomAnalyticsFact::TurnResolvedConfig(Box::new(
resolved_config,
))),
&mut out,
)
.await;
reducer
.ingest(
AnalyticsFact::Notification(Box::new(sample_turn_started_notification(
"thread-2", "turn-2",
))),
&mut out,
)
.await;
reducer
.ingest(
AnalyticsFact::Notification(Box::new(sample_turn_completed_notification(
"thread-2",
"turn-2",
AppServerTurnStatus::Completed,
/*codex_error_info*/ None,
))),
&mut out,
)
.await;
assert_eq!(out.len(), 1);
let payload = serde_json::to_value(&out[0]).expect("serialize turn event");
assert_eq!(payload["event_params"]["submission_type"], json!("queued"));
}
#[tokio::test]
async fn turn_does_not_emit_without_required_prerequisites() {
let mut reducer = AnalyticsReducer::default();
@@ -2515,6 +2515,13 @@
},
"type": "object"
},
"SubmissionType": {
"enum": [
"default",
"queued"
],
"type": "string"
},
"TextElement": {
"properties": {
"byteRange": {
@@ -3283,6 +3290,17 @@
],
"description": "Override the service tier for this turn and subsequent turns."
},
"submissionType": {
"anyOf": [
{
"$ref": "#/definitions/SubmissionType"
},
{
"type": "null"
}
],
"description": "Metadata describing how the prompt was submitted."
},
"summary": {
"anyOf": [
{
@@ -12202,6 +12202,13 @@
}
]
},
"SubmissionType": {
"enum": [
"default",
"queued"
],
"type": "string"
},
"TerminalInteractionNotification": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -14763,6 +14770,17 @@
],
"description": "Override the service tier for this turn and subsequent turns."
},
"submissionType": {
"anyOf": [
{
"$ref": "#/definitions/v2/SubmissionType"
},
{
"type": "null"
}
],
"description": "Metadata describing how the prompt was submitted."
},
"summary": {
"anyOf": [
{
@@ -10057,6 +10057,13 @@
}
]
},
"SubmissionType": {
"enum": [
"default",
"queued"
],
"type": "string"
},
"TerminalInteractionNotification": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -12618,6 +12625,17 @@
],
"description": "Override the service tier for this turn and subsequent turns."
},
"submissionType": {
"anyOf": [
{
"$ref": "#/definitions/SubmissionType"
},
{
"type": "null"
}
],
"description": "Metadata describing how the prompt was submitted."
},
"summary": {
"anyOf": [
{
@@ -354,6 +354,13 @@
],
"type": "object"
},
"SubmissionType": {
"enum": [
"default",
"queued"
],
"type": "string"
},
"TextElement": {
"properties": {
"byteRange": {
@@ -595,6 +602,17 @@
],
"description": "Override the service tier for this turn and subsequent turns."
},
"submissionType": {
"anyOf": [
{
"$ref": "#/definitions/SubmissionType"
},
{
"type": "null"
}
],
"description": "Metadata describing how the prompt was submitted."
},
"summary": {
"anyOf": [
{
@@ -0,0 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type SubmissionType = "default" | "queued";
@@ -65,6 +65,7 @@ export type { ServiceTier } from "./ServiceTier";
export type { SessionSource } from "./SessionSource";
export type { Settings } from "./Settings";
export type { SubAgentSource } from "./SubAgentSource";
export type { SubmissionType } from "./SubmissionType";
export type { ThreadId } from "./ThreadId";
export type { Tool } from "./Tool";
export type { Verbosity } from "./Verbosity";
@@ -6,6 +6,7 @@ import type { Personality } from "../Personality";
import type { ReasoningEffort } from "../ReasoningEffort";
import type { ReasoningSummary } from "../ReasoningSummary";
import type { ServiceTier } from "../ServiceTier";
import type { SubmissionType } from "../SubmissionType";
import type { JsonValue } from "../serde_json/JsonValue";
import type { ApprovalsReviewer } from "./ApprovalsReviewer";
import type { AskForApproval } from "./AskForApproval";
@@ -45,6 +46,9 @@ personality?: Personality | null, /**
* this turn.
*/
outputSchema?: JsonValue | null, /**
* Metadata describing how the prompt was submitted.
*/
submissionType?: SubmissionType | null, /**
* EXPERIMENTAL - Set a pre-set collaboration mode.
* Takes precedence over model, reasoning_effort, and developer instructions if set.
*
@@ -80,6 +80,7 @@ use codex_protocol::protocol::SkillMetadata as CoreSkillMetadata;
use codex_protocol::protocol::SkillScope as CoreSkillScope;
use codex_protocol::protocol::SkillToolDependency as CoreSkillToolDependency;
use codex_protocol::protocol::SubAgentSource as CoreSubAgentSource;
use codex_protocol::protocol::SubmissionType;
use codex_protocol::protocol::TokenUsage as CoreTokenUsage;
use codex_protocol::protocol::TokenUsageInfo as CoreTokenUsageInfo;
use codex_protocol::request_permissions::PermissionGrantScope as CorePermissionGrantScope;
@@ -4058,6 +4059,11 @@ pub struct TurnStartParams {
#[ts(optional = nullable)]
pub output_schema: Option<JsonValue>,
/// Metadata describing how the prompt was submitted.
#[serde(default, skip_serializing_if = "Option::is_none")]
#[ts(optional = nullable)]
pub submission_type: Option<SubmissionType>,
/// EXPERIMENTAL - Set a pre-set collaboration mode.
/// Takes precedence over model, reasoning_effort, and developer instructions if set.
///
@@ -8420,6 +8426,7 @@ mod tests {
service_tier: None,
effort: None,
summary: None,
submission_type: None,
output_schema: None,
collaboration_mode: None,
personality: None,
@@ -6650,6 +6650,7 @@ impl CodexMessageProcessor {
Op::UserInput {
items: mapped_items,
final_output_json_schema: params.output_schema,
submission_type: params.submission_type,
},
)
.await;
@@ -615,6 +615,7 @@ async fn turn_start_jsonrpc_span_parents_core_turn_spans() -> Result<()> {
effort: None,
summary: None,
personality: None,
submission_type: None,
output_schema: None,
collaboration_mode: None,
},
@@ -173,6 +173,41 @@ pub(crate) async fn wait_for_analytics_event(
.await?
}
pub(crate) async fn wait_for_analytics_turn_event(
server: &MockServer,
read_timeout: Duration,
turn_id: &str,
) -> Result<Value> {
timeout(read_timeout, async {
loop {
let Some(requests) = server.received_requests().await else {
tokio::time::sleep(Duration::from_millis(25)).await;
continue;
};
for request in &requests {
if request.method != "POST"
|| request.url.path() != "/codex/analytics-events/events"
{
continue;
}
let payload: Value = serde_json::from_slice(&request.body)
.map_err(|err| anyhow::anyhow!("invalid analytics payload: {err}"))?;
let Some(events) = payload["events"].as_array() else {
continue;
};
if let Some(event) = events.iter().find(|event| {
event["event_type"] == "codex_turn_event"
&& event["event_params"]["turn_id"] == turn_id
}) {
return Ok::<Value, anyhow::Error>(event.clone());
}
}
tokio::time::sleep(Duration::from_millis(25)).await;
}
})
.await?
}
pub(crate) fn thread_initialized_event(payload: &Value) -> Result<&Value> {
let events = payload["events"]
.as_array()
@@ -55,6 +55,7 @@ use codex_protocol::config_types::Personality;
use codex_protocol::config_types::ReasoningSummary;
use codex_protocol::config_types::Settings;
use codex_protocol::openai_models::ReasoningEffort;
use codex_protocol::protocol::SubmissionType;
use codex_protocol::user_input::MAX_USER_INPUT_TEXT_CHARS;
use core_test_support::responses;
use core_test_support::skip_if_no_network;
@@ -69,6 +70,7 @@ use tokio::time::timeout;
use super::analytics::enable_analytics_capture;
use super::analytics::wait_for_analytics_event;
use super::analytics::wait_for_analytics_payload;
use super::analytics::wait_for_analytics_turn_event;
#[cfg(windows)]
const DEFAULT_READ_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(25);
@@ -419,7 +421,9 @@ async fn turn_start_tracks_turn_event_analytics() -> Result<()> {
assert_eq!(event["event_params"]["model"], "mock-model");
assert_eq!(event["event_params"]["model_provider"], "mock_provider");
assert_eq!(event["event_params"]["sandbox_policy"], "read_only");
assert_eq!(event["event_params"]["submission_type"], "default");
assert_eq!(event["event_params"]["num_input_images"], 1);
assert_eq!(event["event_params"]["is_first_turn"], true);
assert_eq!(event["event_params"]["status"], "completed");
assert!(event["event_params"]["started_at"].as_u64().is_some());
assert!(event["event_params"]["completed_at"].as_u64().is_some());
@@ -491,6 +495,107 @@ async fn turn_start_does_not_track_turn_event_analytics_without_feature() -> Res
payload.is_err(),
"turn analytics should be gated off when general_analytics is disabled"
);
Ok(())
}
#[tokio::test]
async fn turn_start_tracks_second_turn_as_not_first_and_queued_submission_analytics() -> Result<()>
{
let responses = vec![
create_final_assistant_message_sse_response("Done 1")?,
create_final_assistant_message_sse_response("Done 2")?,
];
let server = create_mock_responses_server_sequence_unchecked(responses).await;
let codex_home = TempDir::new()?;
write_mock_responses_config_toml_with_chatgpt_base_url(
codex_home.path(),
&server.uri(),
&server.uri(),
)?;
enable_analytics_capture(&server, codex_home.path()).await?;
let mut mcp = McpProcess::new(codex_home.path()).await?;
timeout(DEFAULT_READ_TIMEOUT, mcp.initialize()).await??;
let thread_req = mcp
.send_thread_start_request(ThreadStartParams {
model: Some("mock-model".to_string()),
..Default::default()
})
.await?;
let thread_resp: JSONRPCResponse = timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_response_message(RequestId::Integer(thread_req)),
)
.await??;
let ThreadStartResponse { thread, .. } = to_response::<ThreadStartResponse>(thread_resp)?;
let first_turn_req = mcp
.send_turn_start_request(TurnStartParams {
thread_id: thread.id.clone(),
input: vec![V2UserInput::Text {
text: "first turn".to_string(),
text_elements: Vec::new(),
}],
..Default::default()
})
.await?;
let first_turn_resp: JSONRPCResponse = timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_response_message(RequestId::Integer(first_turn_req)),
)
.await??;
let TurnStartResponse { turn: first_turn } = to_response::<TurnStartResponse>(first_turn_resp)?;
timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_notification_message("turn/completed"),
)
.await??;
let first_turn_event =
wait_for_analytics_turn_event(&server, DEFAULT_READ_TIMEOUT, &first_turn.id).await?;
assert_eq!(
first_turn_event["event_params"]["submission_type"],
"default"
);
assert_eq!(first_turn_event["event_params"]["is_first_turn"], true);
let second_turn_req = mcp
.send_turn_start_request(TurnStartParams {
thread_id: thread.id,
input: vec![V2UserInput::Text {
text: "second turn".to_string(),
text_elements: Vec::new(),
}],
submission_type: Some(SubmissionType::Queued),
..Default::default()
})
.await?;
let second_turn_resp: JSONRPCResponse = timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_response_message(RequestId::Integer(second_turn_req)),
)
.await??;
let TurnStartResponse { turn: second_turn } =
to_response::<TurnStartResponse>(second_turn_resp)?;
timeout(
DEFAULT_READ_TIMEOUT,
mcp.read_stream_until_notification_message("turn/completed"),
)
.await??;
let second_turn_event =
wait_for_analytics_turn_event(&server, DEFAULT_READ_TIMEOUT, &second_turn.id).await?;
assert_eq!(
second_turn_event["event_params"]["submission_type"],
"queued"
);
assert_eq!(second_turn_event["event_params"]["is_first_turn"], false);
Ok(())
}
@@ -1648,6 +1753,7 @@ async fn turn_start_updates_sandbox_and_cwd_between_turns_v2() -> Result<()> {
summary: Some(ReasoningSummary::Auto),
service_tier: None,
personality: None,
submission_type: None,
output_schema: None,
collaboration_mode: None,
})
@@ -1681,6 +1787,7 @@ async fn turn_start_updates_sandbox_and_cwd_between_turns_v2() -> Result<()> {
summary: Some(ReasoningSummary::Auto),
service_tier: None,
personality: None,
submission_type: None,
output_schema: None,
collaboration_mode: None,
})
+3
View File
@@ -425,6 +425,7 @@ async fn send_input_submits_user_message() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
},
);
let captured = harness
@@ -571,6 +572,7 @@ async fn spawn_agent_creates_thread_and_sends_prompt() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
},
);
let captured = harness
@@ -678,6 +680,7 @@ async fn spawn_agent_can_fork_parent_thread_history_with_sanitized_items() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
},
);
let captured = harness
+21 -1
View File
@@ -119,6 +119,7 @@ use codex_protocol::protocol::ReviewRequest;
use codex_protocol::protocol::RolloutItem;
use codex_protocol::protocol::SessionSource;
use codex_protocol::protocol::SubAgentSource;
use codex_protocol::protocol::SubmissionType;
use codex_protocol::protocol::TurnAbortReason;
use codex_protocol::protocol::TurnContextItem;
use codex_protocol::protocol::TurnContextNetworkItem;
@@ -885,6 +886,7 @@ pub(crate) struct TurnContext {
pub(crate) current_date: Option<String>,
pub(crate) timezone: Option<String>,
pub(crate) app_server_client_name: Option<String>,
pub(crate) submission_type: Option<SubmissionType>,
pub(crate) developer_instructions: Option<String>,
pub(crate) compact_prompt: Option<String>,
pub(crate) user_instructions: Option<String>,
@@ -1003,6 +1005,7 @@ impl TurnContext {
current_date: self.current_date.clone(),
timezone: self.timezone.clone(),
app_server_client_name: self.app_server_client_name.clone(),
submission_type: self.submission_type,
developer_instructions: self.developer_instructions.clone(),
compact_prompt: self.compact_prompt.clone(),
user_instructions: self.user_instructions.clone(),
@@ -1265,6 +1268,7 @@ pub(crate) struct SessionSettingsUpdate {
pub(crate) personality: Option<Personality>,
pub(crate) app_server_client_name: Option<String>,
pub(crate) app_server_client_version: Option<String>,
pub(crate) submission_type: Option<SubmissionType>,
}
pub(crate) struct AppServerClientMetadata {
@@ -1433,6 +1437,7 @@ impl Session {
network: Option<NetworkProxy>,
environment: Option<Arc<Environment>>,
sub_id: String,
submission_type: Option<SubmissionType>,
js_repl: Arc<JsReplHandle>,
skills_outcome: Arc<SkillLoadOutcome>,
) -> TurnContext {
@@ -1497,6 +1502,7 @@ impl Session {
current_date: Some(current_date),
timezone: Some(timezone),
app_server_client_name: session_configuration.app_server_client_name.clone(),
submission_type,
developer_instructions: session_configuration.developer_instructions.clone(),
compact_prompt: session_configuration.compact_prompt.clone(),
user_instructions: session_configuration.user_instructions.clone(),
@@ -2209,6 +2215,7 @@ impl Session {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
},
)
.await;
@@ -2512,6 +2519,7 @@ impl Session {
sub_id,
session_configuration,
updates.final_output_json_schema,
updates.submission_type,
sandbox_policy_changed,
)
.await)
@@ -2522,6 +2530,7 @@ impl Session {
sub_id: String,
session_configuration: SessionConfiguration,
final_output_json_schema: Option<Option<Value>>,
submission_type: Option<SubmissionType>,
sandbox_policy_changed: bool,
) -> Arc<TurnContext> {
let per_turn_config = Self::build_per_turn_config(&session_configuration);
@@ -2587,6 +2596,7 @@ impl Session {
.map(StartedNetworkProxy::proxy),
self.services.environment.clone(),
sub_id,
submission_type,
Arc::clone(&self.js_repl),
skills_outcome,
);
@@ -2699,6 +2709,7 @@ impl Session {
sub_id,
session_configuration,
/*final_output_json_schema*/ None,
/*submission_type*/ None,
/*sandbox_policy_changed*/ false,
)
.await
@@ -4891,6 +4902,7 @@ mod handlers {
items,
collaboration_mode,
personality,
submission_type,
} => {
let collaboration_mode = collaboration_mode.or_else(|| {
Some(CollaborationMode {
@@ -4917,16 +4929,19 @@ mod handlers {
personality,
app_server_client_name: None,
app_server_client_version: None,
submission_type,
},
)
}
Op::UserInput {
items,
final_output_json_schema,
submission_type,
} => (
items,
SessionSettingsUpdate {
final_output_json_schema: Some(final_output_json_schema),
submission_type,
..Default::default()
},
),
@@ -5733,6 +5748,7 @@ async fn spawn_review_thread(
current_date: parent_turn_context.current_date.clone(),
timezone: parent_turn_context.timezone.clone(),
app_server_client_name: parent_turn_context.app_server_client_name.clone(),
submission_type: None,
developer_instructions: None,
user_instructions: None,
compact_prompt: parent_turn_context.compact_prompt.clone(),
@@ -6371,7 +6387,11 @@ async fn track_turn_resolved_config_analytics(
matches!(item, UserInput::Image { .. } | UserInput::LocalImage { .. })
})
.count(),
submission_type: None,
submission_type: Some(
turn_context
.submission_type
.unwrap_or(SubmissionType::Default),
),
model: turn_context.model_info.slug.clone(),
model_provider: turn_context.config.model_provider_id.clone(),
sandbox_policy: turn_context.sandbox_policy.get().clone(),
+1
View File
@@ -186,6 +186,7 @@ pub(crate) async fn run_codex_thread_one_shot(
io.submit(Op::UserInput {
items: input,
final_output_json_schema,
submission_type: None,
})
.await?;
+6
View File
@@ -1197,6 +1197,7 @@ async fn fork_startup_context_then_first_turn_diff_snapshot() -> anyhow::Result<
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1252,6 +1253,7 @@ async fn fork_startup_context_then_first_turn_diff_snapshot() -> anyhow::Result<
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&forked.thread, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2811,6 +2813,7 @@ pub(crate) async fn make_session_and_context() -> (Session, TurnContext) {
/*network*/ None,
Some(environment),
"turn_id".to_string(),
/*submission_type*/ None,
Arc::clone(&js_repl),
skills_outcome,
);
@@ -3149,6 +3152,7 @@ fn op_kind_distinguishes_turn_ops() {
Op::UserInput {
items: vec![],
final_output_json_schema: None,
submission_type: None,
}
.kind(),
"user_input"
@@ -3179,6 +3183,7 @@ async fn user_turn_updates_approvals_reviewer() {
final_output_json_schema: None,
collaboration_mode: None,
personality: config.personality,
submission_type: None,
},
)
.await;
@@ -3653,6 +3658,7 @@ pub(crate) async fn make_session_and_context_with_dynamic_tools_and_rx(
/*network*/ None,
Some(environment),
"turn_id".to_string(),
/*submission_type*/ None,
Arc::clone(&js_repl),
skills_outcome,
));
@@ -523,6 +523,7 @@ async fn run_review_on_session(
final_output_json_schema: Some(params.schema.clone()),
collaboration_mode: None,
personality: params.personality,
submission_type: None,
})
.await
}),
@@ -2004,6 +2004,7 @@ async fn send_input_accepts_structured_items() {
},
],
final_output_json_schema: None,
submission_type: None,
};
let captured = manager
.captured_ops()
+1
View File
@@ -760,6 +760,7 @@ impl TestCodex {
service_tier,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+5
View File
@@ -51,6 +51,7 @@ async fn interrupt_long_running_tool_emits_turn_aborted() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -105,6 +106,7 @@ async fn interrupt_tool_records_history_entries() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -123,6 +125,7 @@ async fn interrupt_tool_records_history_entries() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -203,6 +206,7 @@ async fn interrupt_persists_turn_aborted_marker_in_next_request() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -221,6 +225,7 @@ async fn interrupt_persists_turn_aborted_marker_in_next_request() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -368,6 +368,7 @@ async fn apply_patch_cli_move_without_content_change_has_no_turn_diff(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -978,6 +979,7 @@ async fn apply_patch_shell_command_heredoc_with_cd_emits_turn_diff() -> Result<(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1060,6 +1062,7 @@ async fn apply_patch_shell_command_failure_propagates_error_and_skips_diff() ->
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1212,6 +1215,7 @@ async fn apply_patch_emits_turn_diff_event_with_unified_diff(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1277,6 +1281,7 @@ async fn apply_patch_turn_diff_for_rename_with_content_change(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1350,6 +1355,7 @@ async fn apply_patch_aggregates_diff_across_multiple_tool_calls() -> Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1423,6 +1429,7 @@ async fn apply_patch_aggregates_diff_preserves_success_after_failure() -> Result
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+1
View File
@@ -597,6 +597,7 @@ async fn submit_turn(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+34
View File
@@ -387,6 +387,7 @@ async fn resume_includes_initial_messages_and_sends_prior_items() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -749,6 +750,7 @@ async fn includes_conversation_id_and_model_headers_in_request() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -947,6 +949,7 @@ async fn includes_base_instructions_override_in_request() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -993,6 +996,7 @@ async fn omits_explicit_null_base_instructions_from_request() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1041,6 +1045,7 @@ async fn chatgpt_auth_sends_correct_request() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1154,6 +1159,7 @@ async fn prefers_apikey_when_config_prefers_apikey_even_with_chatgpt_tokens() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1190,6 +1196,7 @@ async fn includes_user_instructions_message_in_request() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1275,6 +1282,7 @@ async fn includes_apps_guidance_as_developer_message_for_chatgpt_auth() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1335,6 +1343,7 @@ async fn omits_apps_guidance_for_api_key_auth_even_when_feature_enabled() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1391,6 +1400,7 @@ async fn omits_apps_guidance_when_configured_off() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1430,6 +1440,7 @@ async fn omits_environment_context_when_configured_off() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1484,6 +1495,7 @@ async fn skills_append_to_developer_message() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1535,6 +1547,7 @@ async fn includes_configured_effort_in_request() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1577,6 +1590,7 @@ async fn includes_no_effort_in_request() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1617,6 +1631,7 @@ async fn includes_default_reasoning_effort_in_request_when_defined_by_model_info
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1687,6 +1702,7 @@ async fn user_turn_collaboration_mode_overrides_model_and_effort() -> anyhow::Re
collaboration_mode: Some(collaboration_mode),
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1729,6 +1745,7 @@ async fn configured_reasoning_summary_is_sent() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1801,6 +1818,7 @@ async fn user_turn_explicit_reasoning_summary_overrides_model_catalog_default()
collaboration_mode: None,
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await
.unwrap();
@@ -1844,6 +1862,7 @@ async fn reasoning_summary_is_omitted_when_disabled() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1900,6 +1919,7 @@ async fn reasoning_summary_none_overrides_model_catalog_default() -> anyhow::Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1936,6 +1956,7 @@ async fn includes_default_verbosity_in_request() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1981,6 +2002,7 @@ async fn configured_verbosity_not_sent_for_models_without_support() -> anyhow::R
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2025,6 +2047,7 @@ async fn configured_verbosity_is_sent() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2074,6 +2097,7 @@ async fn includes_developer_instructions_message_in_request() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2364,6 +2388,7 @@ async fn token_count_includes_rate_limits_snapshot() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2529,6 +2554,7 @@ async fn usage_limit_error_emits_rate_limit_event() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submission should succeed while emitting usage limit error events");
@@ -2603,6 +2629,7 @@ async fn context_window_error_sets_total_tokens_to_model_window() -> anyhow::Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -2615,6 +2642,7 @@ async fn context_window_error_sets_total_tokens_to_model_window() -> anyhow::Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -2697,6 +2725,7 @@ async fn incomplete_response_emits_content_filter_error_message() -> anyhow::Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -2804,6 +2833,7 @@ async fn azure_overrides_assign_properties_used_for_responses_url() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2889,6 +2919,7 @@ async fn env_var_overrides_loaded_auth() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2950,6 +2981,7 @@ async fn history_dedupes_streamed_and_final_messages_across_turns() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2963,6 +2995,7 @@ async fn history_dedupes_streamed_and_final_messages_across_turns() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2976,6 +3009,7 @@ async fn history_dedupes_streamed_and_final_messages_across_turns() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1003,6 +1003,7 @@ async fn responses_websocket_usage_limit_error_emits_rate_limit_event() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submission should succeed while emitting usage limit error events");
@@ -1088,6 +1089,7 @@ async fn responses_websocket_invalid_request_error_with_status_is_forwarded() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submission should succeed while emitting invalid request events");
+1
View File
@@ -2368,6 +2368,7 @@ text(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -84,6 +84,7 @@ async fn no_collaboration_instructions_by_default() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -143,6 +144,7 @@ async fn user_input_includes_collaboration_instructions_after_override() -> Resu
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -191,6 +193,7 @@ async fn collaboration_instructions_added_on_user_turn() -> Result<()> {
collaboration_mode: Some(collaboration_mode),
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -241,6 +244,7 @@ async fn override_then_next_turn_uses_updated_collaboration_instructions() -> Re
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -307,6 +311,7 @@ async fn user_turn_overrides_collaboration_instructions_after_override() -> Resu
collaboration_mode: Some(turn_mode),
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -364,6 +369,7 @@ async fn collaboration_mode_update_emits_new_instruction_message() -> Result<()>
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -391,6 +397,7 @@ async fn collaboration_mode_update_emits_new_instruction_message() -> Result<()>
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -447,6 +454,7 @@ async fn collaboration_mode_update_noop_does_not_append() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -474,6 +482,7 @@ async fn collaboration_mode_update_noop_does_not_append() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -532,6 +541,7 @@ async fn collaboration_mode_update_emits_new_instruction_message_when_mode_chang
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -562,6 +572,7 @@ async fn collaboration_mode_update_emits_new_instruction_message_when_mode_chang
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -621,6 +632,7 @@ async fn collaboration_mode_update_noop_does_not_append_when_mode_is_unchanged()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -651,6 +663,7 @@ async fn collaboration_mode_update_noop_does_not_append_when_mode_is_unchanged()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -714,6 +727,7 @@ async fn resume_replays_collaboration_instructions() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -727,6 +741,7 @@ async fn resume_replays_collaboration_instructions() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -783,6 +798,7 @@ async fn empty_collaboration_instructions_are_ignored() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
+36
View File
@@ -245,6 +245,7 @@ async fn summarize_context_three_requests_and_instructions() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -267,6 +268,7 @@ async fn summarize_context_three_requests_and_instructions() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -443,6 +445,7 @@ async fn manual_compact_uses_custom_prompt() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit first user turn");
@@ -587,6 +590,7 @@ async fn manual_compact_emits_context_compaction_items() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -750,6 +754,7 @@ async fn multiple_auto_compact_per_task_runs_after_token_limit_hit() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit user input");
@@ -1249,6 +1254,7 @@ async fn auto_compact_runs_after_token_limit_hit() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1262,6 +1268,7 @@ async fn auto_compact_runs_after_token_limit_hit() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1275,6 +1282,7 @@ async fn auto_compact_runs_after_token_limit_hit() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1443,6 +1451,7 @@ async fn auto_compact_emits_context_compaction_items() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1521,6 +1530,7 @@ async fn auto_compact_starts_after_turn_started() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1533,6 +1543,7 @@ async fn auto_compact_starts_after_turn_started() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1545,6 +1556,7 @@ async fn auto_compact_starts_after_turn_started() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1668,6 +1680,7 @@ async fn auto_compact_runs_after_resume_when_token_usage_is_over_limit() {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await
.unwrap();
@@ -1759,6 +1772,7 @@ async fn pre_sampling_compact_runs_on_switch_to_smaller_context_model() {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await
.expect("submit first user turn");
@@ -1784,6 +1798,7 @@ async fn pre_sampling_compact_runs_on_switch_to_smaller_context_model() {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await
.expect("submit second user turn");
@@ -1895,6 +1910,7 @@ async fn pre_sampling_compact_runs_after_resume_and_switch_to_smaller_model() {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await
.expect("submit pre-resume turn");
@@ -1944,6 +1960,7 @@ async fn pre_sampling_compact_runs_after_resume_and_switch_to_smaller_model() {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await
.expect("submit resumed user turn");
@@ -2037,6 +2054,7 @@ async fn auto_compact_persists_rollout_entries() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2049,6 +2067,7 @@ async fn auto_compact_persists_rollout_entries() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2061,6 +2080,7 @@ async fn auto_compact_persists_rollout_entries() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2147,6 +2167,7 @@ async fn manual_compact_retries_after_context_window_error() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2258,6 +2279,7 @@ async fn manual_compact_non_context_failure_retries_then_emits_task_error() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit user input");
@@ -2350,6 +2372,7 @@ async fn manual_compact_twice_preserves_latest_user_messages() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2365,6 +2388,7 @@ async fn manual_compact_twice_preserves_latest_user_messages() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2380,6 +2404,7 @@ async fn manual_compact_twice_preserves_latest_user_messages() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2541,6 +2566,7 @@ async fn auto_compact_allows_multiple_attempts_when_interleaved_with_other_turn_
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2643,6 +2669,7 @@ async fn snapshot_request_shape_mid_turn_continuation_compaction() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2839,6 +2866,7 @@ async fn auto_compact_counts_encrypted_reasoning_before_last_user() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2956,6 +2984,7 @@ async fn auto_compact_runs_when_reasoning_header_clears_between_turns() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -3015,6 +3044,7 @@ async fn snapshot_request_shape_pre_turn_compaction_including_incoming_user_mess
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit user input");
@@ -3050,6 +3080,7 @@ async fn snapshot_request_shape_pre_turn_compaction_including_incoming_user_mess
},
],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit user input");
@@ -3149,6 +3180,7 @@ async fn snapshot_request_shape_pre_turn_compaction_strips_incoming_model_switch
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await
.expect("submit first user turn");
@@ -3174,6 +3206,7 @@ async fn snapshot_request_shape_pre_turn_compaction_strips_incoming_model_switch
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await
.expect("submit second user turn");
@@ -3260,6 +3293,7 @@ async fn snapshot_request_shape_pre_turn_compaction_context_window_exceeded() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit first user");
@@ -3272,6 +3306,7 @@ async fn snapshot_request_shape_pre_turn_compaction_context_window_exceeded() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit second user");
@@ -3342,6 +3377,7 @@ async fn snapshot_request_shape_manual_compact_without_previous_user_messages()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit follow-up user input");
@@ -235,6 +235,7 @@ async fn remote_compact_replaces_history_for_followups() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -249,6 +250,7 @@ async fn remote_compact_replaces_history_for_followups() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -379,6 +381,7 @@ async fn remote_compact_runs_automatically() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -453,6 +456,7 @@ async fn remote_compact_trims_function_call_history_to_fit_context_window() -> R
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -464,6 +468,7 @@ async fn remote_compact_trims_function_call_history_to_fit_context_window() -> R
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -579,6 +584,7 @@ async fn auto_remote_compact_trims_function_call_history_to_fit_context_window()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -590,6 +596,7 @@ async fn auto_remote_compact_trims_function_call_history_to_fit_context_window()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -607,6 +614,7 @@ async fn auto_remote_compact_trims_function_call_history_to_fit_context_window()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -704,6 +712,7 @@ async fn auto_remote_compact_failure_stops_agent_loop() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -715,6 +724,7 @@ async fn auto_remote_compact_failure_stops_agent_loop() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -806,6 +816,7 @@ async fn remote_compact_trim_estimate_uses_session_base_instructions() -> Result
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&baseline_codex, |event| {
@@ -820,6 +831,7 @@ async fn remote_compact_trim_estimate_uses_session_base_instructions() -> Result
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&baseline_codex, |event| {
@@ -905,6 +917,7 @@ async fn remote_compact_trim_estimate_uses_session_base_instructions() -> Result
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&override_codex, |event| {
@@ -919,6 +932,7 @@ async fn remote_compact_trim_estimate_uses_session_base_instructions() -> Result
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&override_codex, |event| {
@@ -987,6 +1001,7 @@ async fn remote_manual_compact_emits_context_compaction_items() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -1065,6 +1080,7 @@ async fn remote_manual_compact_failure_emits_task_error_event() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -1147,6 +1163,7 @@ async fn remote_compact_persists_replacement_history_in_rollout() -> Result<()>
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1288,6 +1305,7 @@ async fn remote_compact_and_resume_refresh_stale_developer_instructions() -> Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1303,6 +1321,7 @@ async fn remote_compact_and_resume_refresh_stale_developer_instructions() -> Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1325,6 +1344,7 @@ async fn remote_compact_and_resume_refresh_stale_developer_instructions() -> Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1419,6 +1439,7 @@ async fn remote_compact_refreshes_stale_developer_instructions_without_resume()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1433,6 +1454,7 @@ async fn remote_compact_refreshes_stale_developer_instructions_without_resume()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1502,6 +1524,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_restates_realtime_sta
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1513,6 +1536,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_restates_realtime_sta
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1577,6 +1601,7 @@ async fn remote_request_uses_custom_experimental_realtime_start_instructions() -
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1635,6 +1660,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_restates_realtime_end
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1648,6 +1674,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_restates_realtime_end
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1720,6 +1747,7 @@ async fn snapshot_request_shape_remote_manual_compact_restates_realtime_start()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1734,6 +1762,7 @@ async fn snapshot_request_shape_remote_manual_compact_restates_realtime_start()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1814,6 +1843,7 @@ async fn snapshot_request_shape_remote_mid_turn_compaction_does_not_restate_real
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1827,6 +1857,7 @@ async fn snapshot_request_shape_remote_mid_turn_compaction_does_not_restate_real
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1915,6 +1946,7 @@ async fn snapshot_request_shape_remote_compact_resume_restates_realtime_end() ->
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -1942,6 +1974,7 @@ async fn snapshot_request_shape_remote_compact_resume_restates_realtime_end() ->
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2035,6 +2068,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_including_incoming_us
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2119,6 +2153,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_strips_incoming_model
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2145,6 +2180,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_strips_incoming_model
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2261,6 +2297,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_context_window_exceed
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2272,6 +2309,7 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_context_window_exceed
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
let error_message = wait_for_event_match(&codex, |event| match event {
@@ -2354,6 +2392,7 @@ async fn snapshot_request_shape_remote_mid_turn_continuation_compaction() -> Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2429,6 +2468,7 @@ async fn snapshot_request_shape_remote_mid_turn_compaction_summary_only_reinject
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2512,6 +2552,7 @@ async fn snapshot_request_shape_remote_mid_turn_compaction_multi_summary_reinjec
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2526,6 +2567,7 @@ async fn snapshot_request_shape_remote_mid_turn_compaction_multi_summary_reinjec
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -2605,6 +2647,7 @@ async fn snapshot_request_shape_remote_manual_compact_without_previous_user_mess
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -808,6 +808,7 @@ async fn user_turn(conversation: &Arc<CodexThread>, text: &str) {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.expect("submit user turn");
+2
View File
@@ -59,6 +59,7 @@ async fn submit_user_turn(
service_tier: None,
collaboration_mode,
personality: None,
submission_type: None,
})
.await?;
Ok(())
@@ -140,6 +141,7 @@ async fn execpolicy_blocks_shell_invocation() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+1
View File
@@ -53,6 +53,7 @@ async fn fork_thread_twice_drops_to_first_message() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
+2
View File
@@ -904,6 +904,7 @@ async fn blocked_queued_prompt_does_not_strand_earlier_accepted_prompt() -> Resu
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -920,6 +921,7 @@ async fn blocked_queued_prompt_does_not_strand_earlier_accepted_prompt() -> Resu
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
}
@@ -130,6 +130,7 @@ async fn copy_paste_local_image_persists_rollout_request_shape() -> anyhow::Resu
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -214,6 +215,7 @@ async fn drag_drop_image_persists_rollout_request_shape() -> anyhow::Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+14
View File
@@ -86,6 +86,7 @@ async fn user_message_item_is_emitted() -> anyhow::Result<()> {
.submit(Op::UserInput {
items: vec![expected_input.clone()],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -142,6 +143,7 @@ async fn assistant_message_item_is_emitted() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -200,6 +202,7 @@ async fn reasoning_item_is_emitted() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -259,6 +262,7 @@ async fn web_search_item_is_emitted() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -323,6 +327,7 @@ async fn image_generation_call_event_is_emitted() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -385,6 +390,7 @@ async fn image_generation_call_event_is_emitted_when_image_save_fails() -> anyho
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -438,6 +444,7 @@ async fn agent_message_content_delta_has_item_metadata() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -530,6 +537,7 @@ async fn plan_mode_emits_plan_item_from_proposed_plan_block() -> anyhow::Result<
service_tier: None,
collaboration_mode: Some(collaboration_mode),
personality: None,
submission_type: None,
})
.await?;
@@ -607,6 +615,7 @@ async fn plan_mode_strips_plan_from_agent_messages() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: Some(collaboration_mode),
personality: None,
submission_type: None,
})
.await?;
@@ -716,6 +725,7 @@ async fn plan_mode_streaming_citations_are_stripped_across_added_deltas_and_done
service_tier: None,
collaboration_mode: Some(collaboration_mode),
personality: None,
submission_type: None,
})
.await?;
@@ -903,6 +913,7 @@ async fn plan_mode_streaming_proposed_plan_tag_split_across_added_and_delta_is_p
service_tier: None,
collaboration_mode: Some(collaboration_mode),
personality: None,
submission_type: None,
})
.await?;
@@ -1017,6 +1028,7 @@ async fn plan_mode_handles_missing_plan_close_tag() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: Some(collaboration_mode),
personality: None,
submission_type: None,
})
.await?;
@@ -1085,6 +1097,7 @@ async fn reasoning_content_delta_has_item_metadata() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -1144,6 +1157,7 @@ async fn reasoning_raw_content_delta_respects_flag() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
+1
View File
@@ -88,6 +88,7 @@ async fn codex_returns_json_result(model: String) -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+1
View File
@@ -69,6 +69,7 @@ async fn submit_skill_turn(test: &TestCodex, skill_path: PathBuf, prompt: &str)
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -134,6 +134,7 @@ async fn model_change_appends_model_instructions_developer_message() -> Result<(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -171,6 +172,7 @@ async fn model_change_appends_model_instructions_developer_message() -> Result<(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -231,6 +233,7 @@ async fn model_and_personality_change_only_appends_model_instructions() -> Resul
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -268,6 +271,7 @@ async fn model_and_personality_change_only_appends_model_instructions() -> Resul
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -410,6 +414,7 @@ async fn model_change_from_image_to_text_strips_prior_image_content() -> Result<
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -431,6 +436,7 @@ async fn model_change_from_image_to_text_strips_prior_image_content() -> Result<
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -539,6 +545,7 @@ async fn generated_image_is_replayed_for_image_capable_models() -> Result<()> {
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -560,6 +567,7 @@ async fn generated_image_is_replayed_for_image_capable_models() -> Result<()> {
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -671,6 +679,7 @@ async fn model_change_from_generated_image_to_text_preserves_prior_generated_ima
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -692,6 +701,7 @@ async fn model_change_from_generated_image_to_text_preserves_prior_generated_ima
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -805,6 +815,7 @@ async fn thread_rollback_after_generated_image_drops_entire_image_turn_history()
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -834,6 +845,7 @@ async fn thread_rollback_after_generated_image_drops_entire_image_turn_history()
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -989,6 +1001,7 @@ async fn model_switch_to_smaller_model_updates_token_context_window() -> Result<
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1048,6 +1061,7 @@ async fn model_switch_to_smaller_model_updates_token_context_window() -> Result<
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -129,6 +129,7 @@ async fn snapshot_model_visible_layout_turn_overrides() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |event| {
@@ -153,6 +154,7 @@ async fn snapshot_model_visible_layout_turn_overrides() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: Some(Personality::Friendly),
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |event| {
@@ -232,6 +234,7 @@ async fn snapshot_model_visible_layout_cwd_change_does_not_refresh_agents() -> R
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |event| {
@@ -256,6 +259,7 @@ async fn snapshot_model_visible_layout_cwd_change_does_not_refresh_agents() -> R
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |event| {
@@ -322,6 +326,7 @@ async fn snapshot_model_visible_layout_resume_with_personality_change() -> Resul
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -366,6 +371,7 @@ async fn snapshot_model_visible_layout_resume_with_personality_change() -> Resul
service_tier: None,
collaboration_mode: None,
personality: Some(Personality::Friendly),
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |event| {
@@ -421,6 +427,7 @@ async fn snapshot_model_visible_layout_resume_override_matches_rollout_model() -
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -466,6 +473,7 @@ async fn snapshot_model_visible_layout_resume_override_matches_rollout_model() -
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |event| {
@@ -105,6 +105,7 @@ async fn renews_cache_ttl_on_matching_models_etag() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -110,6 +110,7 @@ async fn refresh_models_on_models_etag_mismatch_and_avoid_duplicate_models_fetch
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+22
View File
@@ -107,6 +107,7 @@ async fn responses_api_emits_api_request_event() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -150,6 +151,7 @@ async fn process_sse_emits_tracing_for_output_item() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -193,6 +195,7 @@ async fn process_sse_emits_failed_event_on_parse_error() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -237,6 +240,7 @@ async fn process_sse_records_failed_event_when_stream_closes_without_completed()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -301,6 +305,7 @@ async fn process_sse_failed_event_records_response_error_message() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -363,6 +368,7 @@ async fn process_sse_failed_event_logs_parse_error() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -412,6 +418,7 @@ async fn process_sse_failed_event_logs_missing_error() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -470,6 +477,7 @@ async fn process_sse_failed_event_logs_response_completed_parse_error() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -522,6 +530,7 @@ async fn process_sse_emits_completed_telemetry() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -594,6 +603,7 @@ async fn handle_responses_span_records_response_kind_and_tool_name() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -678,6 +688,7 @@ async fn record_responses_sets_span_fields_for_response_events() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -762,6 +773,7 @@ async fn handle_response_item_records_tool_result_for_custom_tool_call() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -835,6 +847,7 @@ async fn handle_response_item_records_tool_result_for_function_call() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -918,6 +931,7 @@ async fn handle_response_item_records_tool_result_for_local_shell_missing_ids()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -986,6 +1000,7 @@ async fn handle_response_item_records_tool_result_for_local_shell_call() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1094,6 +1109,7 @@ async fn handle_container_exec_autoapprove_from_config_records_tool_decision() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1145,6 +1161,7 @@ async fn handle_container_exec_user_approved_records_tool_decision() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1211,6 +1228,7 @@ async fn handle_container_exec_user_approved_for_session_records_tool_decision()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1277,6 +1295,7 @@ async fn handle_sandbox_error_user_approves_retry_records_tool_decision() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1343,6 +1362,7 @@ async fn handle_container_exec_user_denies_records_tool_decision() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1409,6 +1429,7 @@ async fn handle_sandbox_error_user_approves_for_session_records_tool_decision()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -1476,6 +1497,7 @@ async fn handle_sandbox_error_user_denies_records_tool_decision() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -96,6 +96,7 @@ async fn submit_user_input(codex: &CodexThread, text: &str) {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap_or_else(|err| panic!("submit user input: {err}"));
@@ -240,6 +241,7 @@ async fn injected_user_input_triggers_follow_up_request_with_deltas() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -256,6 +258,7 @@ async fn injected_user_input_triggers_follow_up_request_with_deltas() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -53,6 +53,7 @@ async fn permissions_message_sent_once_on_start() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -90,6 +91,7 @@ async fn permissions_message_added_on_override_change() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -117,6 +119,7 @@ async fn permissions_message_added_on_override_change() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -160,6 +163,7 @@ async fn permissions_message_not_added_when_no_change() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -171,6 +175,7 @@ async fn permissions_message_not_added_when_no_change() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -214,6 +219,7 @@ async fn permissions_message_omitted_when_disabled() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -241,6 +247,7 @@ async fn permissions_message_omitted_when_disabled() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -297,6 +304,7 @@ async fn resume_replays_permissions_messages() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -326,6 +334,7 @@ async fn resume_replays_permissions_messages() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -339,6 +348,7 @@ async fn resume_replays_permissions_messages() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -396,6 +406,7 @@ async fn resume_and_fork_append_permissions_messages() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -425,6 +436,7 @@ async fn resume_and_fork_append_permissions_messages() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&initial.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -444,6 +456,7 @@ async fn resume_and_fork_append_permissions_messages() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -476,6 +489,7 @@ async fn resume_and_fork_append_permissions_messages() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&forked.thread, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -528,6 +542,7 @@ async fn permissions_message_includes_writable_roots() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
+13
View File
@@ -111,6 +111,7 @@ async fn user_turn_personality_none_does_not_add_update_message() -> anyhow::Res
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -162,6 +163,7 @@ async fn config_personality_some_sets_instructions_template() -> anyhow::Result<
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -220,6 +222,7 @@ async fn config_personality_none_sends_no_personality() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -284,6 +287,7 @@ async fn default_personality_is_pragmatic_without_config_toml() -> anyhow::Resul
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -336,6 +340,7 @@ async fn user_turn_personality_some_adds_update_message() -> anyhow::Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -374,6 +379,7 @@ async fn user_turn_personality_some_adds_update_message() -> anyhow::Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -441,6 +447,7 @@ async fn user_turn_personality_same_value_does_not_add_update_message() -> anyho
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -479,6 +486,7 @@ async fn user_turn_personality_same_value_does_not_add_update_message() -> anyho
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -559,6 +567,7 @@ async fn user_turn_personality_skips_if_feature_disabled() -> anyhow::Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -597,6 +606,7 @@ async fn user_turn_personality_skips_if_feature_disabled() -> anyhow::Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -714,6 +724,7 @@ async fn remote_model_friendly_personality_instructions_with_feature() -> anyhow
service_tier: None,
collaboration_mode: None,
personality: Some(Personality::Friendly),
submission_type: None,
})
.await?;
@@ -833,6 +844,7 @@ async fn user_turn_personality_remote_model_template_includes_update_message() -
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -871,6 +883,7 @@ async fn user_turn_personality_remote_model_template_includes_update_message() -
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+3
View File
@@ -213,6 +213,7 @@ async fn capability_sections_render_in_developer_message_in_order() -> Result<()
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -288,6 +289,7 @@ async fn explicit_plugin_mentions_inject_plugin_guidance() -> Result<()> {
path: format!("plugin://{SAMPLE_PLUGIN_CONFIG_NAME}"),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -360,6 +362,7 @@ async fn explicit_plugin_mentions_track_plugin_used_analytics() -> Result<()> {
path: format!("plugin://{SAMPLE_PLUGIN_CONFIG_NAME}"),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -151,6 +151,7 @@ async fn prompt_tools_are_consistent_across_requests() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -162,6 +163,7 @@ async fn prompt_tools_are_consistent_across_requests() -> anyhow::Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -247,6 +249,7 @@ async fn gpt_5_tools_without_apply_patch_append_apply_patch_instructions() -> an
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -258,6 +261,7 @@ async fn gpt_5_tools_without_apply_patch_append_apply_patch_instructions() -> an
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -320,6 +324,7 @@ async fn prefixes_context_and_instructions_once_and_consistently_across_requests
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -331,6 +336,7 @@ async fn prefixes_context_and_instructions_once_and_consistently_across_requests
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -412,6 +418,7 @@ async fn overrides_turn_context_but_keeps_cached_prefix_and_key_constant() -> an
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -448,6 +455,7 @@ async fn overrides_turn_context_but_keeps_cached_prefix_and_key_constant() -> an
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -530,6 +538,7 @@ async fn override_before_first_turn_emits_environment_context() -> anyhow::Resul
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -681,6 +690,7 @@ async fn per_turn_overrides_keep_cached_prefix_and_key_constant() -> anyhow::Res
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -712,6 +722,7 @@ async fn per_turn_overrides_keep_cached_prefix_and_key_constant() -> anyhow::Res
collaboration_mode: None,
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -825,6 +836,7 @@ async fn send_user_turn_with_no_changes_does_not_send_environment_context() -> a
collaboration_mode: None,
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -846,6 +858,7 @@ async fn send_user_turn_with_no_changes_does_not_send_environment_context() -> a
collaboration_mode: None,
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -951,6 +964,7 @@ async fn send_user_turn_with_changes_sends_environment_context() -> anyhow::Resu
collaboration_mode: None,
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -972,6 +986,7 @@ async fn send_user_turn_with_changes_sends_environment_context() -> anyhow::Resu
collaboration_mode: None,
final_output_json_schema: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -46,6 +46,7 @@ async fn quota_exceeded_emits_single_error_event() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -2062,6 +2062,7 @@ async fn inbound_handoff_request_steers_active_turn() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -184,6 +184,7 @@ async fn remote_models_long_model_slug_is_sent_with_high_reasoning() -> Result<(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -247,6 +248,7 @@ async fn namespaced_model_slug_uses_catalog_metadata_without_fallback_warning()
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -407,6 +409,7 @@ async fn remote_models_remote_model_uses_unified_exec() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -630,6 +633,7 @@ async fn remote_models_apply_remote_base_instructions() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -45,6 +45,7 @@ async fn request_body_is_zstd_compressed_for_codex_backend_when_enabled() -> any
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -92,6 +93,7 @@ async fn request_body_is_not_compressed_for_api_key_auth_even_when_enabled() ->
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -202,6 +202,7 @@ async fn submit_turn(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
Ok(())
@@ -153,6 +153,7 @@ async fn submit_turn(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
Ok(())
@@ -153,6 +153,7 @@ async fn request_user_input_round_trip_for_mode(mode: ModeKind) -> anyhow::Resul
},
}),
personality: None,
submission_type: None,
})
.await?;
@@ -264,6 +265,7 @@ where
service_tier: None,
collaboration_mode: Some(collaboration_mode),
personality: None,
submission_type: None,
})
.await?;
+7
View File
@@ -91,6 +91,7 @@ async fn resume_includes_initial_messages_from_rollout_events() -> Result<()> {
text_elements: text_elements.clone(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -176,6 +177,7 @@ async fn resume_includes_initial_messages_from_reasoning_events() -> Result<()>
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -265,6 +267,7 @@ async fn resume_switches_models_preserves_base_instructions() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -305,6 +308,7 @@ async fn resume_switches_models_preserves_base_instructions() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |event| {
@@ -320,6 +324,7 @@ async fn resume_switches_models_preserves_base_instructions() -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |event| {
@@ -390,6 +395,7 @@ async fn resume_model_switch_is_not_duplicated_after_pre_turn_override() -> Resu
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
@@ -433,6 +439,7 @@ async fn resume_model_switch_is_not_duplicated_after_pre_turn_override() -> Resu
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&resumed.codex, |event| {
+1
View File
@@ -726,6 +726,7 @@ async fn review_history_surfaces_in_parent_session() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
+6
View File
@@ -138,6 +138,7 @@ async fn stdio_server_round_trip() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -309,6 +310,7 @@ async fn stdio_image_responses_round_trip() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -514,6 +516,7 @@ async fn stdio_image_responses_are_sanitized_for_text_only_model() -> anyhow::Re
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -630,6 +633,7 @@ async fn stdio_server_propagates_whitelisted_env_vars() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -793,6 +797,7 @@ async fn streamable_http_tool_call_round_trip() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1041,6 +1046,7 @@ async fn streamable_http_with_oauth_round_trip_impl() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -53,6 +53,7 @@ async fn openai_model_header_mismatch_emits_warning_event_and_warning_item() ->
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -152,6 +153,7 @@ async fn response_model_field_mismatch_emits_warning_when_header_matches_request
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -238,6 +240,7 @@ async fn openai_model_header_mismatch_only_emits_one_warning_per_turn() -> Resul
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -288,6 +291,7 @@ async fn openai_model_header_casing_only_mismatch_does_not_warn() -> Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+1
View File
@@ -427,6 +427,7 @@ async fn tool_search_returns_deferred_tools_without_follow_up_tool_injection() -
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
@@ -172,6 +172,7 @@ async fn run_snapshot_command_with_options(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -263,6 +264,7 @@ async fn run_shell_command_snapshot_with_options(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -334,6 +336,7 @@ async fn run_tool_turn_on_harness(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -568,6 +571,7 @@ async fn shell_command_snapshot_still_intercepts_apply_patch() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -59,6 +59,7 @@ async fn submit_turn_with_policies(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
Ok(())
+1
View File
@@ -82,6 +82,7 @@ async fn user_turn_includes_skill_instructions() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -405,6 +405,7 @@ async fn mcp_call_marks_thread_memory_mode_polluted_when_configured() -> Result<
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
wait_for_event(&test.codex, |event| {
@@ -98,6 +98,7 @@ async fn continue_after_stream_error() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -117,6 +118,7 @@ async fn continue_after_stream_error() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -82,6 +82,7 @@ async fn retries_on_early_close() {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
.unwrap();
@@ -93,6 +93,7 @@ async fn shell_tool_executes_command_and_streams_output() -> anyhow::Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -164,6 +165,7 @@ async fn update_plan_tool_emits_plan_update_event() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -245,6 +247,7 @@ async fn update_plan_tool_rejects_malformed_payload() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -341,6 +344,7 @@ async fn apply_patch_tool_executes_and_emits_patch_events() -> anyhow::Result<()
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -445,6 +449,7 @@ async fn apply_patch_reports_parse_diagnostics() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -50,6 +50,7 @@ async fn run_turn(test: &TestCodex, prompt: &str) -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -367,6 +368,7 @@ async fn shell_tools_start_before_response_completed_when_stream_delayed() -> an
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+1
View File
@@ -496,6 +496,7 @@ async fn mcp_image_output_preserves_image_and_no_text_summary() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -179,6 +179,7 @@ async fn submit_unified_exec_turn(
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -259,6 +260,7 @@ async fn unified_exec_intercepts_apply_patch_exec_command() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1747,6 +1749,7 @@ async fn unified_exec_keeps_long_running_session_after_turn_end() -> Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1840,6 +1843,7 @@ async fn unified_exec_interrupt_preserves_long_running_session() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -2312,6 +2316,7 @@ async fn unified_exec_runs_under_sandbox() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -2421,6 +2426,7 @@ async fn unified_exec_python_prompt_under_seatbelt() -> Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -62,6 +62,7 @@ mv "${tmp_path}" "${payload_path}""#,
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await;
@@ -185,6 +185,7 @@ async fn user_shell_command_does_not_replace_active_turn() -> anyhow::Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
+14
View File
@@ -164,6 +164,7 @@ async fn user_turn_with_local_image_attaches_image() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -273,6 +274,7 @@ async fn view_image_tool_attaches_local_image() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -414,6 +416,7 @@ async fn view_image_tool_can_preserve_original_resolution_when_requested_on_gpt5
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -520,6 +523,7 @@ async fn view_image_tool_errors_clearly_for_unsupported_detail_values() -> anyho
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -612,6 +616,7 @@ async fn view_image_tool_treats_null_detail_as_omitted() -> anyhow::Result<()> {
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -712,6 +717,7 @@ async fn view_image_tool_resizes_when_model_lacks_original_detail_support() -> a
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -823,6 +829,7 @@ async fn view_image_tool_does_not_force_original_resolution_with_capability_feat
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -925,6 +932,7 @@ await codex.emitImage(out);
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1045,6 +1053,7 @@ console.log(out.type);
summary: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1138,6 +1147,7 @@ async fn view_image_tool_errors_when_path_is_directory() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1214,6 +1224,7 @@ async fn view_image_tool_errors_for_non_image_files() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1295,6 +1306,7 @@ async fn view_image_tool_errors_when_file_missing() -> anyhow::Result<()> {
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1425,6 +1437,7 @@ async fn view_image_tool_returns_unsupported_message_for_text_only_model() -> an
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -1500,6 +1513,7 @@ async fn replaces_invalid_local_image_after_bad_request() -> anyhow::Result<()>
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -165,6 +165,7 @@ async fn websocket_fallback_hides_first_websocket_retry_stream_error() -> Result
service_tier: None,
collaboration_mode: None,
personality: None,
submission_type: None,
})
.await?;
@@ -109,6 +109,7 @@ async fn submit_user_turn(codex: &Arc<CodexThread>, text: &str) -> Result<()> {
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await?;
wait_for_event(codex, |event| matches!(event, EventMsg::TurnComplete(_))).await;
+1
View File
@@ -723,6 +723,7 @@ async fn run_exec_session(args: ExecRunArgs) -> anyhow::Result<()> {
effort: default_effort,
summary: None,
personality: None,
submission_type: None,
output_schema,
collaboration_mode: None,
},
@@ -114,6 +114,7 @@ pub async fn run_codex_tool_session(
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
},
trace: None,
};
@@ -161,6 +162,7 @@ pub async fn run_codex_tool_session_reply(
text_elements: Vec::new(),
}],
final_output_json_schema: None,
submission_type: None,
})
.await
{
+39
View File
@@ -103,6 +103,13 @@ pub const REALTIME_CONVERSATION_OPEN_TAG: &str = "<realtime_conversation>";
pub const REALTIME_CONVERSATION_CLOSE_TAG: &str = "</realtime_conversation>";
pub const USER_MESSAGE_BEGIN: &str = "## My request for Codex:";
#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "snake_case")]
pub enum SubmissionType {
Default,
Queued,
}
/// Submission Queue Entry - requests from user
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema)]
pub struct Submission {
@@ -244,6 +251,9 @@ pub enum Op {
/// Optional JSON Schema used to constrain the final assistant message for this turn.
#[serde(skip_serializing_if = "Option::is_none")]
final_output_json_schema: Option<Value>,
/// Metadata describing how the prompt was submitted.
#[serde(default, skip_serializing_if = "Option::is_none")]
submission_type: Option<SubmissionType>,
},
/// Similar to [`Op::UserInput`], but contains additional context required
@@ -301,6 +311,10 @@ pub enum Op {
/// Optional personality override for this turn.
#[serde(skip_serializing_if = "Option::is_none")]
personality: Option<Personality>,
/// Metadata describing how the prompt was submitted.
#[serde(default, skip_serializing_if = "Option::is_none")]
submission_type: Option<SubmissionType>,
},
/// Inter-agent communication that should be recorded as assistant history
@@ -517,6 +531,7 @@ impl From<Vec<UserInput>> for Op {
Op::UserInput {
items: value,
final_output_json_schema: None,
submission_type: None,
}
}
}
@@ -4484,6 +4499,7 @@ mod tests {
let op = Op::UserInput {
items: Vec::new(),
final_output_json_schema: None,
submission_type: None,
};
let json_op = serde_json::to_value(op)?;
@@ -4501,6 +4517,7 @@ mod tests {
Op::UserInput {
items: Vec::new(),
final_output_json_schema: None,
submission_type: None,
}
);
@@ -4520,6 +4537,7 @@ mod tests {
let op = Op::UserInput {
items: Vec::new(),
final_output_json_schema: Some(schema.clone()),
submission_type: None,
};
let json_op = serde_json::to_value(op)?;
@@ -4535,6 +4553,27 @@ mod tests {
Ok(())
}
#[test]
fn user_input_serialization_includes_submission_type_when_some() -> Result<()> {
let op = Op::UserInput {
items: Vec::new(),
final_output_json_schema: None,
submission_type: Some(SubmissionType::Queued),
};
let json_op = serde_json::to_value(op)?;
assert_eq!(
json_op,
json!({
"type": "user_input",
"items": [],
"submission_type": "queued",
})
);
Ok(())
}
#[test]
fn user_input_text_serializes_empty_text_elements() -> Result<()> {
let input = UserInput::Text {
+2
View File
@@ -2235,6 +2235,7 @@ impl App {
final_output_json_schema,
collaboration_mode,
personality,
submission_type,
} => {
let mut should_start_turn = true;
if let Some(turn_id) = self.active_turn_id_for_thread(thread_id).await {
@@ -2317,6 +2318,7 @@ impl App {
*service_tier,
collaboration_mode.clone(),
*personality,
*submission_type,
final_output_json_schema.clone(),
)
.await?;
+6
View File
@@ -17,6 +17,7 @@ use codex_protocol::protocol::Op;
use codex_protocol::protocol::ReviewDecision;
use codex_protocol::protocol::ReviewRequest;
use codex_protocol::protocol::SandboxPolicy;
use codex_protocol::protocol::SubmissionType;
use codex_protocol::request_permissions::RequestPermissionsResponse;
use codex_protocol::request_user_input::RequestUserInputResponse;
use codex_protocol::user_input::UserInput;
@@ -51,6 +52,7 @@ pub(crate) enum AppCommandView<'a> {
final_output_json_schema: &'a Option<Value>,
collaboration_mode: &'a Option<CollaborationMode>,
personality: &'a Option<Personality>,
submission_type: &'a Option<SubmissionType>,
},
OverrideTurnContext {
cwd: &'a Option<PathBuf>,
@@ -152,6 +154,7 @@ impl AppCommand {
final_output_json_schema: Option<Value>,
collaboration_mode: Option<CollaborationMode>,
personality: Option<Personality>,
submission_type: Option<SubmissionType>,
) -> Self {
Self(Op::UserTurn {
items,
@@ -166,6 +169,7 @@ impl AppCommand {
final_output_json_schema,
collaboration_mode,
personality,
submission_type,
})
}
@@ -311,6 +315,7 @@ impl AppCommand {
final_output_json_schema,
collaboration_mode,
personality,
submission_type,
} => AppCommandView::UserTurn {
items,
cwd,
@@ -324,6 +329,7 @@ impl AppCommand {
final_output_json_schema,
collaboration_mode,
personality,
submission_type,
},
Op::OverrideTurnContext {
cwd,
+3
View File
@@ -84,6 +84,7 @@ use codex_protocol::protocol::ReviewRequest;
use codex_protocol::protocol::ReviewTarget as CoreReviewTarget;
use codex_protocol::protocol::SandboxPolicy;
use codex_protocol::protocol::SessionNetworkProxyRuntime;
use codex_protocol::protocol::SubmissionType;
use color_eyre::eyre::ContextCompat;
use color_eyre::eyre::Result;
use color_eyre::eyre::WrapErr;
@@ -427,6 +428,7 @@ impl AppServerSession {
service_tier: Option<Option<codex_protocol::config_types::ServiceTier>>,
collaboration_mode: Option<codex_protocol::config_types::CollaborationMode>,
personality: Option<codex_protocol::config_types::Personality>,
submission_type: Option<SubmissionType>,
output_schema: Option<serde_json::Value>,
) -> Result<TurnStartResponse> {
let request_id = self.next_request_id();
@@ -445,6 +447,7 @@ impl AppServerSession {
effort,
summary,
personality,
submission_type,
output_schema,
collaboration_mode,
},
+16 -1
View File
@@ -193,6 +193,7 @@ use codex_protocol::protocol::ReviewTarget;
use codex_protocol::protocol::SkillMetadata as ProtocolSkillMetadata;
#[cfg(test)]
use codex_protocol::protocol::StreamErrorEvent;
use codex_protocol::protocol::SubmissionType;
use codex_protocol::protocol::TerminalInteractionEvent;
use codex_protocol::protocol::TokenUsage;
use codex_protocol::protocol::TokenUsageInfo;
@@ -5559,6 +5560,14 @@ impl ChatWidget {
}
fn submit_user_message(&mut self, user_message: UserMessage) {
self.submit_user_message_with_type(user_message, /*submission_type*/ None);
}
fn submit_user_message_with_type(
&mut self,
user_message: UserMessage,
submission_type: Option<SubmissionType>,
) {
if !self.is_session_configured() {
tracing::warn!("cannot submit user message before session is configured; queueing");
self.queued_user_messages.push_front(user_message);
@@ -5774,6 +5783,7 @@ impl ChatWidget {
/*final_output_json_schema*/ None,
collaboration_mode,
personality,
submission_type,
);
if !self.submit_op(op) {
@@ -7235,8 +7245,13 @@ impl ChatWidget {
if self.bottom_pane.is_task_running() {
return;
}
let submission_type = if self.rejected_steers_queue.is_empty() {
Some(SubmissionType::Queued)
} else {
None
};
if let Some(user_message) = self.pop_next_queued_user_message() {
self.submit_user_message(user_message);
self.submit_user_message_with_type(user_message, submission_type);
}
// Update the list to reflect the remaining queued messages (if any).
self.refresh_pending_input_preview();
@@ -642,6 +642,29 @@ async fn interrupted_turn_restore_keeps_active_mode_for_resubmission() {
assert_eq!(chat.active_collaboration_mode_kind(), expected_mode);
}
#[tokio::test]
async fn queued_user_message_marks_prompt_queued_submission_type() {
let (mut chat, _rx, mut op_rx) = make_chatwidget_manual(Some("gpt-5")).await;
chat.thread_id = Some(ThreadId::new());
chat.queued_user_messages.push_back(UserMessage {
text: "queued follow up".to_string(),
local_images: Vec::new(),
remote_image_urls: Vec::new(),
text_elements: Vec::new(),
mention_bindings: Vec::new(),
});
chat.maybe_send_next_queued_input();
match next_submit_op(&mut op_rx) {
Op::UserTurn {
submission_type: Some(SubmissionType::Queued),
..
} => {}
other => panic!("expected queued prompt submission, got {other:?}"),
}
}
#[tokio::test]
async fn remap_placeholders_uses_attachment_labels() {
let placeholder_one = "[Image #1]";