diff options
| author | kangal-bot <kangal@herdr.dev> | 2026-05-19 00:36:16 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-19 00:36:16 +0300 |
| commit | 6925f8a5d67d254a10703f22897b0efab5b453a5 (patch) | |
| tree | 35684c8a07a979d0e9f332e093a6792e4069e4e9 /src | |
| parent | e7f94a3f359fe1be94a0863b731d94d245093848 (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.rs | 63 |
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, |
