diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-16 22:12:44 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-04-16 22:17:09 +0300 |
| commit | 0b831c86274486af9f9f7052c2534374b498bb3a (patch) | |
| tree | 3e8130be85cb387c8c3e57591617c4c7be0a26ec /src/detect.rs | |
| parent | 318e6a3033b61082d9c330c79ef584cf37e6c6d0 (diff) | |
feat: allow hook-reported custom agent labels
Diffstat (limited to 'src/detect.rs')
| -rw-r--r-- | src/detect.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/detect.rs b/src/detect.rs index 178fe0a5..df5bbae4 100644 --- a/src/detect.rs +++ b/src/detect.rs @@ -32,6 +32,40 @@ pub enum Agent { Amp, } +pub fn agent_label(agent: Agent) -> &'static str { + match agent { + Agent::Pi => "pi", + Agent::Claude => "claude", + Agent::Codex => "codex", + Agent::Gemini => "gemini", + Agent::Cursor => "cursor", + Agent::Cline => "cline", + Agent::OpenCode => "opencode", + Agent::GithubCopilot => "copilot", + Agent::Kimi => "kimi", + Agent::Droid => "droid", + Agent::Amp => "amp", + } +} + +pub fn parse_agent_label(agent: &str) -> Option<Agent> { + let name = agent.trim().to_lowercase(); + match name.as_str() { + "pi" => Some(Agent::Pi), + "claude" | "claude-code" => Some(Agent::Claude), + "codex" => Some(Agent::Codex), + "gemini" => Some(Agent::Gemini), + "cursor" => Some(Agent::Cursor), + "cline" => Some(Agent::Cline), + "opencode" | "open-code" => Some(Agent::OpenCode), + "copilot" | "github-copilot" | "ghcs" => Some(Agent::GithubCopilot), + "kimi" => Some(Agent::Kimi), + "droid" => Some(Agent::Droid), + "amp" | "amp-local" => Some(Agent::Amp), + _ => None, + } +} + /// Identify which agent is running from the process name. /// Returns `None` for plain shells or unrecognized programs. pub fn identify_agent(process_name: &str) -> Option<Agent> { @@ -624,6 +658,25 @@ mod tests { } #[test] + fn parse_known_agent_labels() { + assert_eq!(parse_agent_label("pi"), Some(Agent::Pi)); + assert_eq!(parse_agent_label("claude"), Some(Agent::Claude)); + assert_eq!(parse_agent_label("copilot"), Some(Agent::GithubCopilot)); + assert_eq!( + parse_agent_label("github-copilot"), + Some(Agent::GithubCopilot) + ); + assert_eq!(parse_agent_label("amp-local"), Some(Agent::Amp)); + } + + #[test] + fn agent_labels_use_display_names() { + assert_eq!(agent_label(Agent::Pi), "pi"); + assert_eq!(agent_label(Agent::GithubCopilot), "copilot"); + assert_eq!(agent_label(Agent::OpenCode), "opencode"); + } + + #[test] fn identify_unknown_processes() { assert_eq!(identify_agent("bash"), None); assert_eq!(identify_agent("zsh"), None); |
