aboutsummaryrefslogtreecommitdiff
path: root/src/app/actions.rs
diff options
context:
space:
mode:
authorJJ Liebig <jonathan.liebig@gmail.com>2026-09-02 18:08:10 +0200
committerGitHub <noreply@github.com>2026-09-02 18:08:10 +0200
commit5a2dee700eeeea68267a4d16777307632f77172f (patch)
tree3a7b2b0ead7af9cb1bfc069e5f61ce56a5f4909f /src/app/actions.rs
parent987b070fbfa187e85009b45cd7e208fc6175ff6a (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.rs55
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));