diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-24 00:52:07 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-24 00:52:07 +0300 |
| commit | 74fa90cecc6f6dfd93dc64893659771001ad2d82 (patch) | |
| tree | a34ed445c525b719ba602ac086a2959e460934d7 /src/terminal | |
| parent | 64a12de1cdc0cf3730da82103d4d84ddd919d407 (diff) | |
fix: scope opencode hook to main agent and adopt new sessions
refs #765
Diffstat (limited to 'src/terminal')
| -rw-r--r-- | src/terminal/state.rs | 66 |
1 files changed, 65 insertions, 1 deletions
diff --git a/src/terminal/state.rs b/src/terminal/state.rs index b5a05168..e7923719 100644 --- a/src/terminal/state.rs +++ b/src/terminal/state.rs @@ -837,7 +837,7 @@ impl TerminalState { "herdr:codex", "codex", Some("startup" | "clear" | "resume" | "compact") - ) + ) | ("herdr:opencode", "opencode", Some("new")) ) } @@ -3269,6 +3269,70 @@ mod tests { } #[test] + fn opencode_new_session_ref_replaces_existing_session_ref() { + let mut terminal = test_terminal(); + terminal + .set_agent_session_ref( + "herdr:opencode".into(), + "opencode".into(), + crate::agent_resume::AgentSessionRef::id("opencode-old"), + Some(20), + ) + .expect("initial session should be accepted"); + + let mutation = terminal + .set_agent_session_ref_for_session_start( + "herdr:opencode".into(), + "opencode".into(), + crate::agent_resume::AgentSessionRef::id("opencode-new"), + Some(21), + Some("new".into()), + ) + .expect("new should replace the session"); + + assert!(mutation.session_ref_changed); + assert_eq!( + terminal + .persisted_agent_session + .as_ref() + .map(|session| session.session_ref.value.as_str()), + Some("opencode-new") + ); + } + + #[test] + fn opencode_session_ref_without_start_source_does_not_replace_existing() { + let mut terminal = test_terminal(); + terminal + .set_agent_session_ref( + "herdr:opencode".into(), + "opencode".into(), + crate::agent_resume::AgentSessionRef::id("opencode-old"), + Some(20), + ) + .expect("initial session should be accepted"); + + // session.updated reports carry no session_start_source, so a different + // id must not displace the established session (cross-talk guard). + let mutation = terminal.set_agent_session_ref_for_session_start( + "herdr:opencode".into(), + "opencode".into(), + crate::agent_resume::AgentSessionRef::id("opencode-other"), + Some(21), + None, + ); + + assert!(mutation.is_none()); + assert_eq!( + terminal + .persisted_agent_session + .as_ref() + .map(|session| session.session_ref.value.as_str()), + Some("opencode-old") + ); + } + + #[test] fn different_owner_session_ref_does_not_replace_existing_session_ref() { let mut terminal = test_terminal(); terminal |
