diff options
| author | JJ Liebig <jonathan.liebig@gmail.com> | 2026-09-02 18:08:10 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-09-02 18:08:10 +0200 |
| commit | 5a2dee700eeeea68267a4d16777307632f77172f (patch) | |
| tree | 3a7b2b0ead7af9cb1bfc069e5f61ce56a5f4909f /src/app/actions.rs | |
| parent | 987b070fbfa187e85009b45cd7e208fc6175ff6a (diff) | |
fix(windows): remove worktrees with active agent panes (#3532)
* fix(windows): remove worktrees with active agent panes
* fix(windows): defer pane restore until shutdown exits
Diffstat (limited to 'src/app/actions.rs')
| -rw-r--r-- | src/app/actions.rs | 55 |
1 files changed, 37 insertions, 18 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs index 853c9084..69b459d2 100644 --- a/src/app/actions.rs +++ b/src/app/actions.rs @@ -1579,6 +1579,7 @@ impl AppState { self.handle_pane_died(pane_id); Vec::new() } + AppEvent::WorktreeRuntimeRestoreFailed { .. } => Vec::new(), AppEvent::UpdateReady { version, install_command, @@ -1814,6 +1815,18 @@ impl AppState { where F: FnOnce(&mut crate::terminal::TerminalState) -> Option<TerminalStateMutation>, { + self.update_terminal_state_with_completion_policy(pane_id, false, update) + } + + fn update_terminal_state_with_completion_policy<F>( + &mut self, + pane_id: PaneId, + force_suppress_completion: bool, + update: F, + ) -> Option<PaneStateUpdate> + where + F: FnOnce(&mut crate::terminal::TerminalState) -> Option<TerminalStateMutation>, + { let ws_idx = self .workspaces .iter() @@ -1855,8 +1868,9 @@ impl AppState { } let agent_released = mutation.agent_released; let change = mutation.effective_state_change.or(unchanged_change)?; - let suppress_completion = change.state == AgentState::Idle - && (managed_launch_pending || suppress_acquisition_completion); + let suppress_completion = force_suppress_completion + || (change.state == AgentState::Idle + && (managed_launch_pending || suppress_acquisition_completion)); if change.previous_state != change.state { self.next_agent_state_change_seq += 1; if let Some(terminal) = self.terminals.get_mut(&terminal_id) { @@ -1903,23 +1917,28 @@ impl AppState { pub(crate) fn publish_pane_process_exit_if_agent( &mut self, pane_id: PaneId, + suppress_completion: bool, ) -> Option<PaneStateUpdate> { let observed_at = std::time::Instant::now(); - let update = self.update_terminal_state(pane_id, |terminal| { - let agent = terminal.effective_known_agent().or(terminal.detected_agent); - if agent.is_none() && !terminal.full_lifecycle_hook_authority_active() { - return None; - } - Some(terminal.set_detected_state_with_screen_signals_at( - agent, - AgentState::Idle, - false, - true, - false, - true, - observed_at, - )) - })?; + let update = self.update_terminal_state_with_completion_policy( + pane_id, + suppress_completion, + |terminal| { + let agent = terminal.effective_known_agent().or(terminal.detected_agent); + if agent.is_none() && !terminal.full_lifecycle_hook_authority_active() { + return None; + } + Some(terminal.set_detected_state_with_screen_signals_at( + agent, + AgentState::Idle, + false, + true, + false, + true, + observed_at, + )) + }, + )?; update.agent_released.then_some(update) } @@ -3997,7 +4016,7 @@ mod tests { ); let update = state - .publish_pane_process_exit_if_agent(pane_id) + .publish_pane_process_exit_if_agent(pane_id, false) .expect("process exit update"); assert!(!state.pane_is_in_active_tab(update.ws_idx, pane_id)); |
