From df7880c54b8b5d337421cb4b1dd8daea27008801 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Tue, 9 Jun 2026 15:59:34 +0300 Subject: feat: update agent lifecycle integrations --- src/agent_resume.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 80 insertions(+), 2 deletions(-) (limited to 'src/agent_resume.rs') diff --git a/src/agent_resume.rs b/src/agent_resume.rs index d166aed2..b6a8c818 100644 --- a/src/agent_resume.rs +++ b/src/agent_resume.rs @@ -74,9 +74,11 @@ pub fn is_reserved_native_state_source(source: &str, agent: &str) -> bool { (source, agent), ("herdr:claude", "claude") | ("herdr:codex", "codex") - | ("herdr:cursor", "cursor") + | ("herdr:copilot", "copilot") | ("herdr:droid", "droid") - | ("herdr:opencode", "opencode") + | ("herdr:kimi", "kimi") + | ("herdr:qodercli", "qodercli") + | ("herdr:cursor", "cursor") ) } @@ -123,6 +125,9 @@ pub fn plan(source: &str, agent: &str, session_ref: &AgentSessionRef) -> Option< ("herdr:droid", "droid", AgentSessionRefKind::Id) => { vec!["droid".into(), "--resume".into(), session_ref.value.clone()] } + ("herdr:kimi", "kimi", AgentSessionRefKind::Id) => { + vec!["kimi".into(), "--session".into(), session_ref.value.clone()] + } ("herdr:pi", "pi", AgentSessionRefKind::Path | AgentSessionRefKind::Id) => { vec!["pi".into(), "--session".into(), session_ref.value.clone()] } @@ -140,6 +145,16 @@ pub fn plan(source: &str, agent: &str, session_ref: &AgentSessionRef) -> Option< session_ref.value.clone(), ] } + ("herdr:qodercli", "qodercli", AgentSessionRefKind::Id) => { + vec![ + "qodercli".into(), + "--resume".into(), + session_ref.value.clone(), + ] + } + ("herdr:kilo", "kilo", AgentSessionRefKind::Id) => { + vec!["kilo".into(), "--session".into(), session_ref.value.clone()] + } ("herdr:cursor", "cursor", AgentSessionRefKind::Id) => { vec![ "cursor-agent".into(), @@ -171,9 +186,12 @@ fn is_official_agent_source(source: &str, agent: &str) -> bool { | ("herdr:codex", "codex") | ("herdr:copilot", "copilot") | ("herdr:droid", "droid") + | ("herdr:kimi", "kimi") | ("herdr:pi", "pi") | ("herdr:hermes", "hermes") | ("herdr:opencode", "opencode") + | ("herdr:qodercli", "qodercli") + | ("herdr:kilo", "kilo") | ("herdr:cursor", "cursor") ) } @@ -244,6 +262,16 @@ mod tests { .argv, vec!["droid", "--resume", "droid-session"] ); + assert_eq!( + plan( + "herdr:kimi", + "kimi", + &AgentSessionRef::id("kimi-session").unwrap() + ) + .unwrap() + .argv, + vec!["kimi", "--session", "kimi-session"] + ); assert_eq!( plan( "herdr:pi", @@ -274,6 +302,26 @@ mod tests { .argv, vec!["opencode", "--session", "opencode-session"] ); + assert_eq!( + plan( + "herdr:qodercli", + "qodercli", + &AgentSessionRef::id("qoder-session").unwrap() + ) + .unwrap() + .argv, + vec!["qodercli", "--resume", "qoder-session"] + ); + assert_eq!( + plan( + "herdr:kilo", + "kilo", + &AgentSessionRef::id("kilo-session").unwrap() + ) + .unwrap() + .argv, + vec!["kilo", "--session", "kilo-session"] + ); assert_eq!( plan( "herdr:cursor", @@ -349,6 +397,22 @@ mod tests { Some("/tmp/droid-session".into()) ) .is_none()); + + let session_ref = + session_ref_from_report("herdr:kimi", "kimi", Some("kimi-id".into()), None).unwrap(); + assert_eq!(session_ref.kind, AgentSessionRefKind::Id); + assert_eq!(session_ref.value, "kimi-id"); + + let session_ref = + session_ref_from_report("herdr:kilo", "kilo", Some("kilo-id".into()), None).unwrap(); + assert_eq!(session_ref.kind, AgentSessionRefKind::Id); + assert_eq!(session_ref.value, "kilo-id"); + + let session_ref = + session_ref_from_report("herdr:qodercli", "qodercli", Some("qoder-id".into()), None) + .unwrap(); + assert_eq!(session_ref.kind, AgentSessionRefKind::Id); + assert_eq!(session_ref.value, "qoder-id"); } #[test] @@ -370,6 +434,7 @@ mod tests { fn planner_rejects_path_refs_for_id_only_agents() { let hermes_session = absolute_test_path("hermes-session"); let opencode_session = absolute_test_path("opencode-session"); + let kilo_session = absolute_test_path("kilo-session"); let copilot_session = absolute_test_path("copilot-session"); assert!(plan( "herdr:hermes", @@ -383,6 +448,12 @@ mod tests { &AgentSessionRef::path(&opencode_session).unwrap() ) .is_none()); + assert!(plan( + "herdr:kilo", + "kilo", + &AgentSessionRef::path(&kilo_session).unwrap() + ) + .is_none()); assert!(plan( "herdr:copilot", "copilot", @@ -403,6 +474,13 @@ mod tests { "opencode-session" ) .is_some()); + assert!(session_ref_from_snapshot( + "herdr:kilo", + "kilo", + AgentSessionRefKind::Id, + "kilo-session" + ) + .is_some()); assert!(session_ref_from_snapshot( "herdr:copilot", "copilot", -- cgit v1.2.3