aboutsummaryrefslogtreecommitdiff
path: root/src/detect.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-16 22:12:44 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-16 22:17:09 +0300
commit0b831c86274486af9f9f7052c2534374b498bb3a (patch)
tree3e8130be85cb387c8c3e57591617c4c7be0a26ec /src/detect.rs
parent318e6a3033b61082d9c330c79ef584cf37e6c6d0 (diff)
feat: allow hook-reported custom agent labels
Diffstat (limited to 'src/detect.rs')
-rw-r--r--src/detect.rs53
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);