aboutsummaryrefslogtreecommitdiff
path: root/src/terminal
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-24 00:52:07 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-24 00:52:07 +0300
commit74fa90cecc6f6dfd93dc64893659771001ad2d82 (patch)
treea34ed445c525b719ba602ac086a2959e460934d7 /src/terminal
parent64a12de1cdc0cf3730da82103d4d84ddd919d407 (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.rs66
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