use codex_protocol::protocol::AgentStatus; /// Helpers for identifying model-visible "session prefix" messages. /// /// A session prefix is a user-role message that carries configuration or state needed by /// follow-up turns (e.g. ``, ``). These items are persisted in /// history so the model can see them, but they are not user intent and must not create user-turn /// boundaries. pub(crate) const ENVIRONMENT_CONTEXT_OPEN_TAG: &str = ""; pub(crate) const TURN_ABORTED_OPEN_TAG: &str = ""; pub(crate) const SUBAGENT_NOTIFICATION_OPEN_TAG: &str = ""; pub(crate) const SUBAGENT_NOTIFICATION_CLOSE_TAG: &str = ""; fn starts_with_ascii_case_insensitive(text: &str, prefix: &str) -> bool { text.get(..prefix.len()) .is_some_and(|candidate| candidate.eq_ignore_ascii_case(prefix)) } /// Returns true if `text` starts with a session prefix marker (case-insensitive). pub(crate) fn is_session_prefix(text: &str) -> bool { let trimmed = text.trim_start(); starts_with_ascii_case_insensitive(trimmed, ENVIRONMENT_CONTEXT_OPEN_TAG) || starts_with_ascii_case_insensitive(trimmed, TURN_ABORTED_OPEN_TAG) || starts_with_ascii_case_insensitive(trimmed, SUBAGENT_NOTIFICATION_OPEN_TAG) } pub(crate) fn format_subagent_notification_message(agent_id: &str, status: &AgentStatus) -> String { let payload_json = serde_json::json!({ "agent_id": agent_id, "status": status, }) .to_string(); format!("{SUBAGENT_NOTIFICATION_OPEN_TAG}\n{payload_json}\n{SUBAGENT_NOTIFICATION_CLOSE_TAG}") } #[cfg(test)] mod tests { use super::*; use pretty_assertions::assert_eq; #[test] fn is_session_prefix_is_case_insensitive() { assert_eq!( is_session_prefix("{}"), true ); } }