Persist local workspace side chats and add tab close controls (#60152)

## What changed

- Save side chats as attachments to their parent conversation when local workspace history supports them, and let users reopen them from the sidebar after a restart.
- Show chat names or first-prompt previews in sidebar labels, and allow saved side chats to be renamed with `/rename`.
- Add tab close buttons, middle-click closing, and the configurable `close_sidebar_tab` shortcut, defaulting to `Ctrl-X W`. Closing a saved chat keeps it available in the picker; archiving removes it from Side chats.
- Confirm actions that stop running work, discard unsent input, or lose temporary history. Delete saved TUI side chats when deleting their parent conversation.

## Testing

Add coverage for reopening saved side chats after restart, archive handling, close confirmations, and preventing close-confirmation keys from accepting a replacement approval dialog.

GitOrigin-RevId: 3d47533d007286a7354660c08df13a83dd48d5d7
This commit is contained in:
Felipe Coury
2026-11-07 17:31:27 +00:00
committed by copyberry
parent 57a808a392
commit 57e64682f8
54 changed files with 2047 additions and 254 deletions
+2
View File
@@ -111,6 +111,7 @@ impl KeymapActionId {
| "focus_sidebar_content"
| "focus_sidebar_tabs"
| "hide_pane"
| "close_sidebar_tab"
| "focus_pane_left"
| "focus_pane_right"
| "minimize_pane_width"
@@ -319,6 +320,7 @@ define_runtime_action_bindings! {
focus_sidebar_content,
focus_sidebar_tabs,
hide_pane,
close_sidebar_tab,
focus_pane_left,
focus_pane_right,
minimize_pane_width,
@@ -47,6 +47,7 @@ pub(in crate::keymap) fn register(
(Global, "resize_panes", Char('r'), "r"),
(Global, "minimize_pane_width", Char(','), ","),
(Global, "maximize_pane_width", Char('.'), "."),
(Global, "close_sidebar_tab", Char('w'), "w"),
(Global, "focus_sidebar_tabs", Char('t'), "t"),
] {
if remaining == 0 {