Show reconnect guidance when disconnecting from tasks (#40629)

## Why

Exiting a TUI connected to a persistent app server can leave work running, so
the existing session-exit summary does not explain how to reconnect or stop the
active turn.

## What changed

- Distinguish disconnects, interrupted turns, and removed threads when building
  exit summaries.
- For daemon and remote sessions, report whether work may still be running and
  print commands to reconnect or stop the current turn.
- Sanitize remote WebSocket addresses in displayed commands and preserve the
  configured remote authentication environment-variable option.
- Keep the existing token-usage and resume summary for embedded sessions.

## Testing

Add coverage for daemon, remote, interrupted, embedded, archived, and deleted
session exits, including credential sanitization.

GitOrigin-RevId: 9cbbf9c7dd36423a5ed99909a2b4cb32e3e87712
This commit is contained in:
Eric Traut authored and copyberry committed 2026-08-25 15:55:35 +00:00
1 parent 0cdb1f1c83
commit a63cb33e8d
16 files changed
+408 -96

No files matched your search

+4 -3
View File
@@ -20,7 +20,8 @@ pub(crate) fn remote_connection_status_value(
};
let address = match endpoint {
RemoteAppServerEndpoint::WebSocket { websocket_url, .. } => {
sanitized_websocket_display_address(websocket_url)
sanitized_websocket_url(websocket_url)
.map(|url| url.to_string())
.unwrap_or_else(|| "<invalid websocket URL>".to_string())
}
RemoteAppServerEndpoint::UnixSocket { socket_path } => {
@@ -33,13 +34,13 @@ pub(crate) fn remote_connection_status_value(
Some(RemoteConnectionStatus { address, version })
}
fn sanitized_websocket_display_address(raw: &str) -> Option<String> {
pub(crate) fn sanitized_websocket_url(raw: &str) -> Option<Url> {
let mut url = Url::parse(raw).ok()?;
let _ = url.set_username("");
let _ = url.set_password(None);
url.set_query(None);
url.set_fragment(None);
Some(url.to_string())
Some(url)
}
#[cfg(test)]