Add sidebar tabs and nonblocking side-chat creation (#59767)

## Why

Starting a side chat waits for fork and setup requests. Keep the workspace responsive during those requests and let users return to an existing side chat through the sidebar chooser.

## What changed

- Add a clickable `Side chat` tab and `+` chooser, plus the configurable `focus_sidebar_tabs` action bound to `leader t` by default.
- Create workspace side chats in the background, showing loading and failure states with `Enter` to retry and `Esc` to go back. Preserve opening prompts and avoid taking focus when the user has moved away.
- Retain inherited permission profiles and defer startup notifications until the side chat is registered on its owning backend.
- Quiet the parent composer while the chooser has focus and prevent completion popups or repeated activation keys from consuming chooser input.

## Testing

Extend tests and snapshots for loading and failure states, returning to an existing chat, draft preservation, inherited permissions, focus transitions, and deferred MCP startup notifications.

GitOrigin-RevId: 244bcd3f170819e2260f21dc1041cf8899fe048c
This commit is contained in:
Felipe Coury
2026-11-06 00:21:16 +00:00
committed by copyberry
parent b3c5a49458
commit 9df200a068
39 changed files with 1085 additions and 222 deletions
+2
View File
@@ -109,6 +109,7 @@ impl KeymapActionId {
self.action,
"focus_main_composer"
| "focus_sidebar_content"
| "focus_sidebar_tabs"
| "hide_pane"
| "focus_pane_left"
| "focus_pane_right"
@@ -316,6 +317,7 @@ define_runtime_action_bindings! {
focus_activity,
focus_main_composer,
focus_sidebar_content,
focus_sidebar_tabs,
hide_pane,
focus_pane_left,
focus_pane_right,
+1 -1
View File
@@ -205,7 +205,7 @@ impl KeymapContextSet {
| "maximize_pane_width"
| "resize_panes" => OPEN_PANE,
"focus_main_composer" => MAIN_COMPOSER_FOCUS,
"focus_sidebar_content" => SIDE_PANE | SIDEBAR_CHOOSER,
"focus_sidebar_content" | "focus_sidebar_tabs" => SIDE_PANE | SIDEBAR_CHOOSER,
_ => SIDE_PANE,
};
return self.0 & required != 0;
@@ -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, "focus_sidebar_tabs", Char('t'), "t"),
] {
if remaining == 0 {
break;