Codex Handbook
core/src/session_prefix.rs 58 lines
use codex_protocol::AgentPath;use codex_protocol::protocol::AgentStatus;use codex_utils_output_truncation::TruncationPolicy;use codex_utils_output_truncation::truncate_text;use crate::context::ContextualUserFragment;use crate::context::InterAgentCompletionMessage;use crate::context::SubagentNotification;const COMPLETION_MESSAGE_MAX_TOKENS: usize = 1_000;const COMPLETION_MESSAGE_ENVELOPE_TOKEN_RESERVE: usize = 100;const ERROR_MAX_TOKENS: usize =    COMPLETION_MESSAGE_MAX_TOKENS - COMPLETION_MESSAGE_ENVELOPE_TOKEN_RESERVE;const ERROR_NEXT_ACTION: &str = "This agent's turn failed. If you still need this agent, use the available collaboration tools to give it another task.";// Helpers for model-visible session state markers that are stored in user-role// messages but are not user intent.// TODO(jif) unify with structured schemapub(crate) fn format_subagent_notification_message(    agent_reference: &str,    status: &AgentStatus,) -> String {    SubagentNotification::new(agent_reference, status.clone()).render()}pub(crate) fn format_inter_agent_completion_message(    task_name: AgentPath,    sender: AgentPath,    status: &AgentStatus,) -> Option<String> {    let payload = match status {        AgentStatus::Completed(Some(message)) => message.clone(),        AgentStatus::Completed(None) => String::new(),        AgentStatus::Errored(error) => {            let error = truncate_text(error, TruncationPolicy::Tokens(ERROR_MAX_TOKENS));            format!("Agent errored: {error}\n\n{ERROR_NEXT_ACTION}")        }        AgentStatus::Shutdown => "Agent shut down.".to_string(),        AgentStatus::NotFound => "Agent was not found.".to_string(),        AgentStatus::PendingInit | AgentStatus::Running | AgentStatus::Interrupted => return None,    };    Some(InterAgentCompletionMessage::new(task_name, sender, payload).render())}#[cfg(test)]#[path = "session_prefix_tests.rs"]mod tests;pub(crate) fn format_subagent_context_line(    agent_reference: &str,    agent_nickname: Option<&str>,) -> String {    match agent_nickname.filter(|nickname| !nickname.is_empty()) {        Some(agent_nickname) => format!("- {agent_reference}: {agent_nickname}"),        None => format!("- {agent_reference}"),    }}