mirror of
https://github.com/openai/codex.git
synced 2026-09-20 12:47:38 +00:00
## What changed - Preserve `encrypted_function_args` on function calls so an empty list can mark plaintext collaboration arguments across request replay. - Deliver `spawn_agent`, `send_message`, and `followup_task` payloads as structured plaintext agent messages when that marker is present; retain encrypted delivery otherwise. - Redact plaintext collaboration arguments from tool and communication logs, and omit the metadata when sending requests to non-OpenAI providers. ## Testing - Cover serialization of empty encrypted-argument metadata and plaintext versus encrypted subagent message delivery. - Verify plaintext tool arguments are redacted and provider-specific metadata is removed from non-OpenAI requests. GitOrigin-RevId: 64db98ff0b61a3af2f04ed609292363f2e2362a8
79 lines
2.0 KiB
Rust
79 lines
2.0 KiB
Rust
use codex_protocol::ThreadId;
|
|
use codex_protocol::protocol::InterAgentCommunication;
|
|
|
|
const AGENT_COMMUNICATION_TARGET: &str = "codex_otel.agent_communication";
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
pub(crate) enum AgentCommunicationKind {
|
|
Spawn,
|
|
Message,
|
|
Followup,
|
|
Result,
|
|
}
|
|
|
|
impl AgentCommunicationKind {
|
|
fn as_str(self) -> &'static str {
|
|
match self {
|
|
Self::Spawn => "spawn",
|
|
Self::Message => "message",
|
|
Self::Followup => "followup",
|
|
Self::Result => "result",
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
|
pub(crate) struct AgentCommunicationContext {
|
|
kind: AgentCommunicationKind,
|
|
sender_thread_id: ThreadId,
|
|
}
|
|
|
|
impl AgentCommunicationContext {
|
|
pub(crate) fn new(kind: AgentCommunicationKind, sender_thread_id: ThreadId) -> Self {
|
|
Self {
|
|
kind,
|
|
sender_thread_id,
|
|
}
|
|
}
|
|
}
|
|
|
|
pub(crate) fn logging_enabled() -> bool {
|
|
tracing::enabled!(target: AGENT_COMMUNICATION_TARGET, tracing::Level::INFO)
|
|
}
|
|
|
|
pub(crate) fn emit_agent_communication_send(
|
|
communication_id: &str,
|
|
context: &AgentCommunicationContext,
|
|
communication: &InterAgentCommunication,
|
|
receiver_thread_id: ThreadId,
|
|
) {
|
|
tracing::info!(
|
|
target: AGENT_COMMUNICATION_TARGET,
|
|
{
|
|
event.name = "codex.agent_communication",
|
|
communication_id,
|
|
kind = context.kind.as_str(),
|
|
state = "send",
|
|
sender_thread_id = %context.sender_thread_id,
|
|
receiver_thread_id = %receiver_thread_id,
|
|
content = communication
|
|
.encrypted_content
|
|
.as_deref()
|
|
.unwrap_or("[plaintext]"),
|
|
},
|
|
"agent communication"
|
|
);
|
|
}
|
|
|
|
pub(crate) fn emit_agent_communication_receive(communication_id: &str) {
|
|
tracing::info!(
|
|
target: AGENT_COMMUNICATION_TARGET,
|
|
{
|
|
event.name = "codex.agent_communication",
|
|
communication_id,
|
|
state = "receive",
|
|
},
|
|
"agent communication"
|
|
);
|
|
}
|