aboutsummaryrefslogtreecommitdiff
path: root/src/terminal
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
parent5bd21b7ed468b5ff4d1a5b2ed7e211f401eb138a (diff)
fix: restore agents through pane shells
Diffstat (limited to 'src/terminal')
-rw-r--r--src/terminal/runtime.rs27
-rw-r--r--src/terminal/state.rs33
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(