rework to isolate core

This commit is contained in:
Roy Han
2026-03-13 18:11:59 -07:00
parent f9570b714c
commit e9bf09ba09
74 changed files with 381 additions and 3403 deletions
+7
View File
@@ -63,6 +63,7 @@ async fn build_arc_monitor_request_includes_relevant_history_and_null_policies()
content: vec![ContentItem::InputText {
text: "first request".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}],
@@ -87,6 +88,7 @@ async fn build_arc_monitor_request_includes_relevant_history_and_null_policies()
content: vec![ContentItem::OutputText {
text: "commentary".to_string(),
}],
metadata: None,
end_turn: None,
phase: Some(MessagePhase::Commentary),
}],
@@ -101,6 +103,7 @@ async fn build_arc_monitor_request_includes_relevant_history_and_null_policies()
content: vec![ContentItem::OutputText {
text: "final response".to_string(),
}],
metadata: None,
end_turn: None,
phase: Some(MessagePhase::FinalAnswer),
}],
@@ -115,6 +118,7 @@ async fn build_arc_monitor_request_includes_relevant_history_and_null_policies()
content: vec![ContentItem::InputText {
text: "latest request".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}],
@@ -269,6 +273,7 @@ async fn monitor_action_posts_expected_arc_request() {
content: vec![ContentItem::InputText {
text: "please run the tool".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}],
@@ -348,6 +353,7 @@ async fn monitor_action_uses_env_url_and_token_overrides() {
content: vec![ContentItem::InputText {
text: "please run the tool".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}],
@@ -417,6 +423,7 @@ async fn monitor_action_rejects_legacy_response_fields() {
content: vec![ContentItem::InputText {
text: "please run the tool".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}],
+3
View File
@@ -2670,6 +2670,7 @@ impl Session {
.inject_response_items(vec![ResponseInputItem::Message {
role: "developer".to_string(),
content: vec![ContentItem::InputText { text }],
metadata: None,
}])
.await
.is_err()
@@ -2767,6 +2768,7 @@ impl Session {
.inject_response_items(vec![ResponseInputItem::Message {
role: "developer".to_string(),
content: vec![ContentItem::InputText { text }],
metadata: None,
}])
.await
.is_err()
@@ -3241,6 +3243,7 @@ impl Session {
content: vec![ContentItem::InputText {
text: format!("Warning: {}", message.into()),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -16,6 +16,7 @@ fn user_message(text: &str) -> ResponseItem {
content: vec![ContentItem::InputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -28,6 +29,7 @@ fn assistant_message(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
+14
View File
@@ -107,6 +107,7 @@ fn user_message(text: &str) -> ResponseItem {
content: vec![ContentItem::InputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -119,6 +120,7 @@ fn assistant_message(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -131,6 +133,7 @@ fn skill_message(text: &str) -> ResponseItem {
content: vec![ContentItem::InputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -682,6 +685,7 @@ async fn reconstruct_history_uses_replacement_history_verbatim() {
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -693,6 +697,7 @@ async fn reconstruct_history_uses_replacement_history_verbatim() {
content: vec![ContentItem::InputText {
text: "stale developer instructions".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -3338,6 +3343,7 @@ async fn record_context_updates_and_set_reference_context_item_reinjects_full_co
content: vec![ContentItem::InputText {
text: format!("{}\nsummary", crate::compact::SUMMARY_PREFIX),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -3701,6 +3707,7 @@ async fn task_finish_emits_turn_item_lifecycle_for_leftover_pending_user_input()
content: vec![ContentItem::InputText {
text: "late pending input".to_string(),
}],
metadata: None,
}])
.await
.expect("inject pending input into active turn");
@@ -3714,6 +3721,7 @@ async fn task_finish_emits_turn_item_lifecycle_for_leftover_pending_user_input()
content: vec![ContentItem::InputText {
text: "late pending input".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -4056,6 +4064,7 @@ async fn sample_rollout(
content: vec![ContentItem::InputText {
text: "first user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -4071,6 +4080,7 @@ async fn sample_rollout(
content: vec![ContentItem::OutputText {
text: "assistant reply one".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -4098,6 +4108,7 @@ async fn sample_rollout(
content: vec![ContentItem::InputText {
text: "second user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -4113,6 +4124,7 @@ async fn sample_rollout(
content: vec![ContentItem::OutputText {
text: "assistant reply two".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -4140,6 +4152,7 @@ async fn sample_rollout(
content: vec![ContentItem::InputText {
text: "third user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -4155,6 +4168,7 @@ async fn sample_rollout(
content: vec![ContentItem::OutputText {
text: "assistant reply three".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
+1
View File
@@ -123,6 +123,7 @@ impl CodexThread {
let pending_item = ResponseInputItem::Message {
role: "user".to_string(),
content: vec![ContentItem::InputText { text: message }],
metadata: None,
};
let pending_items = vec![pending_item];
let Err(items_without_active_turn) = self
+2
View File
@@ -367,6 +367,7 @@ fn build_compacted_history_with_limit(
content: vec![ContentItem::InputText {
text: message.clone(),
}],
metadata: None,
end_turn: None,
phase: None,
});
@@ -382,6 +383,7 @@ fn build_compacted_history_with_limit(
id: None,
role: "user".to_string(),
content: vec![ContentItem::InputText { text: summary_text }],
metadata: None,
end_turn: None,
phase: None,
});
+35
View File
@@ -59,6 +59,7 @@ fn collect_user_messages_extracts_user_text_only() {
content: vec![ContentItem::OutputText {
text: "ignored".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -68,6 +69,7 @@ fn collect_user_messages_extracts_user_text_only() {
content: vec![ContentItem::InputText {
text: "first".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -93,6 +95,7 @@ do things
</INSTRUCTIONS>"#
.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -102,6 +105,7 @@ do things
content: vec![ContentItem::InputText {
text: "<ENVIRONMENT_CONTEXT>cwd=/tmp</ENVIRONMENT_CONTEXT>".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -111,6 +115,7 @@ do things
content: vec![ContentItem::InputText {
text: "real user message".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -194,6 +199,7 @@ async fn process_compacted_history_replaces_developer_messages() {
content: vec![ContentItem::InputText {
text: "stale permissions".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -203,6 +209,7 @@ async fn process_compacted_history_replaces_developer_messages() {
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -212,6 +219,7 @@ async fn process_compacted_history_replaces_developer_messages() {
content: vec![ContentItem::InputText {
text: "stale personality".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -224,6 +232,7 @@ async fn process_compacted_history_replaces_developer_messages() {
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
});
@@ -238,6 +247,7 @@ async fn process_compacted_history_reinjects_full_initial_context() {
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}];
@@ -249,6 +259,7 @@ async fn process_compacted_history_reinjects_full_initial_context() {
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
});
@@ -269,6 +280,7 @@ keep me updated
</INSTRUCTIONS>"#
.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -282,6 +294,7 @@ keep me updated
</environment_context>"#
.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -295,6 +308,7 @@ keep me updated
</turn_aborted>"#
.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -304,6 +318,7 @@ keep me updated
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -313,6 +328,7 @@ keep me updated
content: vec![ContentItem::InputText {
text: "stale developer instructions".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -325,6 +341,7 @@ keep me updated
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
});
@@ -340,6 +357,7 @@ async fn process_compacted_history_inserts_context_before_last_real_user_message
content: vec![ContentItem::InputText {
text: "older user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -349,6 +367,7 @@ async fn process_compacted_history_inserts_context_before_last_real_user_message
content: vec![ContentItem::InputText {
text: format!("{SUMMARY_PREFIX}\nsummary text"),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -358,6 +377,7 @@ async fn process_compacted_history_inserts_context_before_last_real_user_message
content: vec![ContentItem::InputText {
text: "latest user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -372,6 +392,7 @@ async fn process_compacted_history_inserts_context_before_last_real_user_message
content: vec![ContentItem::InputText {
text: "older user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -381,6 +402,7 @@ async fn process_compacted_history_inserts_context_before_last_real_user_message
content: vec![ContentItem::InputText {
text: format!("{SUMMARY_PREFIX}\nsummary text"),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -392,6 +414,7 @@ async fn process_compacted_history_inserts_context_before_last_real_user_message
content: vec![ContentItem::InputText {
text: "latest user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
});
@@ -406,6 +429,7 @@ async fn process_compacted_history_reinjects_model_switch_message() {
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}];
@@ -436,6 +460,7 @@ async fn process_compacted_history_reinjects_model_switch_message() {
content: vec![ContentItem::InputText {
text: "summary".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
});
@@ -451,6 +476,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_summary_last()
content: vec![ContentItem::InputText {
text: "older user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -460,6 +486,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_summary_last()
content: vec![ContentItem::InputText {
text: "latest user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -469,6 +496,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_summary_last()
content: vec![ContentItem::InputText {
text: format!("{SUMMARY_PREFIX}\nsummary text"),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -479,6 +507,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_summary_last()
content: vec![ContentItem::InputText {
text: "fresh permissions".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}];
@@ -492,6 +521,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_summary_last()
content: vec![ContentItem::InputText {
text: "older user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -501,6 +531,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_summary_last()
content: vec![ContentItem::InputText {
text: "fresh permissions".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -510,6 +541,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_summary_last()
content: vec![ContentItem::InputText {
text: "latest user".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -519,6 +551,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_summary_last()
content: vec![ContentItem::InputText {
text: format!("{SUMMARY_PREFIX}\nsummary text"),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -537,6 +570,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_compaction_last
content: vec![ContentItem::InputText {
text: "fresh permissions".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}];
@@ -550,6 +584,7 @@ fn insert_initial_context_before_last_real_user_or_summary_keeps_compaction_last
content: vec![ContentItem::InputText {
text: "fresh permissions".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -33,6 +33,7 @@ fn assistant_msg(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -53,6 +54,7 @@ fn user_msg(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -65,6 +67,7 @@ fn user_input_text_msg(text: &str) -> ResponseItem {
content: vec![ContentItem::InputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -120,6 +123,7 @@ fn filters_non_api_messages() {
content: vec![ContentItem::OutputText {
text: "ignored".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -151,6 +155,7 @@ fn filters_non_api_messages() {
content: vec![ContentItem::OutputText {
text: "hi".to_string()
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -160,6 +165,7 @@ fn filters_non_api_messages() {
content: vec![ContentItem::OutputText {
text: "hello".to_string()
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -265,6 +271,7 @@ fn for_prompt_strips_images_when_model_does_not_support_images() {
text: "caption".to_string(),
},
],
metadata: None,
end_turn: None,
phase: None,
},
@@ -327,6 +334,7 @@ fn for_prompt_strips_images_when_model_does_not_support_images() {
text: "caption".to_string(),
},
],
metadata: None,
end_turn: None,
phase: None,
},
@@ -384,6 +392,7 @@ fn for_prompt_strips_images_when_model_does_not_support_images() {
image_url: "https://example.com/img.png".to_string(),
},
],
metadata: None,
end_turn: None,
phase: None,
}]);
@@ -412,6 +421,7 @@ fn for_prompt_rewrites_image_generation_calls_when_images_are_supported() {
content: vec![ContentItem::InputText {
text: "hi".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -437,6 +447,7 @@ fn for_prompt_rewrites_image_generation_calls_when_images_are_supported() {
image_url: "data:image/png;base64,Zm9v".to_string(),
},
],
metadata: None,
end_turn: None,
phase: None,
},
@@ -446,6 +457,7 @@ fn for_prompt_rewrites_image_generation_calls_when_images_are_supported() {
content: vec![ContentItem::InputText {
text: "hi".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -462,6 +474,7 @@ fn for_prompt_rewrites_image_generation_calls_when_images_are_unsupported() {
content: vec![ContentItem::InputText {
text: "generate a lobster".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -482,6 +495,7 @@ fn for_prompt_rewrites_image_generation_calls_when_images_are_unsupported() {
content: vec![ContentItem::InputText {
text: "generate a lobster".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -503,6 +517,7 @@ fn for_prompt_rewrites_image_generation_calls_when_images_are_unsupported() {
.to_string(),
},
],
metadata: None,
end_turn: None,
phase: None,
},
@@ -653,6 +668,7 @@ fn replace_last_turn_images_does_not_touch_user_images() {
content: vec![ContentItem::InputImage {
image_url: "data:image/png;base64,AAA".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}];
@@ -1507,6 +1523,7 @@ fn image_data_url_payload_does_not_dominate_message_estimate() {
},
ContentItem::InputImage { image_url },
],
metadata: None,
end_turn: None,
phase: None,
};
@@ -1516,6 +1533,7 @@ fn image_data_url_payload_does_not_dominate_message_estimate() {
content: vec![ContentItem::InputText {
text: "Here is the screenshot".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -1588,6 +1606,7 @@ fn non_base64_image_urls_are_unchanged() {
content: vec![ContentItem::InputImage {
image_url: "https://example.com/foo.png".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -1619,6 +1638,7 @@ fn data_url_without_base64_marker_is_unchanged() {
content: vec![ContentItem::InputImage {
image_url: "data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg'/>".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -1657,6 +1677,7 @@ fn mixed_case_data_url_markers_are_adjusted() {
id: None,
role: "user".to_string(),
content: vec![ContentItem::InputImage { image_url }],
metadata: None,
end_turn: None,
phase: None,
};
@@ -1688,6 +1709,7 @@ fn multiple_inline_images_apply_multiple_fixed_costs() {
image_url: image_url_two,
},
],
metadata: None,
end_turn: None,
phase: None,
};
@@ -1771,6 +1793,7 @@ fn text_only_items_unchanged() {
content: vec![ContentItem::OutputText {
text: "Hello world, this is a response.".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -322,6 +322,7 @@ pub(crate) fn rewrite_image_generation_calls_for_stateless_input(items: &mut Vec
},
ContentItem::InputImage { image_url },
],
metadata: None,
end_turn: None,
phase: None,
}
@@ -178,6 +178,7 @@ fn build_text_message(role: &str, text_sections: Vec<String>) -> Option<Response
id: None,
role: role.to_string(),
content,
metadata: None,
end_turn: None,
phase: None,
})
@@ -57,6 +57,7 @@ impl ContextualUserFragmentDefinition {
id: None,
role: "user".to_string(),
content: vec![ContentItem::InputText { text }],
metadata: None,
end_turn: None,
phase: None,
}
+10 -4
View File
@@ -29,6 +29,7 @@ fn parses_user_message_with_text_and_two_images() {
image_url: img2.clone(),
},
],
metadata: None,
end_turn: None,
phase: None,
};
@@ -72,6 +73,7 @@ fn skips_local_image_label_text() {
text: user_text.clone(),
},
],
metadata: None,
end_turn: None,
phase: None,
};
@@ -114,6 +116,7 @@ fn skips_unnamed_image_label_text() {
text: user_text.clone(),
},
],
metadata: None,
end_turn: None,
phase: None,
};
@@ -144,6 +147,7 @@ fn skips_user_instructions_and_env() {
content: vec![ContentItem::InputText {
text: "# AGENTS.md instructions for test_directory\n\n<INSTRUCTIONS>\ntest_text\n</INSTRUCTIONS>".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -153,6 +157,7 @@ fn skips_user_instructions_and_env() {
content: vec![ContentItem::InputText {
text: "<environment_context>test_text</environment_context>".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -162,6 +167,7 @@ fn skips_user_instructions_and_env() {
content: vec![ContentItem::InputText {
text: "# AGENTS.md instructions for test_directory\n\n<INSTRUCTIONS>\ntest_text\n</INSTRUCTIONS>".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -172,6 +178,7 @@ fn skips_user_instructions_and_env() {
text: "<skill>\n<name>demo</name>\n<path>skills/demo/SKILL.md</path>\nbody\n</skill>"
.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -181,6 +188,7 @@ fn skips_user_instructions_and_env() {
content: vec![ContentItem::InputText {
text: "<user_shell_command>echo 42</user_shell_command>".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -197,6 +205,7 @@ fn skips_user_instructions_and_env() {
.to_string(),
},
],
metadata: None,
end_turn: None,
phase: None,
},
@@ -216,6 +225,7 @@ fn parses_agent_message() {
content: vec![ContentItem::OutputText {
text: "Hello from Codex".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -320,7 +330,6 @@ fn parses_web_search_call() {
query: Some("weather".to_string()),
queries: None,
},
metadata: None,
}
),
other => panic!("expected TurnItem::WebSearch, got {other:?}"),
@@ -348,7 +357,6 @@ fn parses_web_search_open_page_call() {
action: WebSearchAction::OpenPage {
url: Some("https://example.com".to_string()),
},
metadata: None,
}
),
other => panic!("expected TurnItem::WebSearch, got {other:?}"),
@@ -378,7 +386,6 @@ fn parses_web_search_find_in_page_call() {
url: Some("https://example.com".to_string()),
pattern: Some("needle".to_string()),
},
metadata: None,
}
),
other => panic!("expected TurnItem::WebSearch, got {other:?}"),
@@ -401,7 +408,6 @@ fn parses_partial_web_search_call_without_action_as_other() {
id: "ws_partial".to_string(),
query: String::new(),
action: WebSearchAction::Other,
metadata: None,
}
),
other => panic!("expected TurnItem::WebSearch, got {other:?}"),
+6
View File
@@ -64,6 +64,7 @@ fn collect_guardian_transcript_entries_skips_contextual_user_messages() {
content: vec![ContentItem::InputText {
text: "<environment_context>\n<cwd>/tmp</cwd>\n</environment_context>".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -73,6 +74,7 @@ fn collect_guardian_transcript_entries_skips_contextual_user_messages() {
content: vec![ContentItem::OutputText {
text: "hello".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -99,6 +101,7 @@ fn collect_guardian_transcript_entries_includes_recent_tool_calls_and_output() {
content: vec![ContentItem::InputText {
text: "check the repo".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -121,6 +124,7 @@ fn collect_guardian_transcript_entries_includes_recent_tool_calls_and_output() {
content: vec![ContentItem::OutputText {
text: "I need to push a fix".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -314,6 +318,7 @@ async fn guardian_review_request_layout_matches_model_visible_request_snapshot()
text: "Please check the repo visibility and push the docs fix if needed."
.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -337,6 +342,7 @@ async fn guardian_review_request_layout_matches_model_visible_request_snapshot()
text: "The repo is public; I now need approval to push the docs fix."
.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
+1
View File
@@ -330,6 +330,7 @@ mod job {
&rollout_contents,
)?,
}],
metadata: None,
end_turn: None,
phase: None,
}],
+1
View File
@@ -1134,6 +1134,7 @@ async fn test_updated_at_uses_file_mtime() -> Result<()> {
content: vec![ContentItem::OutputText {
text: format!("reply-{idx}"),
}],
metadata: None,
end_turn: None,
phase: None,
}),
@@ -13,6 +13,7 @@ fn user_msg(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -25,6 +26,7 @@ fn assistant_msg(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -16,6 +16,7 @@ fn assistant_output_text(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: Some(true),
phase: None,
}
+1
View File
@@ -433,6 +433,7 @@ impl Session {
"{TURN_ABORTED_OPEN_TAG}\n{TURN_ABORTED_INTERRUPTED_GUIDANCE}\n</turn_aborted>"
),
}],
metadata: None,
end_turn: None,
phase: None,
};
+2
View File
@@ -239,6 +239,7 @@ pub(crate) async fn exit_review_mode(
id: Some(REVIEW_USER_MESSAGE_ID.to_string()),
role: "user".to_string(),
content: vec![ContentItem::InputText { text: user_message }],
metadata: None,
end_turn: None,
phase: None,
}],
@@ -260,6 +261,7 @@ pub(crate) async fn exit_review_mode(
content: vec![ContentItem::OutputText {
text: assistant_message,
}],
metadata: None,
end_turn: None,
phase: None,
},
+10 -1
View File
@@ -326,7 +326,16 @@ async fn persist_user_shell_output(
}
let response_input_item = match output_item {
ResponseItem::Message { role, content, .. } => ResponseInputItem::Message { role, content },
ResponseItem::Message {
role,
content,
metadata,
..
} => ResponseInputItem::Message {
role,
content,
metadata,
},
_ => unreachable!("user shell command output record should always be a message"),
};
@@ -16,6 +16,7 @@ fn user_msg(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -27,6 +28,7 @@ fn assistant_msg(text: &str) -> ResponseItem {
content: vec![ContentItem::OutputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
@@ -638,6 +638,7 @@ async fn resume_agent_restores_closed_agent_and_accepts_send_input() {
content: vec![ContentItem::InputText {
text: "materialized".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
})]),
+2 -2
View File
@@ -58,7 +58,6 @@ async fn turn_timing_state_records_ttfm_independently_of_ttft() {
id: "msg-1".to_string(),
content: Vec::new(),
phase: None,
metadata: None,
}))
.await
.is_some()
@@ -69,7 +68,6 @@ async fn turn_timing_state_records_ttfm_independently_of_ttft() {
id: "msg-2".to_string(),
content: Vec::new(),
phase: None,
metadata: None,
}))
.await,
None
@@ -102,6 +100,7 @@ fn response_item_records_turn_ttft_for_first_output_signals() {
content: vec![ContentItem::OutputText {
text: "hello".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}));
@@ -115,6 +114,7 @@ fn response_item_records_turn_ttft_ignores_empty_non_output_items() {
content: vec![ContentItem::OutputText {
text: String::new(),
}],
metadata: None,
end_turn: None,
phase: None,
}));
+1
View File
@@ -637,6 +637,7 @@ pub fn user_message_item(text: &str) -> ResponseItem {
content: vec![ContentItem::InputText {
text: text.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}
+3
View File
@@ -105,6 +105,7 @@ async fn responses_stream_includes_subagent_header_on_review() {
content: vec![ContentItem::InputText {
text: "hello".into(),
}],
metadata: None,
end_turn: None,
phase: None,
}];
@@ -218,6 +219,7 @@ async fn responses_stream_includes_subagent_header_on_other() {
content: vec![ContentItem::InputText {
text: "hello".into(),
}],
metadata: None,
end_turn: None,
phase: None,
}];
@@ -330,6 +332,7 @@ async fn responses_respects_model_info_overrides_from_config() {
content: vec![ContentItem::InputText {
text: "hello".into(),
}],
metadata: None,
end_turn: None,
phase: None,
}];
+5
View File
@@ -177,6 +177,7 @@ async fn resume_includes_initial_messages_and_sends_prior_items() {
content: vec![codex_protocol::models::ContentItem::InputText {
text: "resumed user message".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -199,6 +200,7 @@ async fn resume_includes_initial_messages_and_sends_prior_items() {
content: vec![codex_protocol::models::ContentItem::OutputText {
text: "resumed system instruction".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -221,6 +223,7 @@ async fn resume_includes_initial_messages_and_sends_prior_items() {
content: vec![codex_protocol::models::ContentItem::OutputText {
text: "resumed assistant message".to_string(),
}],
metadata: None,
end_turn: None,
phase: Some(MessagePhase::Commentary),
};
@@ -400,6 +403,7 @@ async fn resume_replays_legacy_js_repl_image_rollout_shapes() {
content: vec![ContentItem::InputImage {
image_url: legacy_image_url.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
}),
@@ -1865,6 +1869,7 @@ async fn azure_responses_request_includes_store_and_reasoning_ids() {
content: vec![ContentItem::OutputText {
text: "message".into(),
}],
metadata: None,
end_turn: None,
phase: None,
});
@@ -1470,6 +1470,7 @@ fn message_item(text: &str) -> ResponseItem {
id: None,
role: "user".into(),
content: vec![ContentItem::InputText { text: text.into() }],
metadata: None,
end_turn: None,
phase: None,
}
@@ -1480,6 +1481,7 @@ fn assistant_message_item(id: &str, text: &str) -> ResponseItem {
id: Some(id.to_string()),
role: "assistant".into(),
content: vec![ContentItem::OutputText { text: text.into() }],
metadata: None,
end_turn: None,
phase: None,
}
+3
View File
@@ -1586,6 +1586,7 @@ async fn auto_compact_runs_after_resume_when_token_usage_is_over_limit() {
content: vec![codex_protocol::models::ContentItem::OutputText {
text: remote_summary.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -2795,6 +2796,7 @@ async fn auto_compact_counts_encrypted_reasoning_before_last_user() {
content: vec![codex_protocol::models::ContentItem::OutputText {
text: "REMOTE_COMPACT_SUMMARY".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -2915,6 +2917,7 @@ async fn auto_compact_runs_when_reasoning_header_clears_between_turns() {
content: vec![codex_protocol::models::ContentItem::OutputText {
text: "REMOTE_COMPACT_SUMMARY".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -1101,6 +1101,7 @@ async fn remote_compact_persists_replacement_history_in_rollout() -> Result<()>
content: vec![ContentItem::OutputText {
text: "COMPACTED_ASSISTANT_NOTE".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -1238,6 +1239,7 @@ async fn remote_compact_and_resume_refresh_stale_developer_instructions() -> Res
content: vec![ContentItem::InputText {
text: stale_developer_message.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -1370,6 +1372,7 @@ async fn remote_compact_refreshes_stale_developer_instructions_without_resume()
content: vec![ContentItem::InputText {
text: stale_developer_message.to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
},
@@ -157,6 +157,7 @@ async fn copy_paste_local_image_persists_rollout_request_shape() -> anyhow::Resu
text: "pasted image".to_string(),
},
],
metadata: None,
end_turn: None,
phase: None,
};
@@ -240,6 +241,7 @@ async fn drag_drop_image_persists_rollout_request_shape() -> anyhow::Result<()>
text: "dropped image".to_string(),
},
],
metadata: None,
end_turn: None,
phase: None,
};
+2
View File
@@ -530,6 +530,7 @@ async fn review_input_isolated_from_parent_history() {
content: vec![codex_protocol::models::ContentItem::InputText {
text: "parent: earlier user message".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};
@@ -550,6 +551,7 @@ async fn review_input_isolated_from_parent_history() {
content: vec![codex_protocol::models::ContentItem::OutputText {
text: "parent: assistant reply".to_string(),
}],
metadata: None,
end_turn: None,
phase: None,
};