aboutsummaryrefslogtreecommitdiff
path: root/src/server/headless/notifications.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/headless/notifications.rs')
-rw-r--r--src/server/headless/notifications.rs63
1 files changed, 51 insertions, 12 deletions
diff --git a/src/server/headless/notifications.rs b/src/server/headless/notifications.rs
index 92020d63..6764dd2d 100644
--- a/src/server/headless/notifications.rs
+++ b/src/server/headless/notifications.rs
@@ -627,15 +627,43 @@ impl HeadlessServer {
}
changed
}
- AppEvent::WorktreeRemoveFinished(_) => {
+ AppEvent::WorktreeRemoveFinished(result) => {
let focus_before = self.shell_focus_targets();
let focused_tabs_before = self.focused_shell_tabs();
- let changed = self.app.handle_internal_event_with_render_impact(ev);
+ let shutdown_terminals = result
+ .api_request
+ .as_ref()
+ .map(|request| {
+ request
+ .shutdown_panes
+ .iter()
+ .filter_map(|pane_id| {
+ self.app.find_pane(*pane_id).map(|(_, pane)| {
+ (*pane_id, pane.attached_terminal_id.to_string())
+ })
+ })
+ .collect::<Vec<_>>()
+ })
+ .unwrap_or_default();
+ let pane_updates = self.app.handle_internal_event_with_pane_updates(ev);
+ for update in &pane_updates {
+ self.forward_semantic_agent_notification(update);
+ self.forward_pane_state_update_notifications_to_clients(update);
+ }
self.reconcile_client_shell_locations();
self.finish_shell_location_reconciliation(focus_before, &focused_tabs_before);
- changed
+ for (pane_id, terminal_id) in shutdown_terminals {
+ if self.app.find_pane(pane_id).is_none() {
+ self.shutdown_terminal_stream_clients(
+ &terminal_id,
+ format!("terminal {terminal_id} exited"),
+ );
+ }
+ }
+ true
}
- AppEvent::PaneDied { pane_id } => {
+ AppEvent::PaneDied { pane_id }
+ | AppEvent::WorktreeRuntimeRestoreFailed { pane_id, .. } => {
let focus_before = self.shell_focus_targets();
let focused_tabs_before = self.focused_shell_tabs();
let pane_id_val = *pane_id;
@@ -646,17 +674,28 @@ impl HeadlessServer {
.map(|pane| pane.attached_terminal_id.to_string())
})
});
- if let Some(update) = self
- .app
- .state
- .publish_pane_process_exit_if_agent(pane_id_val)
+ if matches!(&ev, AppEvent::PaneDied { .. })
+ && !self
+ .app
+ .pending_worktree_remove_runtime_exits
+ .contains_key(&pane_id_val)
{
- self.app.emit_pane_state_update(&update);
- self.forward_semantic_agent_notification(&update);
- self.forward_pane_state_update_notifications_to_clients(&update);
+ if let Some(update) = self
+ .app
+ .state
+ .publish_pane_process_exit_if_agent(pane_id_val, false)
+ {
+ self.app.emit_pane_state_update(&update);
+ self.forward_semantic_agent_notification(&update);
+ self.forward_pane_state_update_notifications_to_clients(&update);
+ }
}
- self.app.handle_internal_event(ev);
+ let pane_updates = self.app.handle_internal_event_with_pane_updates(ev);
+ for update in &pane_updates {
+ self.forward_semantic_agent_notification(update);
+ self.forward_pane_state_update_notifications_to_clients(update);
+ }
self.reconcile_client_shell_locations();
self.finish_shell_location_reconciliation(focus_before, &focused_tabs_before);