Codex Handbook
core/src/memory_usage.rs 46 lines
use crate::tools::context::ToolInvocation;use crate::tools::context::ToolPayload;use crate::tools::flat_tool_name;use crate::tools::handlers::unified_exec::ExecCommandArgs;use codex_memories_read::usage::MEMORIES_USAGE_METRIC;use codex_memories_read::usage::memories_usage_kinds_from_command;use codex_protocol::models::ShellCommandToolCallParams;pub(crate) fn emit_metric_for_tool_read(invocation: &ToolInvocation, success: bool) {    let Some(command) = shell_script_for_invocation(invocation) else {        return;    };    let success = if success { "true" } else { "false" };    let tool_name = flat_tool_name(&invocation.tool_name);    for kind in memories_usage_kinds_from_command(&command) {        invocation.turn.session_telemetry.counter(            MEMORIES_USAGE_METRIC,            /*inc*/ 1,            &[                ("kind", kind.as_tag()),                ("tool", tool_name.as_ref()),                ("success", success),            ],        );    }}fn shell_script_for_invocation(invocation: &ToolInvocation) -> Option<String> {    let ToolPayload::Function { arguments } = &invocation.payload else {        return None;    };    match (        invocation.tool_name.namespace.as_deref(),        invocation.tool_name.name.as_str(),    ) {        (None, "shell_command") => serde_json::from_str::<ShellCommandToolCallParams>(arguments)            .ok()            .map(|params| params.command),        (None, "exec_command") => serde_json::from_str::<ExecCommandArgs>(arguments)            .ok()            .map(|params| params.cmd),        (Some(_), _) | (None, _) => None,    }}