aboutsummaryrefslogtreecommitdiff
path: root/src/terminal/state.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-01 23:31:53 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-01 23:32:44 +0300
commit36a4608603a82dbf32ec8a013dd47047cf02c6a3 (patch)
tree8a9242974ad45dd6dc22b66f576dd9adcc36d996 /src/terminal/state.rs
parent5bd21b7ed468b5ff4d1a5b2ed7e211f401eb138a (diff)
fix: restore agents through pane shells
Diffstat (limited to 'src/terminal/state.rs')
-rw-r--r--src/terminal/state.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/terminal/state.rs b/src/terminal/state.rs
index ac7c4380..09c5812a 100644
--- a/src/terminal/state.rs
+++ b/src/terminal/state.rs
@@ -73,6 +73,7 @@ pub struct TerminalState {
pub revision: u64,
pub launch_argv: Option<Vec<String>>,
pub respawn_shell_on_exit: bool,
+ pub pending_agent_resume_plan: Option<crate::agent_resume::AgentResumePlan>,
}
impl TerminalState {
@@ -98,6 +99,7 @@ impl TerminalState {
revision: 0,
launch_argv: None,
respawn_shell_on_exit: false,
+ pending_agent_resume_plan: None,
}
}
@@ -111,6 +113,14 @@ impl TerminalState {
self
}
+ pub fn with_pending_agent_resume_plan(
+ mut self,
+ plan: crate::agent_resume::AgentResumePlan,
+ ) -> Self {
+ self.pending_agent_resume_plan = Some(plan);
+ self
+ }
+
#[cfg(test)]
pub fn set_detected_state(
&mut self,
@@ -667,8 +677,10 @@ impl TerminalState {
self.hook_authority = None;
self.persisted_agent_session = None;
self.agent_metadata.clear();
+ self.state = AgentState::Unknown;
self.launch_argv = None;
self.respawn_shell_on_exit = false;
+ self.pending_agent_resume_plan = None;
self.clear_agent_name();
}
@@ -1866,6 +1878,27 @@ mod tests {
}
#[test]
+ fn respawn_cleanup_resets_restored_agent_status() {
+ let mut terminal = test_terminal();
+ terminal.respawn_shell_on_exit = true;
+ terminal.set_agent_name("codex".into());
+ terminal.set_persisted_agent_session(crate::agent_resume::PersistedAgentSession {
+ source: "herdr:codex".into(),
+ agent: "codex".into(),
+ session_ref: crate::agent_resume::AgentSessionRef::id("codex-session").unwrap(),
+ });
+ terminal.set_detected_state(Some(Agent::Codex), AgentState::Idle);
+
+ terminal.clear_agent_runtime_identity_after_respawn();
+
+ assert_eq!(terminal.state, AgentState::Unknown);
+ assert!(terminal.detected_agent.is_none());
+ assert!(terminal.agent_name.is_none());
+ assert!(terminal.persisted_agent_session.is_none());
+ assert!(!terminal.respawn_shell_on_exit);
+ }
+
+ #[test]
fn detected_conflict_clears_session_ref() {
let mut terminal = test_terminal();
terminal.set_hook_authority_with_session_ref(