memories/read/src/usage.rs
64 lines
use codex_protocol::parse_command::ParsedCommand;use codex_shell_command::bash::parse_shell_script_into_commands;use codex_shell_command::is_safe_command::is_known_safe_command;use codex_shell_command::parse_command::parse_shell_script;pub use crate::metrics::MEMORIES_USAGE_METRIC;#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]pub enum MemoriesUsageKind { MemoryMd, MemorySummary, RawMemories, RolloutSummaries, Skills,}impl MemoriesUsageKind { pub fn as_tag(self) -> &'static str { match self { Self::MemoryMd => "memory_md", Self::MemorySummary => "memory_summary", Self::RawMemories => "raw_memories", Self::RolloutSummaries => "rollout_summaries", Self::Skills => "skills", } }}pub fn memories_usage_kinds_from_command(command: &str) -> Vec<MemoriesUsageKind> { let Some(commands) = parse_shell_script_into_commands(command) else { return Vec::new(); }; if !commands .iter() .all(|command| is_known_safe_command(command)) { return Vec::new(); } parse_shell_script(command) .into_iter() .filter_map(|command| match command { ParsedCommand::Read { path, .. } => get_memory_kind(path.display().to_string()), ParsedCommand::Search { path, .. } => path.and_then(get_memory_kind), ParsedCommand::ListFiles { .. } | ParsedCommand::Unknown { .. } => None, }) .collect()}fn get_memory_kind(path: String) -> Option<MemoriesUsageKind> { if path.contains("memories/MEMORY.md") { Some(MemoriesUsageKind::MemoryMd) } else if path.contains("memories/memory_summary.md") { Some(MemoriesUsageKind::MemorySummary) } else if path.contains("memories/raw_memories.md") { Some(MemoriesUsageKind::RawMemories) } else if path.contains("memories/rollout_summaries/") { Some(MemoriesUsageKind::RolloutSummaries) } else if path.contains("memories/skills/") { Some(MemoriesUsageKind::Skills) } else { None }}