aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorkangal-bot <kangal@herdr.dev>2026-05-19 00:36:16 +0300
committerGitHub <noreply@github.com>2026-05-19 00:36:16 +0300
commit6925f8a5d67d254a10703f22897b0efab5b453a5 (patch)
tree35684c8a07a979d0e9f332e093a6792e4069e4e9 /src
parente7f94a3f359fe1be94a0863b731d94d245093848 (diff)
fix: prefer process group leader for agent detection (#172)
refs #161 Co-authored-by: kangal-bot <kangal-bot@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r--src/detect.rs63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/detect.rs b/src/detect.rs
index 0319b4ef..595e81f1 100644
--- a/src/detect.rs
+++ b/src/detect.rs
@@ -96,6 +96,17 @@ pub fn identify_agent(process_name: &str) -> Option<Agent> {
}
pub fn identify_agent_in_job(job: &crate::platform::ForegroundJob) -> Option<(Agent, String)> {
+ if let Some(process) = job
+ .processes
+ .iter()
+ .find(|process| process.pid == job.process_group_id)
+ {
+ let candidate = normalized_process_name(process);
+ if let Some(agent) = identify_agent(&candidate) {
+ return Some((agent, candidate));
+ }
+ }
+
let mut best: Option<(u8, Agent, String)> = None;
for process in &job.processes {
@@ -830,6 +841,58 @@ mod tests {
}
#[test]
+ fn identify_agent_in_job_prefers_recognized_process_group_leader() {
+ let job = crate::platform::ForegroundJob {
+ process_group_id: 42,
+ processes: vec![
+ crate::platform::ForegroundProcess {
+ pid: 42,
+ name: "claude".to_string(),
+ argv0: None,
+ cmdline: Some("claude".to_string()),
+ },
+ crate::platform::ForegroundProcess {
+ pid: 43,
+ name: "node".to_string(),
+ argv0: None,
+ cmdline: Some("node /tmp/mcp/bin/codex".to_string()),
+ },
+ ],
+ };
+
+ assert_eq!(
+ identify_agent_in_job(&job),
+ Some((Agent::Claude, "claude".to_string()))
+ );
+ }
+
+ #[test]
+ fn identify_agent_in_job_falls_back_when_process_group_leader_is_unrecognized() {
+ let job = crate::platform::ForegroundJob {
+ process_group_id: 42,
+ processes: vec![
+ crate::platform::ForegroundProcess {
+ pid: 42,
+ name: "bash".to_string(),
+ argv0: None,
+ cmdline: Some("bash".to_string()),
+ },
+ crate::platform::ForegroundProcess {
+ pid: 43,
+ name: "node".to_string(),
+ argv0: None,
+ cmdline: Some("node /tmp/mcp/bin/codex".to_string()),
+ },
+ ],
+ };
+
+ assert_eq!(
+ identify_agent_in_job(&job),
+ Some((Agent::Codex, "codex".to_string()))
+ );
+ }
+
+ #[test]
fn identify_agent_in_job_detects_nix_wrapped_codex_from_cmdline_argv0() {
let job = crate::platform::ForegroundJob {
process_group_id: 123,