diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-01 23:31:53 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-01 23:32:44 +0300 |
| commit | 36a4608603a82dbf32ec8a013dd47047cf02c6a3 (patch) | |
| tree | 8a9242974ad45dd6dc22b66f576dd9adcc36d996 /src/terminal | |
| parent | 5bd21b7ed468b5ff4d1a5b2ed7e211f401eb138a (diff) | |
fix: restore agents through pane shells
Diffstat (limited to 'src/terminal')
| -rw-r--r-- | src/terminal/runtime.rs | 27 | ||||
| -rw-r--r-- | src/terminal/state.rs | 33 |
2 files changed, 33 insertions, 27 deletions
diff --git a/src/terminal/runtime.rs b/src/terminal/runtime.rs index c7bb8810..0fefe037 100644 --- a/src/terminal/runtime.rs +++ b/src/terminal/runtime.rs @@ -189,33 +189,6 @@ impl TerminalRuntime { .map(Self) } - pub fn spawn_agent_restore( - pane_id: PaneId, - rows: u16, - cols: u16, - cwd: std::path::PathBuf, - launch: crate::agent_resume::AgentResumeLaunch<'_>, - scrollback_limit_bytes: usize, - host_terminal_theme: crate::terminal_theme::TerminalTheme, - events: mpsc::Sender<AppEvent>, - render_notify: Arc<Notify>, - render_dirty: Arc<AtomicBool>, - ) -> std::io::Result<Self> { - crate::pane::PaneRuntime::spawn_agent_restore( - pane_id, - rows, - cols, - cwd, - launch, - scrollback_limit_bytes, - host_terminal_theme, - events, - render_notify, - render_dirty, - ) - .map(Self) - } - pub fn apply_host_terminal_theme(&self, theme: crate::terminal_theme::TerminalTheme) { self.0.apply_host_terminal_theme(theme); } 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( |
