Move agent to the drawer

Max Brunsfeld created

Change summary

assets/keymaps/default-linux.json      | 408 ++++++++++++++--------------
assets/keymaps/default-macos.json      | 392 +++++++++++++-------------
assets/keymaps/default-windows.json    | 400 +++++++++++++-------------
crates/agent_ui/src/agent_panel.rs     | 299 ++------------------
crates/agent_ui/src/connection_view.rs |   3 
crates/agent_ui/src/sidebar.rs         | 150 ++++++---
crates/zed/src/zed.rs                  |  21 +
crates/zed_actions/src/lib.rs          |   6 
8 files changed, 751 insertions(+), 928 deletions(-)

Detailed changes

assets/keymaps/default-linux.json 🔗

@@ -45,22 +45,22 @@
       "ctrl-alt-z": "edit_prediction::RatePredictions",
       "ctrl-alt-shift-i": "edit_prediction::ToggleMenu",
       "ctrl-alt-l": "lsp_tool::ToggleMenu",
-      "ctrl-alt-shift-s": "workspace::ToggleWorktreeSecurity",
-    },
+      "ctrl-alt-shift-s": "workspace::ToggleWorktreeSecurity"
+    }
   },
   {
     "context": "Picker || menu",
     "bindings": {
       "up": "menu::SelectPrevious",
-      "down": "menu::SelectNext",
-    },
+      "down": "menu::SelectNext"
+    }
   },
   {
     "context": "menu",
     "bindings": {
       "right": "menu::SelectChild",
-      "left": "menu::SelectParent",
-    },
+      "left": "menu::SelectParent"
+    }
   },
   {
     "context": "Editor",
@@ -133,8 +133,8 @@
       "shift-f10": "editor::OpenContextMenu",
       "ctrl-alt-shift-e": "editor::ToggleEditPrediction",
       "f9": "editor::ToggleBreakpoint",
-      "shift-f9": "editor::EditLogBreakpoint",
-    },
+      "shift-f9": "editor::EditLogBreakpoint"
+    }
   },
   {
     "context": "Editor && mode == full",
@@ -153,44 +153,44 @@
       "ctrl-alt-e": "editor::SelectEnclosingSymbol",
       "ctrl-shift-backspace": "editor::GoToPreviousChange",
       "ctrl-shift-alt-backspace": "editor::GoToNextChange",
-      "alt-enter": "editor::OpenSelectionsInMultibuffer",
-    },
+      "alt-enter": "editor::OpenSelectionsInMultibuffer"
+    }
   },
   {
     "context": "Editor && mode == full && edit_prediction",
     "bindings": {
       "alt-]": "editor::NextEditPrediction",
-      "alt-[": "editor::PreviousEditPrediction",
-    },
+      "alt-[": "editor::PreviousEditPrediction"
+    }
   },
   {
     "context": "Editor && !edit_prediction",
     "bindings": {
-      "alt-\\": "editor::ShowEditPrediction",
-    },
+      "alt-\\": "editor::ShowEditPrediction"
+    }
   },
   {
     "context": "Editor && mode == auto_height",
     "bindings": {
       "ctrl-enter": "editor::Newline",
       "shift-enter": "editor::Newline",
-      "ctrl-shift-enter": "editor::NewlineBelow",
-    },
+      "ctrl-shift-enter": "editor::NewlineBelow"
+    }
   },
   {
     "context": "Markdown",
     "bindings": {
       "copy": "markdown::Copy",
       "ctrl-insert": "markdown::Copy",
-      "ctrl-c": "markdown::Copy",
-    },
+      "ctrl-c": "markdown::Copy"
+    }
   },
   {
     "context": "Editor && jupyter && !ContextEditor",
     "bindings": {
       "ctrl-shift-enter": "repl::Run",
-      "ctrl-alt-enter": "repl::RunInPlace",
-    },
+      "ctrl-alt-enter": "repl::RunInPlace"
+    }
   },
   {
     "context": "Editor && !agent_diff",
@@ -198,8 +198,8 @@
       "ctrl-k ctrl-r": "git::Restore",
       "ctrl-alt-y": "git::ToggleStaged",
       "alt-y": "git::StageAndNext",
-      "alt-shift-y": "git::UnstageAndNext",
-    },
+      "alt-shift-y": "git::UnstageAndNext"
+    }
   },
   {
     "context": "Editor && editor_agent_diff",
@@ -209,8 +209,8 @@
       "ctrl-alt-z": "agent::Reject",
       "shift-alt-y": "agent::KeepAll",
       "shift-alt-z": "agent::RejectAll",
-      "shift-ctrl-r": "agent::OpenAgentDiff",
-    },
+      "shift-ctrl-r": "agent::OpenAgentDiff"
+    }
   },
   {
     "context": "AgentDiff",
@@ -219,8 +219,8 @@
       "ctrl-alt-y": "agent::Keep",
       "ctrl-alt-z": "agent::Reject",
       "shift-alt-y": "agent::KeepAll",
-      "shift-alt-z": "agent::RejectAll",
-    },
+      "shift-alt-z": "agent::RejectAll"
+    }
   },
   {
     "context": "ContextEditor > Editor",
@@ -237,8 +237,8 @@
       "ctrl-g": "search::SelectNextMatch",
       "ctrl-shift-g": "search::SelectPreviousMatch",
       "ctrl-k l": "agent::OpenRulesLibrary",
-      "ctrl-shift-v": "agent::PasteRaw",
-    },
+      "ctrl-shift-v": "agent::PasteRaw"
+    }
   },
   {
     "context": "AgentPanel",
@@ -265,51 +265,51 @@
       "ctrl-shift-enter": "agent::ContinueThread",
       "ctrl-y": "agent::AllowOnce",
       "ctrl-alt-a": "agent::OpenPermissionDropdown",
-      "ctrl-alt-z": "agent::RejectOnce",
-    },
+      "ctrl-alt-z": "agent::RejectOnce"
+    }
   },
   {
     "context": "AgentPanel > Markdown",
     "bindings": {
       "copy": "markdown::CopyAsMarkdown",
       "ctrl-insert": "markdown::CopyAsMarkdown",
-      "ctrl-c": "markdown::CopyAsMarkdown",
-    },
+      "ctrl-c": "markdown::CopyAsMarkdown"
+    }
   },
   {
     "context": "AgentPanel && text_thread",
     "bindings": {
       "ctrl-n": "agent::NewTextThread",
-      "ctrl-alt-t": "agent::NewThread",
-    },
+      "ctrl-alt-t": "agent::NewThread"
+    }
   },
   {
     "context": "AgentPanel && acp_thread",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-n": "agent::NewExternalAgentThread",
-      "ctrl-alt-t": "agent::NewThread",
-    },
+      "ctrl-alt-t": "agent::NewThread"
+    }
   },
   {
     "context": "AgentFeedbackMessageEditor > Editor",
     "bindings": {
       "escape": "menu::Cancel",
       "enter": "menu::Confirm",
-      "alt-enter": "editor::Newline",
-    },
+      "alt-enter": "editor::Newline"
+    }
   },
   {
     "context": "AcpThread > ModeSelector",
     "bindings": {
-      "ctrl-enter": "menu::Confirm",
-    },
+      "ctrl-enter": "menu::Confirm"
+    }
   },
   {
     "context": "AcpThread",
     "bindings": {
-      "ctrl--": "pane::GoBack",
-    },
+      "ctrl--": "pane::GoBack"
+    }
   },
   {
     "context": "AcpThread > Editor",
@@ -336,29 +336,29 @@
       "ctrl-alt-k": "agent::ToggleThinkingMode",
       "ctrl-alt-'": "agent::ToggleThinkingEffortMenu",
       "ctrl-'": "agent::CycleThinkingEffort",
-      "ctrl-alt-.": "agent::ToggleFastMode",
-    },
+      "ctrl-alt-.": "agent::ToggleFastMode"
+    }
   },
   {
     "context": "AcpThread > Editor && !use_modifier_to_send",
     "use_key_equivalents": true,
     "bindings": {
-      "enter": "agent::Chat",
-    },
+      "enter": "agent::Chat"
+    }
   },
   {
     "context": "AcpThread > Editor && use_modifier_to_send",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-enter": "agent::Chat",
-      "enter": "editor::Newline",
-    },
+      "enter": "editor::Newline"
+    }
   },
   {
     "context": "ThreadHistory",
     "bindings": {
-      "backspace": "agent::RemoveSelectedThread",
-    },
+      "backspace": "agent::RemoveSelectedThread"
+    }
   },
   {
     "context": "RulesLibrary",
@@ -366,8 +366,8 @@
       "new": "rules_library::NewRule",
       "ctrl-n": "rules_library::NewRule",
       "ctrl-shift-s": "rules_library::ToggleDefaultRule",
-      "ctrl-w": "workspace::CloseWindow",
-    },
+      "ctrl-w": "workspace::CloseWindow"
+    }
   },
   {
     "context": "BufferSearchBar",
@@ -381,22 +381,22 @@
       "find": "search::FocusSearch",
       "ctrl-f": "search::FocusSearch",
       "ctrl-h": "search::ToggleReplace",
-      "ctrl-l": "search::ToggleSelection",
-    },
+      "ctrl-l": "search::ToggleSelection"
+    }
   },
   {
     "context": "BufferSearchBar && in_replace > Editor",
     "bindings": {
       "enter": "search::ReplaceNext",
-      "ctrl-enter": "search::ReplaceAll",
-    },
+      "ctrl-enter": "search::ReplaceAll"
+    }
   },
   {
     "context": "BufferSearchBar && !in_replace > Editor",
     "bindings": {
       "up": "search::PreviousHistoryQuery",
-      "down": "search::NextHistoryQuery",
-    },
+      "down": "search::NextHistoryQuery"
+    }
   },
   {
     "context": "ProjectSearchBar",
@@ -407,22 +407,22 @@
       "ctrl-shift-f": "search::FocusSearch",
       "ctrl-shift-h": "search::ToggleReplace",
       "alt-ctrl-g": "search::ToggleRegex",
-      "alt-ctrl-x": "search::ToggleRegex",
-    },
+      "alt-ctrl-x": "search::ToggleRegex"
+    }
   },
   {
     "context": "ProjectSearchBar > Editor",
     "bindings": {
       "up": "search::PreviousHistoryQuery",
-      "down": "search::NextHistoryQuery",
-    },
+      "down": "search::NextHistoryQuery"
+    }
   },
   {
     "context": "ProjectSearchBar && in_replace > Editor",
     "bindings": {
       "enter": "search::ReplaceNext",
-      "ctrl-alt-enter": "search::ReplaceAll",
-    },
+      "ctrl-alt-enter": "search::ReplaceAll"
+    }
   },
   {
     "context": "ProjectSearchView",
@@ -430,8 +430,8 @@
       "escape": "project_search::ToggleFocus",
       "ctrl-shift-h": "search::ToggleReplace",
       "alt-ctrl-g": "search::ToggleRegex",
-      "alt-ctrl-x": "search::ToggleRegex",
-    },
+      "alt-ctrl-x": "search::ToggleRegex"
+    }
   },
   {
     "context": "Pane",
@@ -480,8 +480,8 @@
       "ctrl-alt-shift-r": "search::ToggleRegex",
       "ctrl-alt-shift-x": "search::ToggleRegex",
       "alt-r": "search::ToggleRegex",
-      "ctrl-k shift-enter": "pane::TogglePinTab",
-    },
+      "ctrl-k shift-enter": "pane::TogglePinTab"
+    }
   },
   // Bindings from VS Code
   {
@@ -545,31 +545,31 @@
       "ctrl-\\": "pane::SplitRight",
       "ctrl-alt-shift-c": "editor::DisplayCursorNames",
       "alt-.": "editor::GoToHunk",
-      "alt-,": "editor::GoToPreviousHunk",
-    },
+      "alt-,": "editor::GoToPreviousHunk"
+    }
   },
   {
     "context": "Editor && extension == md",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-k v": "markdown::OpenPreviewToTheSide",
-      "ctrl-shift-v": "markdown::OpenPreview",
-    },
+      "ctrl-shift-v": "markdown::OpenPreview"
+    }
   },
   {
     "context": "Editor && extension == svg",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-k v": "svg::OpenPreviewToTheSide",
-      "ctrl-shift-v": "svg::OpenPreview",
-    },
+      "ctrl-shift-v": "svg::OpenPreview"
+    }
   },
   {
     "context": "Editor && mode == full",
     "bindings": {
       "ctrl-shift-o": "outline::Toggle",
-      "ctrl-g": "go_to_line::Toggle",
-    },
+      "ctrl-g": "go_to_line::Toggle"
+    }
   },
   {
     "context": "Workspace",
@@ -608,7 +608,7 @@
       "ctrl-alt-b": "workspace::ToggleRightDock",
       "ctrl-b": "workspace::ToggleLeftDock",
       "ctrl-j": "workspace::ToggleBottomDock",
-      "ctrl-alt-j": "multi_workspace::ToggleWorkspaceSidebar",
+      "ctrl-alt-j": "agent::ToggleThreadsSidebar",
       "ctrl-alt-;": "multi_workspace::FocusWorkspaceSidebar",
       "ctrl-alt-y": "workspace::ToggleAllDocks",
       "ctrl-alt-0": "workspace::ResetActiveDockSize",
@@ -638,7 +638,7 @@
       "ctrl-shift-b": "outline_panel::ToggleFocus",
       "ctrl-shift-g": "git_panel::ToggleFocus",
       "ctrl-shift-d": "debug_panel::ToggleFocus",
-      "ctrl-?": "agent::ToggleFocus",
+      "ctrl-?": "agent::ToggleAgentDrawer",
       "alt-save": "workspace::SaveAll",
       "ctrl-alt-s": "workspace::SaveAll",
       "ctrl-k n": "encoding_selector::Toggle",
@@ -667,8 +667,8 @@
       // "foo-bar": ["task::Spawn", { "task_tag": "MyTag" }],
       "f5": "debugger::Rerun",
       "ctrl-f4": "workspace::CloseActiveDock",
-      "ctrl-w": "workspace::CloseActiveDock",
-    },
+      "ctrl-w": "workspace::CloseActiveDock"
+    }
   },
   {
     "context": "WorkspaceSidebar",
@@ -677,28 +677,28 @@
       "ctrl-n": "multi_workspace::NewWorkspaceInWindow",
       "left": "agents_sidebar::CollapseSelectedEntry",
       "right": "agents_sidebar::ExpandSelectedEntry",
-      "enter": "menu::Confirm",
-    },
+      "enter": "menu::Confirm"
+    }
   },
   {
     "context": "Workspace && debugger_running",
     "bindings": {
-      "f5": "zed::NoAction",
-    },
+      "f5": "zed::NoAction"
+    }
   },
   {
     "context": "Workspace && debugger_stopped",
     "bindings": {
-      "f5": "debugger::Continue",
-    },
+      "f5": "debugger::Continue"
+    }
   },
   {
     "context": "ApplicationMenu",
     "bindings": {
       "f10": "menu::Cancel",
       "left": "app_menu::ActivateMenuLeft",
-      "right": "app_menu::ActivateMenuRight",
-    },
+      "right": "app_menu::ActivateMenuRight"
+    }
   },
   // Bindings from Sublime Text
   {
@@ -716,8 +716,8 @@
       "ctrl-alt-shift-left": "editor::SelectToPreviousSubwordStart",
       "ctrl-alt-shift-b": "editor::SelectToPreviousSubwordStart",
       "ctrl-alt-shift-right": "editor::SelectToNextSubwordEnd",
-      "ctrl-alt-shift-f": "editor::SelectToNextSubwordEnd",
-    },
+      "ctrl-alt-shift-f": "editor::SelectToNextSubwordEnd"
+    }
   },
   // Bindings from Atom
   {
@@ -726,37 +726,37 @@
       "ctrl-k up": "pane::SplitUp",
       "ctrl-k down": "pane::SplitDown",
       "ctrl-k left": "pane::SplitLeft",
-      "ctrl-k right": "pane::SplitRight",
-    },
+      "ctrl-k right": "pane::SplitRight"
+    }
   },
   // Bindings that should be unified with bindings for more general actions
   {
     "context": "Editor && renaming",
     "bindings": {
-      "enter": "editor::ConfirmRename",
-    },
+      "enter": "editor::ConfirmRename"
+    }
   },
   {
     "context": "Editor && showing_completions",
     "bindings": {
       "enter": "editor::ConfirmCompletion",
       "shift-enter": "editor::ConfirmCompletionReplace",
-      "tab": "editor::ComposeCompletion",
-    },
+      "tab": "editor::ComposeCompletion"
+    }
   },
   {
     "context": "Editor && in_snippet && has_next_tabstop && !showing_completions",
     "use_key_equivalents": true,
     "bindings": {
-      "tab": "editor::NextSnippetTabstop",
-    },
+      "tab": "editor::NextSnippetTabstop"
+    }
   },
   {
     "context": "Editor && in_snippet && has_previous_tabstop && !showing_completions",
     "use_key_equivalents": true,
     "bindings": {
-      "shift-tab": "editor::PreviousSnippetTabstop",
-    },
+      "shift-tab": "editor::PreviousSnippetTabstop"
+    }
   },
   // Bindings for accepting edit predictions
   //
@@ -769,8 +769,8 @@
       "alt-l": "editor::AcceptEditPrediction",
       "tab": "editor::AcceptEditPrediction",
       "alt-k": "editor::AcceptNextWordEditPrediction",
-      "alt-j": "editor::AcceptNextLineEditPrediction",
-    },
+      "alt-j": "editor::AcceptNextLineEditPrediction"
+    }
   },
   {
     "context": "Editor && edit_prediction_conflict",
@@ -778,14 +778,14 @@
       "alt-tab": "editor::AcceptEditPrediction",
       "alt-l": "editor::AcceptEditPrediction",
       "alt-k": "editor::AcceptNextWordEditPrediction",
-      "alt-j": "editor::AcceptNextLineEditPrediction",
-    },
+      "alt-j": "editor::AcceptNextLineEditPrediction"
+    }
   },
   {
     "context": "Editor && showing_code_actions",
     "bindings": {
-      "enter": "editor::ConfirmCodeAction",
-    },
+      "enter": "editor::ConfirmCodeAction"
+    }
   },
   {
     "context": "Editor && (showing_code_actions || showing_completions)",
@@ -795,29 +795,29 @@
       "ctrl-n": "editor::ContextMenuNext",
       "down": "editor::ContextMenuNext",
       "pageup": "editor::ContextMenuFirst",
-      "pagedown": "editor::ContextMenuLast",
-    },
+      "pagedown": "editor::ContextMenuLast"
+    }
   },
   {
     "context": "Editor && showing_signature_help && !showing_completions",
     "bindings": {
       "up": "editor::SignatureHelpPrevious",
-      "down": "editor::SignatureHelpNext",
-    },
+      "down": "editor::SignatureHelpNext"
+    }
   },
   // Custom bindings
   {
     "bindings": {
       "ctrl-alt-shift-f": "workspace::FollowNextCollaborator",
       // Only available in debug builds: opens an element inspector for development.
-      "ctrl-alt-i": "dev::ToggleInspector",
-    },
+      "ctrl-alt-i": "dev::ToggleInspector"
+    }
   },
   {
     "context": "!Terminal",
     "bindings": {
-      "ctrl-shift-c": "collab_panel::ToggleFocus",
-    },
+      "ctrl-shift-c": "collab_panel::ToggleFocus"
+    }
   },
   {
     "context": "!ContextEditor && !AcpThread > Editor && mode == full",
@@ -829,8 +829,8 @@
       "ctrl-f8": "editor::GoToHunk",
       "ctrl-shift-f8": "editor::GoToPreviousHunk",
       "ctrl-enter": "assistant::InlineAssist",
-      "ctrl-:": "editor::ToggleInlayHints",
-    },
+      "ctrl-:": "editor::ToggleInlayHints"
+    }
   },
   {
     "context": "InlineAssistant",
@@ -838,8 +838,8 @@
       "ctrl-[": "agent::CyclePreviousInlineAssist",
       "ctrl-]": "agent::CycleNextInlineAssist",
       "ctrl-shift-enter": "inline_assistant::ThumbsUpResult",
-      "ctrl-shift-backspace": "inline_assistant::ThumbsDownResult",
-    },
+      "ctrl-shift-backspace": "inline_assistant::ThumbsDownResult"
+    }
   },
   {
     "context": "Prompt",
@@ -847,14 +847,14 @@
       "left": "menu::SelectPrevious",
       "right": "menu::SelectNext",
       "h": "menu::SelectPrevious",
-      "l": "menu::SelectNext",
-    },
+      "l": "menu::SelectNext"
+    }
   },
   {
     "context": "ProjectSearchBar && !in_replace",
     "bindings": {
-      "ctrl-enter": "project_search::SearchInNew",
-    },
+      "ctrl-enter": "project_search::SearchInNew"
+    }
   },
   {
     "context": "OutlinePanel && not_editing",
@@ -871,8 +871,8 @@
       "shift-down": "menu::SelectNext",
       "shift-up": "menu::SelectPrevious",
       "alt-enter": "editor::OpenExcerpts",
-      "ctrl-alt-enter": "editor::OpenExcerptsSplit",
-    },
+      "ctrl-alt-enter": "editor::OpenExcerptsSplit"
+    }
   },
   {
     "context": "ProjectPanel",
@@ -910,14 +910,14 @@
       "ctrl-alt-shift-f": "project_panel::NewSearchInDirectory",
       "shift-down": "menu::SelectNext",
       "shift-up": "menu::SelectPrevious",
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "ProjectPanel && not_editing",
     "bindings": {
-      "space": "project_panel::Open",
-    },
+      "space": "project_panel::Open"
+    }
   },
   {
     "context": "GitPanel && ChangesList",
@@ -940,15 +940,15 @@
       "backspace": ["git::RestoreFile", { "skip_prompt": false }],
       "shift-delete": ["git::RestoreFile", { "skip_prompt": false }],
       "ctrl-backspace": ["git::RestoreFile", { "skip_prompt": false }],
-      "ctrl-delete": ["git::RestoreFile", { "skip_prompt": false }],
-    },
+      "ctrl-delete": ["git::RestoreFile", { "skip_prompt": false }]
+    }
   },
   {
     "context": "GitPanel && CommitEditor",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "git::Cancel",
-    },
+      "escape": "git::Cancel"
+    }
   },
   {
     "context": "GitCommit > Editor",
@@ -957,8 +957,8 @@
       "enter": "editor::Newline",
       "ctrl-enter": "git::Commit",
       "ctrl-shift-enter": "git::Amend",
-      "alt-l": "git::GenerateCommitMessage",
-    },
+      "alt-l": "git::GenerateCommitMessage"
+    }
   },
   {
     "context": "GitPanel",
@@ -974,8 +974,8 @@
       "ctrl-space": "git::StageAll",
       "ctrl-shift-space": "git::UnstageAll",
       "ctrl-enter": "git::Commit",
-      "ctrl-shift-enter": "git::Amend",
-    },
+      "ctrl-shift-enter": "git::Amend"
+    }
   },
   {
     "context": "GitDiff > Editor",
@@ -984,14 +984,14 @@
       "ctrl-shift-enter": "git::Amend",
       "ctrl-space": "git::StageAll",
       "ctrl-shift-space": "git::UnstageAll",
-      "ctrl-k ctrl-r": "git::RestoreAndNext",
-    },
+      "ctrl-k ctrl-r": "git::RestoreAndNext"
+    }
   },
   {
     "context": "AskPass > Editor",
     "bindings": {
-      "enter": "menu::Confirm",
-    },
+      "enter": "menu::Confirm"
+    }
   },
   {
     "context": "CommitEditor > Editor",
@@ -1003,16 +1003,16 @@
       "ctrl-enter": "git::Commit",
       "ctrl-shift-enter": "git::Amend",
       "alt-up": "git_panel::FocusChanges",
-      "alt-l": "git::GenerateCommitMessage",
-    },
+      "alt-l": "git::GenerateCommitMessage"
+    }
   },
   {
     "context": "DebugPanel",
     "bindings": {
       "ctrl-t": "debugger::ToggleThreadPicker",
       "ctrl-i": "debugger::ToggleSessionPicker",
-      "shift-alt-escape": "debugger::ToggleExpandItem",
-    },
+      "shift-alt-escape": "debugger::ToggleExpandItem"
+    }
   },
   {
     "context": "VariableList",
@@ -1024,8 +1024,8 @@
       "ctrl-alt-c": "variable_list::CopyVariableName",
       "delete": "variable_list::RemoveWatch",
       "backspace": "variable_list::RemoveWatch",
-      "alt-enter": "variable_list::AddWatch",
-    },
+      "alt-enter": "variable_list::AddWatch"
+    }
   },
   {
     "context": "BreakpointList",
@@ -1033,35 +1033,35 @@
       "space": "debugger::ToggleEnableBreakpoint",
       "backspace": "debugger::UnsetBreakpoint",
       "left": "debugger::PreviousBreakpointProperty",
-      "right": "debugger::NextBreakpointProperty",
-    },
+      "right": "debugger::NextBreakpointProperty"
+    }
   },
   {
     "context": "CollabPanel && not_editing",
     "bindings": {
       "ctrl-backspace": "collab_panel::Remove",
-      "space": "menu::Confirm",
-    },
+      "space": "menu::Confirm"
+    }
   },
   {
     "context": "CollabPanel",
     "bindings": {
       "alt-up": "collab_panel::MoveChannelUp",
       "alt-down": "collab_panel::MoveChannelDown",
-      "alt-enter": "collab_panel::OpenSelectedChannelNotes",
-    },
+      "alt-enter": "collab_panel::OpenSelectedChannelNotes"
+    }
   },
   {
     "context": "(CollabPanel && editing) > Editor",
     "bindings": {
-      "space": "collab_panel::InsertSpace",
-    },
+      "space": "collab_panel::InsertSpace"
+    }
   },
   {
     "context": "ChannelModal",
     "bindings": {
-      "tab": "channel_modal::ToggleMode",
-    },
+      "tab": "channel_modal::ToggleMode"
+    }
   },
   {
     "context": "Picker > Editor",
@@ -1070,29 +1070,29 @@
       "up": "menu::SelectPrevious",
       "down": "menu::SelectNext",
       "tab": "picker::ConfirmCompletion",
-      "alt-enter": ["picker::ConfirmInput", { "secondary": false }],
-    },
+      "alt-enter": ["picker::ConfirmInput", { "secondary": false }]
+    }
   },
   {
     "context": "ChannelModal > Picker > Editor",
     "bindings": {
-      "tab": "channel_modal::ToggleMode",
-    },
+      "tab": "channel_modal::ToggleMode"
+    }
   },
   {
     "context": "ToolchainSelector",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-shift-a": "toolchain::AddToolchain",
-    },
+      "ctrl-shift-a": "toolchain::AddToolchain"
+    }
   },
   {
     "context": "FileFinder || (FileFinder > Picker > Editor)",
     "bindings": {
       "ctrl-p": "file_finder::Toggle",
       "ctrl-shift-a": "file_finder::ToggleSplitMenu",
-      "ctrl-shift-i": "file_finder::ToggleFilterMenu",
-    },
+      "ctrl-shift-i": "file_finder::ToggleFilterMenu"
+    }
   },
   {
     "context": "FileFinder || (FileFinder > Picker > Editor) || (FileFinder > Picker > menu)",
@@ -1101,15 +1101,15 @@
       "ctrl-j": "pane::SplitDown",
       "ctrl-k": "pane::SplitUp",
       "ctrl-h": "pane::SplitLeft",
-      "ctrl-l": "pane::SplitRight",
-    },
+      "ctrl-l": "pane::SplitRight"
+    }
   },
   {
     "context": "RecentProjects || (RecentProjects > Picker > Editor)",
     "bindings": {
       "ctrl-k": "recent_projects::ToggleActionsMenu",
-      "ctrl-shift-a": "workspace::AddFolderToProject",
-    },
+      "ctrl-shift-a": "workspace::AddFolderToProject"
+    }
   },
   {
     "context": "TabSwitcher",
@@ -1117,15 +1117,15 @@
       "ctrl-shift-tab": "menu::SelectPrevious",
       "ctrl-up": "menu::SelectPrevious",
       "ctrl-down": "menu::SelectNext",
-      "ctrl-backspace": "tab_switcher::CloseSelectedItem",
-    },
+      "ctrl-backspace": "tab_switcher::CloseSelectedItem"
+    }
   },
   {
     "context": "StashList || (StashList > Picker > Editor)",
     "bindings": {
       "ctrl-shift-backspace": "stash_picker::DropStashItem",
-      "ctrl-shift-v": "stash_picker::ShowStashItem",
-    },
+      "ctrl-shift-v": "stash_picker::ShowStashItem"
+    }
   },
   {
     "context": "Terminal",
@@ -1171,58 +1171,58 @@
       "ctrl-alt-r": "terminal::RerunTask",
       "alt-t": "terminal::RerunTask",
       "ctrl-shift-5": "pane::SplitRight",
-      "ctrl->": "agent::AddSelectionToThread",
-    },
+      "ctrl->": "agent::AddSelectionToThread"
+    }
   },
   {
     "context": "ZedPredictModal",
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "ConfigureContextServerModal > Editor",
     "bindings": {
       "escape": "menu::Cancel",
       "enter": "editor::Newline",
-      "ctrl-enter": "menu::Confirm",
-    },
+      "ctrl-enter": "menu::Confirm"
+    }
   },
   {
     "context": "ContextServerToolsModal",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "OnboardingAiConfigurationModal",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "Diagnostics",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-r": "diagnostics::ToggleDiagnosticsRefresh",
-    },
+      "ctrl-r": "diagnostics::ToggleDiagnosticsRefresh"
+    }
   },
   {
     "context": "DebugConsole > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "enter": "menu::Confirm",
-      "alt-enter": "console::WatchExpression",
-    },
+      "alt-enter": "console::WatchExpression"
+    }
   },
   {
     "context": "RunModal",
     "bindings": {
       "ctrl-tab": "pane::ActivateNextItem",
-      "ctrl-shift-tab": "pane::ActivatePreviousItem",
-    },
+      "ctrl-shift-tab": "pane::ActivatePreviousItem"
+    }
   },
   {
     "context": "MarkdownPreview",
@@ -1232,8 +1232,8 @@
       "up": "markdown::ScrollUp",
       "down": "markdown::ScrollDown",
       "alt-up": "markdown::ScrollUpByItem",
-      "alt-down": "markdown::ScrollDownByItem",
-    },
+      "alt-down": "markdown::ScrollDownByItem"
+    }
   },
   {
     "context": "KeymapEditor",
@@ -1249,8 +1249,8 @@
       "ctrl-c": "keymap_editor::CopyAction",
       "ctrl-shift-c": "keymap_editor::CopyContext",
       "ctrl-t": "keymap_editor::ShowMatchingKeybinds",
-      "ctrl-e": "zed::OpenKeymapFile",
-    },
+      "ctrl-e": "zed::OpenKeymapFile"
+    }
   },
   {
     "context": "KeystrokeInput",
@@ -1258,24 +1258,24 @@
     "bindings": {
       "enter": "keystroke_input::StartRecording",
       "escape escape escape": "keystroke_input::StopRecording",
-      "delete": "keystroke_input::ClearKeystrokes",
-    },
+      "delete": "keystroke_input::ClearKeystrokes"
+    }
   },
   {
     "context": "KeybindEditorModal",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-enter": "menu::Confirm",
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "KeybindEditorModal > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "up": "menu::SelectPrevious",
-      "down": "menu::SelectNext",
-    },
+      "down": "menu::SelectNext"
+    }
   },
   {
     "context": "Onboarding",
@@ -1287,8 +1287,8 @@
       "ctrl-0": ["zed::ResetUiFontSize", { "persist": false }],
       "ctrl-enter": "onboarding::Finish",
       "alt-shift-l": "onboarding::SignIn",
-      "alt-shift-a": "onboarding::OpenAccount",
-    },
+      "alt-shift-a": "onboarding::OpenAccount"
+    }
   },
   {
     "context": "Welcome",
@@ -1302,15 +1302,15 @@
       "ctrl-2": ["welcome::OpenRecentProject", 1],
       "ctrl-3": ["welcome::OpenRecentProject", 2],
       "ctrl-4": ["welcome::OpenRecentProject", 3],
-      "ctrl-5": ["welcome::OpenRecentProject", 4],
-    },
+      "ctrl-5": ["welcome::OpenRecentProject", 4]
+    }
   },
   {
     "context": "InvalidBuffer",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-shift-enter": "workspace::OpenWithSystem",
-    },
+      "ctrl-shift-enter": "workspace::OpenWithSystem"
+    }
   },
   {
     "context": "GitWorktreeSelector || (GitWorktreeSelector > Picker > Editor)",

assets/keymaps/default-macos.json 🔗

@@ -51,15 +51,15 @@
       "ctrl-cmd-i": "edit_prediction::ToggleMenu",
       "ctrl-cmd-l": "lsp_tool::ToggleMenu",
       "ctrl-cmd-c": "editor::DisplayCursorNames",
-      "ctrl-cmd-s": "workspace::ToggleWorktreeSecurity",
-    },
+      "ctrl-cmd-s": "workspace::ToggleWorktreeSecurity"
+    }
   },
   {
     "context": "menu",
     "bindings": {
       "right": "menu::SelectChild",
-      "left": "menu::SelectParent",
-    },
+      "left": "menu::SelectParent"
+    }
   },
   {
     "context": "Editor",
@@ -157,8 +157,8 @@
       "shift-f9": "editor::EditLogBreakpoint",
       "ctrl-f12": "editor::GoToDeclaration",
       "alt-ctrl-f12": "editor::GoToDeclarationSplit",
-      "ctrl-cmd-e": "editor::ToggleEditPrediction",
-    },
+      "ctrl-cmd-e": "editor::ToggleEditPrediction"
+    }
   },
   {
     "context": "Editor && mode == full",
@@ -176,8 +176,8 @@
       "cmd->": "agent::AddSelectionToThread",
       "cmd-<": "assistant::InsertIntoEditor",
       "cmd-alt-e": "editor::SelectEnclosingSymbol",
-      "alt-enter": "editor::OpenSelectionsInMultibuffer",
-    },
+      "alt-enter": "editor::OpenSelectionsInMultibuffer"
+    }
   },
   {
     "context": "Editor && multibuffer",
@@ -186,23 +186,23 @@
       "cmd-up": "editor::MoveToStartOfExcerpt",
       "cmd-down": "editor::MoveToStartOfNextExcerpt",
       "cmd-shift-up": "editor::SelectToStartOfExcerpt",
-      "cmd-shift-down": "editor::SelectToStartOfNextExcerpt",
-    },
+      "cmd-shift-down": "editor::SelectToStartOfNextExcerpt"
+    }
   },
   {
     "context": "Editor && mode == full && edit_prediction",
     "use_key_equivalents": true,
     "bindings": {
       "alt-tab": "editor::NextEditPrediction",
-      "alt-shift-tab": "editor::PreviousEditPrediction",
-    },
+      "alt-shift-tab": "editor::PreviousEditPrediction"
+    }
   },
   {
     "context": "Editor && !edit_prediction",
     "use_key_equivalents": true,
     "bindings": {
-      "alt-tab": "editor::ShowEditPrediction",
-    },
+      "alt-tab": "editor::ShowEditPrediction"
+    }
   },
   {
     "context": "Editor && mode == auto_height",
@@ -210,23 +210,23 @@
     "bindings": {
       "ctrl-enter": "editor::Newline",
       "shift-enter": "editor::Newline",
-      "ctrl-shift-enter": "editor::NewlineBelow",
-    },
+      "ctrl-shift-enter": "editor::NewlineBelow"
+    }
   },
   {
     "context": "Markdown",
     "use_key_equivalents": true,
     "bindings": {
-      "cmd-c": "markdown::Copy",
-    },
+      "cmd-c": "markdown::Copy"
+    }
   },
   {
     "context": "Editor && jupyter && !ContextEditor",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-shift-enter": "repl::Run",
-      "ctrl-alt-enter": "repl::RunInPlace",
-    },
+      "ctrl-alt-enter": "repl::RunInPlace"
+    }
   },
   {
     "context": "Editor && !agent_diff && !AgentPanel",
@@ -235,8 +235,8 @@
       "cmd-alt-z": "git::Restore",
       "cmd-alt-y": "git::ToggleStaged",
       "cmd-y": "git::StageAndNext",
-      "cmd-shift-y": "git::UnstageAndNext",
-    },
+      "cmd-shift-y": "git::UnstageAndNext"
+    }
   },
   {
     "context": "AgentDiff",
@@ -246,8 +246,8 @@
       "cmd-alt-y": "agent::Keep",
       "cmd-alt-z": "agent::Reject",
       "shift-alt-y": "agent::KeepAll",
-      "shift-alt-z": "agent::RejectAll",
-    },
+      "shift-alt-z": "agent::RejectAll"
+    }
   },
   {
     "context": "Editor && editor_agent_diff",
@@ -258,8 +258,8 @@
       "cmd-alt-z": "agent::Reject",
       "shift-alt-y": "agent::KeepAll",
       "shift-alt-z": "agent::RejectAll",
-      "shift-ctrl-r": "agent::OpenAgentDiff",
-    },
+      "shift-ctrl-r": "agent::OpenAgentDiff"
+    }
   },
   {
     "context": "ContextEditor > Editor",
@@ -277,8 +277,8 @@
       "cmd-shift-g": "search::SelectPreviousMatch",
       "cmd-k l": "agent::OpenRulesLibrary",
       "alt-tab": "agent::CycleFavoriteModels",
-      "cmd-shift-v": "agent::PasteRaw",
-    },
+      "cmd-shift-v": "agent::PasteRaw"
+    }
   },
   {
     "context": "AgentPanel",
@@ -304,31 +304,31 @@
       "cmd-shift-enter": "agent::ContinueThread",
       "cmd-y": "agent::AllowOnce",
       "cmd-alt-a": "agent::OpenPermissionDropdown",
-      "cmd-alt-z": "agent::RejectOnce",
-    },
+      "cmd-alt-z": "agent::RejectOnce"
+    }
   },
   {
     "context": "AgentPanel > Markdown",
     "use_key_equivalents": true,
     "bindings": {
-      "cmd-c": "markdown::CopyAsMarkdown",
-    },
+      "cmd-c": "markdown::CopyAsMarkdown"
+    }
   },
   {
     "context": "AgentPanel && text_thread",
     "use_key_equivalents": true,
     "bindings": {
       "cmd-n": "agent::NewTextThread",
-      "cmd-alt-n": "agent::NewExternalAgentThread",
-    },
+      "cmd-alt-n": "agent::NewExternalAgentThread"
+    }
   },
   {
     "context": "AgentPanel && acp_thread",
     "use_key_equivalents": true,
     "bindings": {
       "cmd-n": "agent::NewExternalAgentThread",
-      "cmd-alt-t": "agent::NewThread",
-    },
+      "cmd-alt-t": "agent::NewThread"
+    }
   },
   {
     "context": "AgentFeedbackMessageEditor > Editor",
@@ -336,26 +336,26 @@
     "bindings": {
       "escape": "menu::Cancel",
       "enter": "menu::Confirm",
-      "alt-enter": "editor::Newline",
-    },
+      "alt-enter": "editor::Newline"
+    }
   },
   {
     "context": "AgentConfiguration",
     "bindings": {
-      "ctrl--": "pane::GoBack",
-    },
+      "ctrl--": "pane::GoBack"
+    }
   },
   {
     "context": "AcpThread > ModeSelector",
     "bindings": {
-      "cmd-enter": "menu::Confirm",
-    },
+      "cmd-enter": "menu::Confirm"
+    }
   },
   {
     "context": "AcpThread",
     "bindings": {
-      "ctrl--": "pane::GoBack",
-    },
+      "ctrl--": "pane::GoBack"
+    }
   },
   {
     "context": "AcpThread > Editor",
@@ -380,35 +380,35 @@
       "cmd-alt-k": "agent::ToggleThinkingMode",
       "cmd-alt-'": "agent::ToggleThinkingEffortMenu",
       "ctrl-'": "agent::CycleThinkingEffort",
-      "cmd-alt-.": "agent::ToggleFastMode",
-    },
+      "cmd-alt-.": "agent::ToggleFastMode"
+    }
   },
   {
     "context": "AcpThread > Editor && !use_modifier_to_send",
     "use_key_equivalents": true,
     "bindings": {
-      "enter": "agent::Chat",
-    },
+      "enter": "agent::Chat"
+    }
   },
   {
     "context": "AcpThread > Editor && use_modifier_to_send",
     "use_key_equivalents": true,
     "bindings": {
       "cmd-enter": "agent::Chat",
-      "enter": "editor::Newline",
-    },
+      "enter": "editor::Newline"
+    }
   },
   {
     "context": "ThreadHistory",
     "bindings": {
-      "ctrl--": "pane::GoBack",
-    },
+      "ctrl--": "pane::GoBack"
+    }
   },
   {
     "context": "ThreadHistory > Editor",
     "bindings": {
-      "shift-backspace": "agent::RemoveSelectedThread",
-    },
+      "shift-backspace": "agent::RemoveSelectedThread"
+    }
   },
   {
     "context": "RulesLibrary",
@@ -416,8 +416,8 @@
     "bindings": {
       "cmd-n": "rules_library::NewRule",
       "cmd-shift-s": "rules_library::ToggleDefaultRule",
-      "cmd-w": "workspace::CloseWindow",
-    },
+      "cmd-w": "workspace::CloseWindow"
+    }
   },
   {
     "context": "BufferSearchBar",
@@ -432,31 +432,31 @@
       "cmd-f": "search::FocusSearch",
       "cmd-alt-f": "search::ToggleReplace",
       "cmd-alt-l": "search::ToggleSelection",
-      "cmd-shift-o": "outline::Toggle",
-    },
+      "cmd-shift-o": "outline::Toggle"
+    }
   },
   {
     "context": "BufferSearchBar && in_replace > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "enter": "search::ReplaceNext",
-      "cmd-enter": "search::ReplaceAll",
-    },
+      "cmd-enter": "search::ReplaceAll"
+    }
   },
   {
     "context": "BufferSearchBar && !in_replace > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "up": "search::PreviousHistoryQuery",
-      "down": "search::NextHistoryQuery",
-    },
+      "down": "search::NextHistoryQuery"
+    }
   },
   {
     "context": "BufferSearchBar || ProjectSearchBar",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-enter": "editor::Newline",
-    },
+      "ctrl-enter": "editor::Newline"
+    }
   },
   {
     "context": "ProjectSearchBar",
@@ -468,24 +468,24 @@
       "cmd-shift-f": "search::FocusSearch",
       "cmd-shift-h": "search::ToggleReplace",
       "alt-cmd-g": "search::ToggleRegex",
-      "alt-cmd-x": "search::ToggleRegex",
-    },
+      "alt-cmd-x": "search::ToggleRegex"
+    }
   },
   {
     "context": "ProjectSearchBar > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "up": "search::PreviousHistoryQuery",
-      "down": "search::NextHistoryQuery",
-    },
+      "down": "search::NextHistoryQuery"
+    }
   },
   {
     "context": "ProjectSearchBar && in_replace > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "enter": "search::ReplaceNext",
-      "cmd-enter": "search::ReplaceAll",
-    },
+      "cmd-enter": "search::ReplaceAll"
+    }
   },
   {
     "context": "ProjectSearchView",
@@ -496,8 +496,8 @@
       "cmd-shift-enter": "project_search::ToggleAllSearchResults",
       "cmd-shift-h": "search::ToggleReplace",
       "alt-cmd-g": "search::ToggleRegex",
-      "alt-cmd-x": "search::ToggleRegex",
-    },
+      "alt-cmd-x": "search::ToggleRegex"
+    }
   },
   {
     "context": "Pane",
@@ -527,8 +527,8 @@
       "alt-cmd-w": "search::ToggleWholeWord",
       "alt-cmd-f": "project_search::ToggleFilters",
       "alt-cmd-x": "search::ToggleRegex",
-      "cmd-k shift-enter": "pane::TogglePinTab",
-    },
+      "cmd-k shift-enter": "pane::TogglePinTab"
+    }
   },
   // Bindings from VS Code
   {
@@ -598,24 +598,24 @@
       "cmd-.": "editor::ToggleCodeActions",
       "cmd-k r": "editor::RevealInFileManager",
       "cmd-k p": "editor::CopyPath",
-      "cmd-\\": "pane::SplitRight",
-    },
+      "cmd-\\": "pane::SplitRight"
+    }
   },
   {
     "context": "Editor && extension == md",
     "use_key_equivalents": true,
     "bindings": {
       "cmd-k v": "markdown::OpenPreviewToTheSide",
-      "cmd-shift-v": "markdown::OpenPreview",
-    },
+      "cmd-shift-v": "markdown::OpenPreview"
+    }
   },
   {
     "context": "Editor && extension == svg",
     "use_key_equivalents": true,
     "bindings": {
       "cmd-k v": "svg::OpenPreviewToTheSide",
-      "cmd-shift-v": "svg::OpenPreview",
-    },
+      "cmd-shift-v": "svg::OpenPreview"
+    }
   },
   {
     "context": "Editor && mode == full",
@@ -624,8 +624,8 @@
       "cmd-shift-o": "outline::Toggle",
       "ctrl-g": "go_to_line::Toggle",
       "cmd-shift-backspace": "editor::GoToPreviousChange",
-      "cmd-shift-alt-backspace": "editor::GoToNextChange",
-    },
+      "cmd-shift-alt-backspace": "editor::GoToNextChange"
+    }
   },
   {
     "context": "Pane",
@@ -643,8 +643,8 @@
       "ctrl-0": "pane::ActivateLastItem",
       "ctrl--": "pane::GoBack",
       "ctrl-_": "pane::GoForward",
-      "cmd-shift-f": "pane::DeploySearch",
-    },
+      "cmd-shift-f": "pane::DeploySearch"
+    }
   },
   {
     "context": "Workspace",
@@ -676,7 +676,7 @@
       "cmd-alt-b": "workspace::ToggleRightDock",
       "cmd-r": "workspace::ToggleRightDock",
       "cmd-j": "workspace::ToggleBottomDock",
-      "cmd-alt-j": "multi_workspace::ToggleWorkspaceSidebar",
+      "cmd-alt-j": "agent::ToggleThreadsSidebar",
       "cmd-alt-;": "multi_workspace::FocusWorkspaceSidebar",
       "alt-cmd-y": "workspace::ToggleAllDocks",
       // For 0px parameter, uses UI font size value.
@@ -703,7 +703,7 @@
       "cmd-shift-b": "outline_panel::ToggleFocus",
       "ctrl-shift-g": "git_panel::ToggleFocus",
       "cmd-shift-d": "debug_panel::ToggleFocus",
-      "cmd-?": "agent::ToggleFocus",
+      "cmd-?": "agent::ToggleAgentDrawer",
       "cmd-alt-s": "workspace::SaveAll",
       "cmd-k n": "encoding_selector::Toggle",
       "cmd-k m": "language_selector::Toggle",
@@ -719,8 +719,8 @@
       "cmd-k shift-down": "workspace::SwapPaneDown",
       "cmd-shift-x": "zed::Extensions",
       "f5": "debugger::Rerun",
-      "cmd-w": "workspace::CloseActiveDock",
-    },
+      "cmd-w": "workspace::CloseActiveDock"
+    }
   },
   {
     "context": "Workspace && !Terminal",
@@ -731,12 +731,12 @@
       // All task parameters are captured and unchanged between reruns by default.
       // Use the `"reevaluate_context"` parameter to control this.
       "cmd-alt-r": ["task::Rerun", { "reevaluate_context": false }],
-      "ctrl-alt-shift-r": ["task::Spawn", { "reveal_target": "center" }],
+      "ctrl-alt-shift-r": ["task::Spawn", { "reveal_target": "center" }]
       // also possible to spawn tasks by name:
       // "foo-bar": ["task::Spawn", { "task_name": "MyTask", "reveal_target": "dock" }]
       // or by tag:
       // "foo-bar": ["task::Spawn", { "task_tag": "MyTag" }],
-    },
+    }
   },
   {
     "context": "WorkspaceSidebar",
@@ -745,23 +745,23 @@
       "cmd-n": "multi_workspace::NewWorkspaceInWindow",
       "left": "agents_sidebar::CollapseSelectedEntry",
       "right": "agents_sidebar::ExpandSelectedEntry",
-      "enter": "menu::Confirm",
-    },
+      "enter": "menu::Confirm"
+    }
   },
   {
     "context": "Workspace && debugger_running",
     "use_key_equivalents": true,
     "bindings": {
       "f5": "zed::NoAction",
-      "f11": "debugger::StepInto",
-    },
+      "f11": "debugger::StepInto"
+    }
   },
   {
     "context": "Workspace && debugger_stopped",
     "use_key_equivalents": true,
     "bindings": {
-      "f5": "debugger::Continue",
-    },
+      "f5": "debugger::Continue"
+    }
   },
   // Bindings from Sublime Text
   {
@@ -782,8 +782,8 @@
       "ctrl-alt-shift-left": "editor::SelectToPreviousSubwordStart",
       "ctrl-alt-shift-b": "editor::SelectToPreviousSubwordStart",
       "ctrl-alt-shift-right": "editor::SelectToNextSubwordEnd",
-      "ctrl-alt-shift-f": "editor::SelectToNextSubwordEnd",
-    },
+      "ctrl-alt-shift-f": "editor::SelectToNextSubwordEnd"
+    }
   },
   // Bindings from Atom
   {
@@ -793,16 +793,16 @@
       "cmd-k up": "pane::SplitUp",
       "cmd-k down": "pane::SplitDown",
       "cmd-k left": "pane::SplitLeft",
-      "cmd-k right": "pane::SplitRight",
-    },
+      "cmd-k right": "pane::SplitRight"
+    }
   },
   // Bindings that should be unified with bindings for more general actions
   {
     "context": "Editor && renaming",
     "use_key_equivalents": true,
     "bindings": {
-      "enter": "editor::ConfirmRename",
-    },
+      "enter": "editor::ConfirmRename"
+    }
   },
   {
     "context": "Editor && showing_completions",
@@ -810,22 +810,22 @@
     "bindings": {
       "enter": "editor::ConfirmCompletion",
       "shift-enter": "editor::ConfirmCompletionReplace",
-      "tab": "editor::ComposeCompletion",
-    },
+      "tab": "editor::ComposeCompletion"
+    }
   },
   {
     "context": "Editor && in_snippet && has_next_tabstop && !showing_completions",
     "use_key_equivalents": true,
     "bindings": {
-      "tab": "editor::NextSnippetTabstop",
-    },
+      "tab": "editor::NextSnippetTabstop"
+    }
   },
   {
     "context": "Editor && in_snippet && has_previous_tabstop && !showing_completions",
     "use_key_equivalents": true,
     "bindings": {
-      "shift-tab": "editor::PreviousSnippetTabstop",
-    },
+      "shift-tab": "editor::PreviousSnippetTabstop"
+    }
   },
   {
     "context": "Editor && edit_prediction",
@@ -833,8 +833,8 @@
       "alt-tab": "editor::AcceptEditPrediction",
       "tab": "editor::AcceptEditPrediction",
       "ctrl-cmd-right": "editor::AcceptNextWordEditPrediction",
-      "ctrl-cmd-down": "editor::AcceptNextLineEditPrediction",
-    },
+      "ctrl-cmd-down": "editor::AcceptNextLineEditPrediction"
+    }
   },
   {
     "context": "Editor && edit_prediction_conflict",
@@ -842,15 +842,15 @@
     "bindings": {
       "alt-tab": "editor::AcceptEditPrediction",
       "ctrl-cmd-right": "editor::AcceptNextWordEditPrediction",
-      "ctrl-cmd-down": "editor::AcceptNextLineEditPrediction",
-    },
+      "ctrl-cmd-down": "editor::AcceptNextLineEditPrediction"
+    }
   },
   {
     "context": "Editor && showing_code_actions",
     "use_key_equivalents": true,
     "bindings": {
-      "enter": "editor::ConfirmCodeAction",
-    },
+      "enter": "editor::ConfirmCodeAction"
+    }
   },
   {
     "context": "Editor && (showing_code_actions || showing_completions)",
@@ -861,15 +861,15 @@
       "down": "editor::ContextMenuNext",
       "ctrl-n": "editor::ContextMenuNext",
       "pageup": "editor::ContextMenuFirst",
-      "pagedown": "editor::ContextMenuLast",
-    },
+      "pagedown": "editor::ContextMenuLast"
+    }
   },
   {
     "context": "Editor && showing_signature_help && !showing_completions",
     "bindings": {
       "up": "editor::SignatureHelpPrevious",
-      "down": "editor::SignatureHelpNext",
-    },
+      "down": "editor::SignatureHelpNext"
+    }
   },
   // Custom bindings
   {
@@ -879,8 +879,8 @@
       // TODO: Move this to a dock open action
       "cmd-shift-c": "collab_panel::ToggleFocus",
       // Only available in debug builds: opens an element inspector for development.
-      "cmd-alt-i": "dev::ToggleInspector",
-    },
+      "cmd-alt-i": "dev::ToggleInspector"
+    }
   },
   {
     "context": "!ContextEditor && !AcpThread > Editor && mode == full",
@@ -893,8 +893,8 @@
       "cmd-f8": "editor::GoToHunk",
       "cmd-shift-f8": "editor::GoToPreviousHunk",
       "ctrl-enter": "assistant::InlineAssist",
-      "ctrl-:": "editor::ToggleInlayHints",
-    },
+      "ctrl-:": "editor::ToggleInlayHints"
+    }
   },
   {
     "context": "InlineAssistant > Editor",
@@ -905,8 +905,8 @@
       "ctrl-[": "agent::CyclePreviousInlineAssist",
       "ctrl-]": "agent::CycleNextInlineAssist",
       "cmd-shift-enter": "inline_assistant::ThumbsUpResult",
-      "cmd-shift-backspace": "inline_assistant::ThumbsDownResult",
-    },
+      "cmd-shift-backspace": "inline_assistant::ThumbsDownResult"
+    }
   },
   {
     "context": "Prompt",
@@ -915,15 +915,15 @@
       "left": "menu::SelectPrevious",
       "right": "menu::SelectNext",
       "h": "menu::SelectPrevious",
-      "l": "menu::SelectNext",
-    },
+      "l": "menu::SelectNext"
+    }
   },
   {
     "context": "ProjectSearchBar && !in_replace",
     "use_key_equivalents": true,
     "bindings": {
-      "cmd-enter": "project_search::SearchInNew",
-    },
+      "cmd-enter": "project_search::SearchInNew"
+    }
   },
   {
     "context": "OutlinePanel && not_editing",
@@ -939,8 +939,8 @@
       "shift-down": "menu::SelectNext",
       "shift-up": "menu::SelectPrevious",
       "alt-enter": "editor::OpenExcerpts",
-      "cmd-alt-enter": "editor::OpenExcerptsSplit",
-    },
+      "cmd-alt-enter": "editor::OpenExcerptsSplit"
+    }
   },
   {
     "context": "ProjectPanel",
@@ -970,15 +970,15 @@
       "cmd-alt-shift-f": "project_panel::NewSearchInDirectory",
       "shift-down": "menu::SelectNext",
       "shift-up": "menu::SelectPrevious",
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "ProjectPanel && not_editing",
     "use_key_equivalents": true,
     "bindings": {
-      "space": "project_panel::Open",
-    },
+      "space": "project_panel::Open"
+    }
   },
   {
     "context": "VariableList",
@@ -991,8 +991,8 @@
       "cmd-alt-c": "variable_list::CopyVariableName",
       "delete": "variable_list::RemoveWatch",
       "backspace": "variable_list::RemoveWatch",
-      "alt-enter": "variable_list::AddWatch",
-    },
+      "alt-enter": "variable_list::AddWatch"
+    }
   },
   {
     "context": "GitPanel && ChangesList",
@@ -1017,15 +1017,15 @@
       "backspace": ["git::RestoreFile", { "skip_prompt": false }],
       "delete": ["git::RestoreFile", { "skip_prompt": false }],
       "cmd-backspace": ["git::RestoreFile", { "skip_prompt": true }],
-      "cmd-delete": ["git::RestoreFile", { "skip_prompt": true }],
-    },
+      "cmd-delete": ["git::RestoreFile", { "skip_prompt": true }]
+    }
   },
   {
     "context": "GitPanel && CommitEditor",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "git::Cancel",
-    },
+      "escape": "git::Cancel"
+    }
   },
   {
     "context": "GitDiff > Editor",
@@ -1035,8 +1035,8 @@
       "cmd-shift-enter": "git::Amend",
       "cmd-ctrl-y": "git::StageAll",
       "cmd-ctrl-shift-y": "git::UnstageAll",
-      "cmd-alt-z": "git::RestoreAndNext",
-    },
+      "cmd-alt-z": "git::RestoreAndNext"
+    }
   },
   {
     "context": "CommitEditor > Editor",
@@ -1049,8 +1049,8 @@
       "shift-tab": "git_panel::FocusChanges",
       "alt-up": "git_panel::FocusChanges",
       "shift-escape": "git::ExpandCommitEditor",
-      "alt-tab": "git::GenerateCommitMessage",
-    },
+      "alt-tab": "git::GenerateCommitMessage"
+    }
   },
   {
     "context": "GitPanel",
@@ -1067,8 +1067,8 @@
       "cmd-ctrl-y": "git::StageAll",
       "cmd-ctrl-shift-y": "git::UnstageAll",
       "cmd-enter": "git::Commit",
-      "cmd-shift-enter": "git::Amend",
-    },
+      "cmd-shift-enter": "git::Amend"
+    }
   },
   {
     "context": "GitCommit > Editor",
@@ -1078,16 +1078,16 @@
       "escape": "menu::Cancel",
       "cmd-enter": "git::Commit",
       "cmd-shift-enter": "git::Amend",
-      "alt-tab": "git::GenerateCommitMessage",
-    },
+      "alt-tab": "git::GenerateCommitMessage"
+    }
   },
   {
     "context": "DebugPanel",
     "bindings": {
       "cmd-t": "debugger::ToggleThreadPicker",
       "cmd-i": "debugger::ToggleSessionPicker",
-      "shift-alt-escape": "debugger::ToggleExpandItem",
-    },
+      "shift-alt-escape": "debugger::ToggleExpandItem"
+    }
   },
   {
     "context": "BreakpointList",
@@ -1095,16 +1095,16 @@
       "space": "debugger::ToggleEnableBreakpoint",
       "backspace": "debugger::UnsetBreakpoint",
       "left": "debugger::PreviousBreakpointProperty",
-      "right": "debugger::NextBreakpointProperty",
-    },
+      "right": "debugger::NextBreakpointProperty"
+    }
   },
   {
     "context": "CollabPanel && not_editing",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-backspace": "collab_panel::Remove",
-      "space": "menu::Confirm",
-    },
+      "space": "menu::Confirm"
+    }
   },
   {
     "context": "CollabPanel",
@@ -1112,22 +1112,22 @@
     "bindings": {
       "alt-up": "collab_panel::MoveChannelUp",
       "alt-down": "collab_panel::MoveChannelDown",
-      "alt-enter": "collab_panel::OpenSelectedChannelNotes",
-    },
+      "alt-enter": "collab_panel::OpenSelectedChannelNotes"
+    }
   },
   {
     "context": "(CollabPanel && editing) > Editor",
     "use_key_equivalents": true,
     "bindings": {
-      "space": "collab_panel::InsertSpace",
-    },
+      "space": "collab_panel::InsertSpace"
+    }
   },
   {
     "context": "ChannelModal",
     "use_key_equivalents": true,
     "bindings": {
-      "tab": "channel_modal::ToggleMode",
-    },
+      "tab": "channel_modal::ToggleMode"
+    }
   },
   {
     "context": "Picker > Editor",
@@ -1138,30 +1138,30 @@
       "down": "menu::SelectNext",
       "tab": "picker::ConfirmCompletion",
       "alt-enter": ["picker::ConfirmInput", { "secondary": false }],
-      "cmd-alt-enter": ["picker::ConfirmInput", { "secondary": true }],
-    },
+      "cmd-alt-enter": ["picker::ConfirmInput", { "secondary": true }]
+    }
   },
   {
     "context": "ChannelModal > Picker > Editor",
     "use_key_equivalents": true,
     "bindings": {
-      "tab": "channel_modal::ToggleMode",
-    },
+      "tab": "channel_modal::ToggleMode"
+    }
   },
   {
     "context": "ToolchainSelector",
     "use_key_equivalents": true,
     "bindings": {
-      "cmd-shift-a": "toolchain::AddToolchain",
-    },
+      "cmd-shift-a": "toolchain::AddToolchain"
+    }
   },
   {
     "context": "FileFinder || (FileFinder > Picker > Editor)",
     "use_key_equivalents": true,
     "bindings": {
       "cmd-shift-a": "file_finder::ToggleSplitMenu",
-      "cmd-shift-i": "file_finder::ToggleFilterMenu",
-    },
+      "cmd-shift-i": "file_finder::ToggleFilterMenu"
+    }
   },
   {
     "context": "FileFinder || (FileFinder > Picker > Editor) || (FileFinder > Picker > menu)",
@@ -1171,16 +1171,16 @@
       "cmd-j": "pane::SplitDown",
       "cmd-k": "pane::SplitUp",
       "cmd-h": "pane::SplitLeft",
-      "cmd-l": "pane::SplitRight",
-    },
+      "cmd-l": "pane::SplitRight"
+    }
   },
   {
     "context": "RecentProjects || (RecentProjects > Picker > Editor)",
     "use_key_equivalents": true,
     "bindings": {
       "cmd-k": "recent_projects::ToggleActionsMenu",
-      "cmd-shift-a": "workspace::AddFolderToProject",
-    },
+      "cmd-shift-a": "workspace::AddFolderToProject"
+    }
   },
   {
     "context": "TabSwitcher",
@@ -1189,16 +1189,16 @@
       "ctrl-shift-tab": "menu::SelectPrevious",
       "ctrl-up": "menu::SelectPrevious",
       "ctrl-down": "menu::SelectNext",
-      "ctrl-backspace": "tab_switcher::CloseSelectedItem",
-    },
+      "ctrl-backspace": "tab_switcher::CloseSelectedItem"
+    }
   },
   {
     "context": "StashList || (StashList > Picker > Editor)",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-shift-backspace": "stash_picker::DropStashItem",
-      "ctrl-shift-v": "stash_picker::ShowStashItem",
-    },
+      "ctrl-shift-v": "stash_picker::ShowStashItem"
+    }
   },
   {
     "context": "Terminal",
@@ -1254,8 +1254,8 @@
       "ctrl-alt-right": "pane::SplitRight",
       "cmd-d": "pane::SplitRight",
       "cmd-alt-r": "terminal::RerunTask",
-      "cmd->": "agent::AddSelectionToThread",
-    },
+      "cmd->": "agent::AddSelectionToThread"
+    }
   },
   {
     "context": "RatePredictionsModal",
@@ -1265,8 +1265,8 @@
       "cmd-shift-backspace": "zeta::ThumbsDownActivePrediction",
       "shift-down": "zeta::NextEdit",
       "shift-up": "zeta::PreviousEdit",
-      "right": "zeta::PreviewPrediction",
-    },
+      "right": "zeta::PreviewPrediction"
+    }
   },
   {
     "context": "RatePredictionsModal > Editor",
@@ -1274,15 +1274,15 @@
     "bindings": {
       "escape": "zeta::FocusPredictions",
       "cmd-shift-enter": "zeta::ThumbsUpActivePrediction",
-      "cmd-shift-backspace": "zeta::ThumbsDownActivePrediction",
-    },
+      "cmd-shift-backspace": "zeta::ThumbsDownActivePrediction"
+    }
   },
   {
     "context": "ZedPredictModal",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "ConfigureContextServerModal > Editor",
@@ -1290,45 +1290,45 @@
     "bindings": {
       "escape": "menu::Cancel",
       "enter": "editor::Newline",
-      "cmd-enter": "menu::Confirm",
-    },
+      "cmd-enter": "menu::Confirm"
+    }
   },
   {
     "context": "ContextServerToolsModal",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "OnboardingAiConfigurationModal",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "Diagnostics",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-r": "diagnostics::ToggleDiagnosticsRefresh",
-    },
+      "ctrl-r": "diagnostics::ToggleDiagnosticsRefresh"
+    }
   },
   {
     "context": "DebugConsole > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "enter": "menu::Confirm",
-      "alt-enter": "console::WatchExpression",
-    },
+      "alt-enter": "console::WatchExpression"
+    }
   },
   {
     "context": "RunModal",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-tab": "pane::ActivateNextItem",
-      "ctrl-shift-tab": "pane::ActivatePreviousItem",
-    },
+      "ctrl-shift-tab": "pane::ActivatePreviousItem"
+    }
   },
   {
     "context": "MarkdownPreview",

assets/keymaps/default-windows.json 🔗

@@ -43,23 +43,23 @@
       "ctrl-shift-i": "edit_prediction::ToggleMenu",
       "shift-alt-l": "lsp_tool::ToggleMenu",
       "ctrl-shift-alt-c": "editor::DisplayCursorNames",
-      "ctrl-shift-alt-s": "workspace::ToggleWorktreeSecurity",
-    },
+      "ctrl-shift-alt-s": "workspace::ToggleWorktreeSecurity"
+    }
   },
   {
     "context": "Picker || menu",
     "use_key_equivalents": true,
     "bindings": {
       "up": "menu::SelectPrevious",
-      "down": "menu::SelectNext",
-    },
+      "down": "menu::SelectNext"
+    }
   },
   {
     "context": "menu",
     "bindings": {
       "right": "menu::SelectChild",
-      "left": "menu::SelectParent",
-    },
+      "left": "menu::SelectParent"
+    }
   },
   {
     "context": "Editor",
@@ -128,8 +128,8 @@
       "shift-f10": "editor::OpenContextMenu",
       "ctrl-alt-e": "editor::ToggleEditPrediction",
       "f9": "editor::ToggleBreakpoint",
-      "shift-f9": "editor::EditLogBreakpoint",
-    },
+      "shift-f9": "editor::EditLogBreakpoint"
+    }
   },
   {
     "context": "Editor && mode == full",
@@ -148,23 +148,23 @@
       "shift-alt-e": "editor::SelectEnclosingSymbol",
       "ctrl-shift-backspace": "editor::GoToPreviousChange",
       "ctrl-shift-alt-backspace": "editor::GoToNextChange",
-      "alt-enter": "editor::OpenSelectionsInMultibuffer",
-    },
+      "alt-enter": "editor::OpenSelectionsInMultibuffer"
+    }
   },
   {
     "context": "Editor && mode == full && edit_prediction",
     "use_key_equivalents": true,
     "bindings": {
       "alt-]": "editor::NextEditPrediction",
-      "alt-[": "editor::PreviousEditPrediction",
-    },
+      "alt-[": "editor::PreviousEditPrediction"
+    }
   },
   {
     "context": "Editor && !edit_prediction",
     "use_key_equivalents": true,
     "bindings": {
-      "alt-\\": "editor::ShowEditPrediction",
-    },
+      "alt-\\": "editor::ShowEditPrediction"
+    }
   },
   {
     "context": "Editor && mode == auto_height",
@@ -172,23 +172,23 @@
     "bindings": {
       "ctrl-enter": "editor::Newline",
       "shift-enter": "editor::Newline",
-      "ctrl-shift-enter": "editor::NewlineBelow",
-    },
+      "ctrl-shift-enter": "editor::NewlineBelow"
+    }
   },
   {
     "context": "Markdown",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-c": "markdown::Copy",
-    },
+      "ctrl-c": "markdown::Copy"
+    }
   },
   {
     "context": "Editor && jupyter && !ContextEditor",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-shift-enter": "repl::Run",
-      "ctrl-alt-enter": "repl::RunInPlace",
-    },
+      "ctrl-alt-enter": "repl::RunInPlace"
+    }
   },
   {
     "context": "Editor && !agent_diff",
@@ -196,8 +196,8 @@
     "bindings": {
       "ctrl-k ctrl-r": "git::Restore",
       "alt-y": "git::StageAndNext",
-      "shift-alt-y": "git::UnstageAndNext",
-    },
+      "shift-alt-y": "git::UnstageAndNext"
+    }
   },
   {
     "context": "Editor && editor_agent_diff",
@@ -208,8 +208,8 @@
       "ctrl-alt-z": "agent::Reject",
       "shift-alt-y": "agent::KeepAll",
       "shift-alt-z": "agent::RejectAll",
-      "ctrl-shift-r": "agent::OpenAgentDiff",
-    },
+      "ctrl-shift-r": "agent::OpenAgentDiff"
+    }
   },
   {
     "context": "AgentDiff",
@@ -219,8 +219,8 @@
       "ctrl-alt-y": "agent::Keep",
       "ctrl-alt-z": "agent::Reject",
       "shift-alt-y": "agent::KeepAll",
-      "shift-alt-z": "agent::RejectAll",
-    },
+      "shift-alt-z": "agent::RejectAll"
+    }
   },
   {
     "context": "ContextEditor > Editor",
@@ -237,8 +237,8 @@
       "ctrl-g": "search::SelectNextMatch",
       "ctrl-shift-g": "search::SelectPreviousMatch",
       "ctrl-k l": "agent::OpenRulesLibrary",
-      "ctrl-shift-v": "agent::PasteRaw",
-    },
+      "ctrl-shift-v": "agent::PasteRaw"
+    }
   },
   {
     "context": "AgentPanel",
@@ -266,31 +266,31 @@
       "ctrl-shift-enter": "agent::ContinueThread",
       "shift-alt-a": "agent::AllowOnce",
       "ctrl-alt-a": "agent::OpenPermissionDropdown",
-      "shift-alt-z": "agent::RejectOnce",
-    },
+      "shift-alt-z": "agent::RejectOnce"
+    }
   },
   {
     "context": "AgentPanel > Markdown",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-c": "markdown::CopyAsMarkdown",
-    },
+      "ctrl-c": "markdown::CopyAsMarkdown"
+    }
   },
   {
     "context": "AgentPanel && text_thread",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-n": "agent::NewTextThread",
-      "ctrl-alt-t": "agent::NewThread",
-    },
+      "ctrl-alt-t": "agent::NewThread"
+    }
   },
   {
     "context": "AgentPanel && acp_thread",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-n": "agent::NewExternalAgentThread",
-      "ctrl-alt-t": "agent::NewThread",
-    },
+      "ctrl-alt-t": "agent::NewThread"
+    }
   },
   {
     "context": "AgentFeedbackMessageEditor > Editor",
@@ -298,20 +298,20 @@
     "bindings": {
       "escape": "menu::Cancel",
       "enter": "menu::Confirm",
-      "alt-enter": "editor::Newline",
-    },
+      "alt-enter": "editor::Newline"
+    }
   },
   {
     "context": "AcpThread > ModeSelector",
     "bindings": {
-      "ctrl-enter": "menu::Confirm",
-    },
+      "ctrl-enter": "menu::Confirm"
+    }
   },
   {
     "context": "AcpThread",
     "bindings": {
-      "ctrl--": "pane::GoBack",
-    },
+      "ctrl--": "pane::GoBack"
+    }
   },
   {
     "context": "AcpThread > Editor",
@@ -338,30 +338,30 @@
       "ctrl-alt-k": "agent::ToggleThinkingMode",
       "ctrl-alt-'": "agent::ToggleThinkingEffortMenu",
       "ctrl-'": "agent::CycleThinkingEffort",
-      "ctrl-alt-.": "agent::ToggleFastMode",
-    },
+      "ctrl-alt-.": "agent::ToggleFastMode"
+    }
   },
   {
     "context": "AcpThread > Editor && !use_modifier_to_send",
     "use_key_equivalents": true,
     "bindings": {
-      "enter": "agent::Chat",
-    },
+      "enter": "agent::Chat"
+    }
   },
   {
     "context": "AcpThread > Editor && use_modifier_to_send",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-enter": "agent::Chat",
-      "enter": "editor::Newline",
-    },
+      "enter": "editor::Newline"
+    }
   },
   {
     "context": "ThreadHistory",
     "use_key_equivalents": true,
     "bindings": {
-      "backspace": "agent::RemoveSelectedThread",
-    },
+      "backspace": "agent::RemoveSelectedThread"
+    }
   },
   {
     "context": "RulesLibrary",
@@ -369,8 +369,8 @@
     "bindings": {
       "ctrl-n": "rules_library::NewRule",
       "ctrl-shift-s": "rules_library::ToggleDefaultRule",
-      "ctrl-w": "workspace::CloseWindow",
-    },
+      "ctrl-w": "workspace::CloseWindow"
+    }
   },
   {
     "context": "BufferSearchBar",
@@ -384,24 +384,24 @@
       "alt-enter": "search::SelectAllMatches",
       "ctrl-f": "search::FocusSearch",
       "ctrl-h": "search::ToggleReplace",
-      "ctrl-l": "search::ToggleSelection",
-    },
+      "ctrl-l": "search::ToggleSelection"
+    }
   },
   {
     "context": "BufferSearchBar && in_replace > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "enter": "search::ReplaceNext",
-      "ctrl-enter": "search::ReplaceAll",
-    },
+      "ctrl-enter": "search::ReplaceAll"
+    }
   },
   {
     "context": "BufferSearchBar && !in_replace > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "up": "search::PreviousHistoryQuery",
-      "down": "search::NextHistoryQuery",
-    },
+      "down": "search::NextHistoryQuery"
+    }
   },
   {
     "context": "ProjectSearchBar",
@@ -410,24 +410,24 @@
       "escape": "project_search::ToggleFocus",
       "ctrl-shift-f": "search::FocusSearch",
       "ctrl-shift-h": "search::ToggleReplace",
-      "alt-r": "search::ToggleRegex", // vscode
-    },
+      "alt-r": "search::ToggleRegex" // vscode
+    }
   },
   {
     "context": "ProjectSearchBar > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "up": "search::PreviousHistoryQuery",
-      "down": "search::NextHistoryQuery",
-    },
+      "down": "search::NextHistoryQuery"
+    }
   },
   {
     "context": "ProjectSearchBar && in_replace > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "enter": "search::ReplaceNext",
-      "ctrl-alt-enter": "search::ReplaceAll",
-    },
+      "ctrl-alt-enter": "search::ReplaceAll"
+    }
   },
   {
     "context": "ProjectSearchView",
@@ -435,8 +435,8 @@
     "bindings": {
       "escape": "project_search::ToggleFocus",
       "ctrl-shift-h": "search::ToggleReplace",
-      "alt-r": "search::ToggleRegex", // vscode
-    },
+      "alt-r": "search::ToggleRegex" // vscode
+    }
   },
   {
     "context": "Pane",
@@ -483,8 +483,8 @@
       "ctrl-shift-enter": "project_search::ToggleAllSearchResults",
       "alt-r": "search::ToggleRegex",
       // "ctrl-shift-alt-x": "search::ToggleRegex",
-      "ctrl-k shift-enter": "pane::TogglePinTab",
-    },
+      "ctrl-k shift-enter": "pane::TogglePinTab"
+    }
   },
   // Bindings from VS Code
   {
@@ -544,32 +544,32 @@
       "ctrl-k p": "editor::CopyPath",
       "ctrl-\\": "pane::SplitRight",
       "alt-.": "editor::GoToHunk",
-      "alt-,": "editor::GoToPreviousHunk",
-    },
+      "alt-,": "editor::GoToPreviousHunk"
+    }
   },
   {
     "context": "Editor && extension == md",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-k v": "markdown::OpenPreviewToTheSide",
-      "ctrl-shift-v": "markdown::OpenPreview",
-    },
+      "ctrl-shift-v": "markdown::OpenPreview"
+    }
   },
   {
     "context": "Editor && extension == svg",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-k v": "svg::OpenPreviewToTheSide",
-      "ctrl-shift-v": "svg::OpenPreview",
-    },
+      "ctrl-shift-v": "svg::OpenPreview"
+    }
   },
   {
     "context": "Editor && mode == full",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-shift-o": "outline::Toggle",
-      "ctrl-g": "go_to_line::Toggle",
-    },
+      "ctrl-g": "go_to_line::Toggle"
+    }
   },
   {
     "context": "Workspace",
@@ -603,7 +603,7 @@
       "ctrl-alt-b": "workspace::ToggleRightDock",
       "ctrl-b": "workspace::ToggleLeftDock",
       "ctrl-j": "workspace::ToggleBottomDock",
-      "ctrl-alt-j": "multi_workspace::ToggleWorkspaceSidebar",
+      "ctrl-alt-j": "agent::ToggleThreadsSidebar",
       "ctrl-alt-;": "multi_workspace::FocusWorkspaceSidebar",
       "ctrl-shift-y": "workspace::ToggleAllDocks",
       "alt-r": "workspace::ResetActiveDockSize",
@@ -630,7 +630,7 @@
       "ctrl-shift-b": "outline_panel::ToggleFocus",
       "ctrl-shift-g": "git_panel::ToggleFocus",
       "ctrl-shift-d": "debug_panel::ToggleFocus",
-      "ctrl-shift-/": "agent::ToggleFocus",
+      "ctrl-shift-/": "agent::ToggleAgentDrawer",
       "ctrl-k s": "workspace::SaveAll",
       "ctrl-k n": "encoding_selector::Toggle",
       "ctrl-k m": "language_selector::Toggle",
@@ -657,22 +657,22 @@
       // "foo-bar": ["task::Spawn", { "task_tag": "MyTag" }],
       "f5": "debugger::Rerun",
       "ctrl-f4": "workspace::CloseActiveDock",
-      "ctrl-w": "workspace::CloseActiveDock",
-    },
+      "ctrl-w": "workspace::CloseActiveDock"
+    }
   },
   {
     "context": "Workspace && debugger_running",
     "use_key_equivalents": true,
     "bindings": {
-      "f5": "zed::NoAction",
-    },
+      "f5": "zed::NoAction"
+    }
   },
   {
     "context": "Workspace && debugger_stopped",
     "use_key_equivalents": true,
     "bindings": {
-      "f5": "debugger::Continue",
-    },
+      "f5": "debugger::Continue"
+    }
   },
   {
     "context": "WorkspaceSidebar",
@@ -681,8 +681,8 @@
       "ctrl-n": "multi_workspace::NewWorkspaceInWindow",
       "left": "agents_sidebar::CollapseSelectedEntry",
       "right": "agents_sidebar::ExpandSelectedEntry",
-      "enter": "menu::Confirm",
-    },
+      "enter": "menu::Confirm"
+    }
   },
   {
     "context": "ApplicationMenu",
@@ -690,8 +690,8 @@
     "bindings": {
       "f10": "menu::Cancel",
       "left": "app_menu::ActivateMenuLeft",
-      "right": "app_menu::ActivateMenuRight",
-    },
+      "right": "app_menu::ActivateMenuRight"
+    }
   },
   // Bindings from Sublime Text
   {
@@ -708,8 +708,8 @@
       "ctrl-alt-left": "editor::MoveToPreviousSubwordStart",
       "ctrl-alt-right": "editor::MoveToNextSubwordEnd",
       "ctrl-shift-alt-left": "editor::SelectToPreviousSubwordStart",
-      "ctrl-shift-alt-right": "editor::SelectToNextSubwordEnd",
-    },
+      "ctrl-shift-alt-right": "editor::SelectToNextSubwordEnd"
+    }
   },
   // Bindings from Atom
   {
@@ -719,16 +719,16 @@
       "ctrl-k up": "pane::SplitUp",
       "ctrl-k down": "pane::SplitDown",
       "ctrl-k left": "pane::SplitLeft",
-      "ctrl-k right": "pane::SplitRight",
-    },
+      "ctrl-k right": "pane::SplitRight"
+    }
   },
   // Bindings that should be unified with bindings for more general actions
   {
     "context": "Editor && renaming",
     "use_key_equivalents": true,
     "bindings": {
-      "enter": "editor::ConfirmRename",
-    },
+      "enter": "editor::ConfirmRename"
+    }
   },
   {
     "context": "Editor && showing_completions",
@@ -736,22 +736,22 @@
     "bindings": {
       "enter": "editor::ConfirmCompletion",
       "shift-enter": "editor::ConfirmCompletionReplace",
-      "tab": "editor::ComposeCompletion",
-    },
+      "tab": "editor::ComposeCompletion"
+    }
   },
   {
     "context": "Editor && in_snippet && has_next_tabstop && !showing_completions",
     "use_key_equivalents": true,
     "bindings": {
-      "tab": "editor::NextSnippetTabstop",
-    },
+      "tab": "editor::NextSnippetTabstop"
+    }
   },
   {
     "context": "Editor && in_snippet && has_previous_tabstop && !showing_completions",
     "use_key_equivalents": true,
     "bindings": {
-      "shift-tab": "editor::PreviousSnippetTabstop",
-    },
+      "shift-tab": "editor::PreviousSnippetTabstop"
+    }
   },
   // Bindings for accepting edit predictions
   //
@@ -765,8 +765,8 @@
       "alt-l": "editor::AcceptEditPrediction",
       "tab": "editor::AcceptEditPrediction",
       "alt-k": "editor::AcceptNextWordEditPrediction",
-      "alt-j": "editor::AcceptNextLineEditPrediction",
-    },
+      "alt-j": "editor::AcceptNextLineEditPrediction"
+    }
   },
   {
     "context": "Editor && edit_prediction_conflict",
@@ -775,15 +775,15 @@
       "alt-tab": "editor::AcceptEditPrediction",
       "alt-l": "editor::AcceptEditPrediction",
       "alt-k": "editor::AcceptNextWordEditPrediction",
-      "alt-j": "editor::AcceptNextLineEditPrediction",
-    },
+      "alt-j": "editor::AcceptNextLineEditPrediction"
+    }
   },
   {
     "context": "Editor && showing_code_actions",
     "use_key_equivalents": true,
     "bindings": {
-      "enter": "editor::ConfirmCodeAction",
-    },
+      "enter": "editor::ConfirmCodeAction"
+    }
   },
   {
     "context": "Editor && (showing_code_actions || showing_completions)",
@@ -794,16 +794,16 @@
       "ctrl-n": "editor::ContextMenuNext",
       "down": "editor::ContextMenuNext",
       "pageup": "editor::ContextMenuFirst",
-      "pagedown": "editor::ContextMenuLast",
-    },
+      "pagedown": "editor::ContextMenuLast"
+    }
   },
   {
     "context": "Editor && showing_signature_help && !showing_completions",
     "use_key_equivalents": true,
     "bindings": {
       "up": "editor::SignatureHelpPrevious",
-      "down": "editor::SignatureHelpNext",
-    },
+      "down": "editor::SignatureHelpNext"
+    }
   },
   // Custom bindings
   {
@@ -811,15 +811,15 @@
     "bindings": {
       "ctrl-shift-alt-f": "workspace::FollowNextCollaborator",
       // Only available in debug builds: opens an element inspector for development.
-      "shift-alt-i": "dev::ToggleInspector",
-    },
+      "shift-alt-i": "dev::ToggleInspector"
+    }
   },
   {
     "context": "!Terminal",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-shift-c": "collab_panel::ToggleFocus",
-    },
+      "ctrl-shift-c": "collab_panel::ToggleFocus"
+    }
   },
   {
     "context": "!ContextEditor && !AcpThread > Editor && mode == full",
@@ -832,8 +832,8 @@
       "ctrl-f8": "editor::GoToHunk",
       "ctrl-shift-f8": "editor::GoToPreviousHunk",
       "ctrl-enter": "assistant::InlineAssist",
-      "ctrl-shift-;": "editor::ToggleInlayHints",
-    },
+      "ctrl-shift-;": "editor::ToggleInlayHints"
+    }
   },
   {
     "context": "InlineAssistant",
@@ -842,8 +842,8 @@
       "ctrl-[": "agent::CyclePreviousInlineAssist",
       "ctrl-]": "agent::CycleNextInlineAssist",
       "ctrl-shift-enter": "inline_assistant::ThumbsUpResult",
-      "ctrl-shift-delete": "inline_assistant::ThumbsDownResult",
-    },
+      "ctrl-shift-delete": "inline_assistant::ThumbsDownResult"
+    }
   },
   {
     "context": "Prompt",
@@ -852,15 +852,15 @@
       "left": "menu::SelectPrevious",
       "right": "menu::SelectNext",
       "h": "menu::SelectPrevious",
-      "l": "menu::SelectNext",
-    },
+      "l": "menu::SelectNext"
+    }
   },
   {
     "context": "ProjectSearchBar && !in_replace",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-enter": "project_search::SearchInNew",
-    },
+      "ctrl-enter": "project_search::SearchInNew"
+    }
   },
   {
     "context": "OutlinePanel && not_editing",
@@ -875,8 +875,8 @@
       "shift-down": "menu::SelectNext",
       "shift-up": "menu::SelectPrevious",
       "alt-enter": "editor::OpenExcerpts",
-      "ctrl-alt-enter": "editor::OpenExcerptsSplit",
-    },
+      "ctrl-alt-enter": "editor::OpenExcerptsSplit"
+    }
   },
   {
     "context": "ProjectPanel",
@@ -907,15 +907,15 @@
       "ctrl-k ctrl-shift-f": "project_panel::NewSearchInDirectory",
       "shift-down": "menu::SelectNext",
       "shift-up": "menu::SelectPrevious",
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "ProjectPanel && not_editing",
     "use_key_equivalents": true,
     "bindings": {
-      "space": "project_panel::Open",
-    },
+      "space": "project_panel::Open"
+    }
   },
   {
     "context": "GitPanel && ChangesList",
@@ -938,15 +938,15 @@
       "backspace": ["git::RestoreFile", { "skip_prompt": false }],
       "shift-delete": ["git::RestoreFile", { "skip_prompt": false }],
       "ctrl-backspace": ["git::RestoreFile", { "skip_prompt": false }],
-      "ctrl-delete": ["git::RestoreFile", { "skip_prompt": false }],
-    },
+      "ctrl-delete": ["git::RestoreFile", { "skip_prompt": false }]
+    }
   },
   {
     "context": "GitPanel && CommitEditor",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "git::Cancel",
-    },
+      "escape": "git::Cancel"
+    }
   },
   {
     "context": "GitCommit > Editor",
@@ -956,8 +956,8 @@
       "enter": "editor::Newline",
       "ctrl-enter": "git::Commit",
       "ctrl-shift-enter": "git::Amend",
-      "alt-l": "git::GenerateCommitMessage",
-    },
+      "alt-l": "git::GenerateCommitMessage"
+    }
   },
   {
     "context": "GitPanel",
@@ -974,8 +974,8 @@
       "ctrl-space": "git::StageAll",
       "ctrl-shift-space": "git::UnstageAll",
       "ctrl-enter": "git::Commit",
-      "ctrl-shift-enter": "git::Amend",
-    },
+      "ctrl-shift-enter": "git::Amend"
+    }
   },
   {
     "context": "GitDiff > Editor",
@@ -985,15 +985,15 @@
       "ctrl-shift-enter": "git::Amend",
       "ctrl-space": "git::StageAll",
       "ctrl-shift-space": "git::UnstageAll",
-      "ctrl-k ctrl-r": "git::RestoreAndNext",
-    },
+      "ctrl-k ctrl-r": "git::RestoreAndNext"
+    }
   },
   {
     "context": "AskPass > Editor",
     "use_key_equivalents": true,
     "bindings": {
-      "enter": "menu::Confirm",
-    },
+      "enter": "menu::Confirm"
+    }
   },
   {
     "context": "CommitEditor > Editor",
@@ -1006,8 +1006,8 @@
       "ctrl-enter": "git::Commit",
       "ctrl-shift-enter": "git::Amend",
       "alt-up": "git_panel::FocusChanges",
-      "alt-l": "git::GenerateCommitMessage",
-    },
+      "alt-l": "git::GenerateCommitMessage"
+    }
   },
   {
     "context": "DebugPanel",
@@ -1015,8 +1015,8 @@
     "bindings": {
       "ctrl-t": "debugger::ToggleThreadPicker",
       "ctrl-i": "debugger::ToggleSessionPicker",
-      "shift-alt-escape": "debugger::ToggleExpandItem",
-    },
+      "shift-alt-escape": "debugger::ToggleExpandItem"
+    }
   },
   {
     "context": "VariableList",
@@ -1029,8 +1029,8 @@
       "ctrl-alt-c": "variable_list::CopyVariableName",
       "delete": "variable_list::RemoveWatch",
       "backspace": "variable_list::RemoveWatch",
-      "alt-enter": "variable_list::AddWatch",
-    },
+      "alt-enter": "variable_list::AddWatch"
+    }
   },
   {
     "context": "BreakpointList",
@@ -1039,16 +1039,16 @@
       "space": "debugger::ToggleEnableBreakpoint",
       "backspace": "debugger::UnsetBreakpoint",
       "left": "debugger::PreviousBreakpointProperty",
-      "right": "debugger::NextBreakpointProperty",
-    },
+      "right": "debugger::NextBreakpointProperty"
+    }
   },
   {
     "context": "CollabPanel && not_editing",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-backspace": "collab_panel::Remove",
-      "space": "menu::Confirm",
-    },
+      "space": "menu::Confirm"
+    }
   },
   {
     "context": "CollabPanel",
@@ -1056,22 +1056,22 @@
     "bindings": {
       "alt-up": "collab_panel::MoveChannelUp",
       "alt-down": "collab_panel::MoveChannelDown",
-      "alt-enter": "collab_panel::OpenSelectedChannelNotes",
-    },
+      "alt-enter": "collab_panel::OpenSelectedChannelNotes"
+    }
   },
   {
     "context": "(CollabPanel && editing) > Editor",
     "use_key_equivalents": true,
     "bindings": {
-      "space": "collab_panel::InsertSpace",
-    },
+      "space": "collab_panel::InsertSpace"
+    }
   },
   {
     "context": "ChannelModal",
     "use_key_equivalents": true,
     "bindings": {
-      "tab": "channel_modal::ToggleMode",
-    },
+      "tab": "channel_modal::ToggleMode"
+    }
   },
   {
     "context": "Picker > Editor",
@@ -1081,22 +1081,22 @@
       "up": "menu::SelectPrevious",
       "down": "menu::SelectNext",
       "tab": "picker::ConfirmCompletion",
-      "alt-enter": ["picker::ConfirmInput", { "secondary": false }],
-    },
+      "alt-enter": ["picker::ConfirmInput", { "secondary": false }]
+    }
   },
   {
     "context": "ChannelModal > Picker > Editor",
     "use_key_equivalents": true,
     "bindings": {
-      "tab": "channel_modal::ToggleMode",
-    },
+      "tab": "channel_modal::ToggleMode"
+    }
   },
   {
     "context": "ToolchainSelector",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-shift-a": "toolchain::AddToolchain",
-    },
+      "ctrl-shift-a": "toolchain::AddToolchain"
+    }
   },
   {
     "context": "FileFinder || (FileFinder > Picker > Editor)",
@@ -1104,8 +1104,8 @@
     "bindings": {
       "ctrl-p": "file_finder::Toggle",
       "ctrl-shift-a": "file_finder::ToggleSplitMenu",
-      "ctrl-shift-i": "file_finder::ToggleFilterMenu",
-    },
+      "ctrl-shift-i": "file_finder::ToggleFilterMenu"
+    }
   },
   {
     "context": "FileFinder || (FileFinder > Picker > Editor) || (FileFinder > Picker > menu)",
@@ -1115,16 +1115,16 @@
       "ctrl-j": "pane::SplitDown",
       "ctrl-k": "pane::SplitUp",
       "ctrl-h": "pane::SplitLeft",
-      "ctrl-l": "pane::SplitRight",
-    },
+      "ctrl-l": "pane::SplitRight"
+    }
   },
   {
     "context": "RecentProjects || (RecentProjects > Picker > Editor)",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-k": "recent_projects::ToggleActionsMenu",
-      "ctrl-shift-a": "workspace::AddFolderToProject",
-    },
+      "ctrl-shift-a": "workspace::AddFolderToProject"
+    }
   },
   {
     "context": "TabSwitcher",
@@ -1133,16 +1133,16 @@
       "ctrl-shift-tab": "menu::SelectPrevious",
       "ctrl-up": "menu::SelectPrevious",
       "ctrl-down": "menu::SelectNext",
-      "ctrl-backspace": "tab_switcher::CloseSelectedItem",
-    },
+      "ctrl-backspace": "tab_switcher::CloseSelectedItem"
+    }
   },
   {
     "context": "StashList || (StashList > Picker > Editor)",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-shift-backspace": "stash_picker::DropStashItem",
-      "ctrl-shift-v": "stash_picker::ShowStashItem",
-    },
+      "ctrl-shift-v": "stash_picker::ShowStashItem"
+    }
   },
   {
     "context": "Terminal",
@@ -1190,21 +1190,21 @@
       "ctrl-alt-r": "terminal::RerunTask",
       "alt-t": "terminal::RerunTask",
       "ctrl-shift-5": "pane::SplitRight",
-      "ctrl-shift-.": "agent::AddSelectionToThread",
-    },
+      "ctrl-shift-.": "agent::AddSelectionToThread"
+    }
   },
   {
     "context": "Terminal && selection",
     "bindings": {
-      "ctrl-c": "terminal::Copy",
-    },
+      "ctrl-c": "terminal::Copy"
+    }
   },
   {
     "context": "ZedPredictModal",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "ConfigureContextServerModal > Editor",
@@ -1212,45 +1212,45 @@
     "bindings": {
       "escape": "menu::Cancel",
       "enter": "editor::Newline",
-      "ctrl-enter": "menu::Confirm",
-    },
+      "ctrl-enter": "menu::Confirm"
+    }
   },
   {
     "context": "ContextServerToolsModal",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "OnboardingAiConfigurationModal",
     "use_key_equivalents": true,
     "bindings": {
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "Diagnostics",
     "use_key_equivalents": true,
     "bindings": {
-      "ctrl-r": "diagnostics::ToggleDiagnosticsRefresh",
-    },
+      "ctrl-r": "diagnostics::ToggleDiagnosticsRefresh"
+    }
   },
   {
     "context": "DebugConsole > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "enter": "menu::Confirm",
-      "alt-enter": "console::WatchExpression",
-    },
+      "alt-enter": "console::WatchExpression"
+    }
   },
   {
     "context": "RunModal",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-tab": "pane::ActivateNextItem",
-      "ctrl-shift-tab": "pane::ActivatePreviousItem",
-    },
+      "ctrl-shift-tab": "pane::ActivatePreviousItem"
+    }
   },
   {
     "context": "MarkdownPreview",
@@ -1261,8 +1261,8 @@
       "up": "markdown::ScrollUp",
       "down": "markdown::ScrollDown",
       "alt-up": "markdown::ScrollUpByItem",
-      "alt-down": "markdown::ScrollDownByItem",
-    },
+      "alt-down": "markdown::ScrollDownByItem"
+    }
   },
   {
     "context": "KeymapEditor",
@@ -1277,8 +1277,8 @@
       "ctrl-c": "keymap_editor::CopyAction",
       "ctrl-shift-c": "keymap_editor::CopyContext",
       "ctrl-t": "keymap_editor::ShowMatchingKeybinds",
-      "ctrl-e": "zed::OpenKeymapFile",
-    },
+      "ctrl-e": "zed::OpenKeymapFile"
+    }
   },
   {
     "context": "KeystrokeInput",
@@ -1286,24 +1286,24 @@
     "bindings": {
       "enter": "keystroke_input::StartRecording",
       "escape escape escape": "keystroke_input::StopRecording",
-      "delete": "keystroke_input::ClearKeystrokes",
-    },
+      "delete": "keystroke_input::ClearKeystrokes"
+    }
   },
   {
     "context": "KeybindEditorModal",
     "use_key_equivalents": true,
     "bindings": {
       "ctrl-enter": "menu::Confirm",
-      "escape": "menu::Cancel",
-    },
+      "escape": "menu::Cancel"
+    }
   },
   {
     "context": "KeybindEditorModal > Editor",
     "use_key_equivalents": true,
     "bindings": {
       "up": "menu::SelectPrevious",
-      "down": "menu::SelectNext",
-    },
+      "down": "menu::SelectNext"
+    }
   },
   {
     "context": "Onboarding",

crates/agent_ui/src/agent_panel.rs 🔗

@@ -66,9 +66,8 @@ use fs::Fs;
 use git::repository::validate_worktree_directory;
 use gpui::{
     Action, Animation, AnimationExt, AnyElement, AnyView, App, AsyncWindowContext, ClipboardItem,
-    Corner, DismissEvent, DragMoveEvent, Entity, EventEmitter, ExternalPaths, FocusHandle,
-    Focusable, KeyContext, MouseButton, Pixels, Subscription, Task, UpdateGlobal, WeakEntity,
-    deferred, prelude::*, pulsating_between,
+    Corner, DismissEvent, Entity, EventEmitter, ExternalPaths, FocusHandle, Focusable, KeyContext,
+    Pixels, Subscription, Task, UpdateGlobal, WeakEntity, prelude::*, pulsating_between,
 };
 use language::LanguageRegistry;
 use language_model::{ConfigurationError, LanguageModelRegistry};
@@ -80,77 +79,26 @@ use search::{BufferSearchBar, buffer_search};
 use settings::{Settings, update_settings_file};
 use theme::ThemeSettings;
 use ui::{
-    Button, ButtonLike, Callout, ContextMenu, ContextMenuEntry, DocumentationSide, Indicator,
-    KeyBinding, PopoverMenu, PopoverMenuHandle, SpinnerLabel, Tab, TintColor, Tooltip, prelude::*,
+    Button, ButtonLike, Callout, ContextMenu, ContextMenuEntry, DocumentationSide, KeyBinding,
+    PopoverMenu, PopoverMenuHandle, SpinnerLabel, Tab, TintColor, Tooltip, prelude::*,
     utils::WithRemSize,
 };
 use util::{ResultExt as _, debug_panic};
 use workspace::{
-    CollaboratorId, DraggedSelection, DraggedSidebar, DraggedTab, FocusWorkspaceSidebar,
-    MultiWorkspace, OpenResult, SIDEBAR_RESIZE_HANDLE_SIZE, ToggleWorkspaceSidebar, ToggleZoom,
-    ToolbarItemView, Workspace, WorkspaceId,
+    CollaboratorId, DraggedSelection, DraggedTab, OpenResult, ToggleZoom, ToolbarItemView,
+    Workspace, WorkspaceId,
     dock::{DockPosition, Panel, PanelEvent},
-    multi_workspace_enabled,
 };
 use zed_actions::{
     DecreaseBufferFontSize, IncreaseBufferFontSize, ResetBufferFontSize,
     agent::{OpenAcpOnboardingModal, OpenSettings, ResetAgentZoom, ResetOnboarding},
-    assistant::{OpenRulesLibrary, Toggle, ToggleFocus},
+    assistant::{OpenRulesLibrary, Toggle, ToggleAgentDrawer, ToggleFocus},
 };
 
 const AGENT_PANEL_KEY: &str = "agent_panel";
 const RECENTLY_UPDATED_MENU_LIMIT: usize = 6;
 const DEFAULT_THREAD_TITLE: &str = "New Thread";
 
-#[derive(Default)]
-struct SidebarsByWindow(
-    collections::HashMap<gpui::WindowId, gpui::WeakEntity<crate::sidebar::Sidebar>>,
-);
-
-impl gpui::Global for SidebarsByWindow {}
-
-pub(crate) fn sidebar_is_open(window: &Window, cx: &App) -> bool {
-    if !multi_workspace_enabled(cx) {
-        return false;
-    }
-    let window_id = window.window_handle().window_id();
-    cx.try_global::<SidebarsByWindow>()
-        .and_then(|sidebars| sidebars.0.get(&window_id)?.upgrade())
-        .is_some_and(|sidebar| sidebar.read(cx).is_open())
-}
-
-fn find_or_create_sidebar_for_window(
-    window: &mut Window,
-    cx: &mut App,
-) -> Option<Entity<crate::sidebar::Sidebar>> {
-    let window_id = window.window_handle().window_id();
-    let multi_workspace = window.root::<MultiWorkspace>().flatten()?;
-
-    if !cx.has_global::<SidebarsByWindow>() {
-        cx.set_global(SidebarsByWindow::default());
-    }
-
-    cx.global_mut::<SidebarsByWindow>()
-        .0
-        .retain(|_, weak| weak.upgrade().is_some());
-
-    let existing = cx
-        .global::<SidebarsByWindow>()
-        .0
-        .get(&window_id)
-        .and_then(|weak| weak.upgrade());
-
-    if let Some(sidebar) = existing {
-        return Some(sidebar);
-    }
-
-    let sidebar = cx.new(|cx| crate::sidebar::Sidebar::new(multi_workspace, window, cx));
-    cx.global_mut::<SidebarsByWindow>()
-        .0
-        .insert(window_id, sidebar.downgrade());
-    Some(sidebar)
-}
-
 fn read_serialized_panel(workspace_id: workspace::WorkspaceId) -> Option<SerializedAgentPanel> {
     let scope = KEY_VALUE_STORE.scoped(AGENT_PANEL_KEY);
     let key = i64::from(workspace_id).to_string();
@@ -472,35 +420,26 @@ pub fn init(cx: &mut App) {
                         });
                     }
                 })
-                .register_action(|workspace, _: &ToggleWorkspaceSidebar, window, cx| {
-                    if !multi_workspace_enabled(cx) {
+                .register_action(|workspace, _: &ToggleAgentDrawer, _window, cx| {
+                    let Some(panel) = workspace.panel::<AgentPanel>(cx) else {
                         return;
-                    }
-                    if let Some(panel) = workspace.panel::<AgentPanel>(cx) {
-                        if let Some(sidebar) = panel.read(cx).sidebar.clone() {
-                            let was_open = sidebar.read(cx).is_open();
-                            sidebar.update(cx, |sidebar, cx| {
-                                sidebar.toggle(window, cx);
-                            });
-                            // When closing the sidebar, restore focus to the active pane
-                            // to avoid "zombie focus" on the now-hidden sidebar elements
-                            if was_open {
-                                let active_pane = workspace.active_pane().clone();
-                                let pane_focus = active_pane.read(cx).focus_handle(cx);
-                                window.focus(&pane_focus, cx);
+                    };
+                    let panel_view: AnyView = panel.into();
+                    let dock_position = agent_panel_dock_position(cx);
+                    match dock_position {
+                        DockPosition::Right => {
+                            if workspace.right_drawer_view().is_none() {
+                                workspace.set_right_drawer(panel_view, cx);
+                            } else {
+                                workspace.toggle_right_drawer(cx);
                             }
                         }
-                    }
-                })
-                .register_action(|workspace, _: &FocusWorkspaceSidebar, window, cx| {
-                    if !multi_workspace_enabled(cx) {
-                        return;
-                    }
-                    if let Some(panel) = workspace.panel::<AgentPanel>(cx) {
-                        if let Some(sidebar) = panel.read(cx).sidebar.clone() {
-                            sidebar.update(cx, |sidebar, cx| {
-                                sidebar.focus_or_unfocus(workspace, window, cx);
-                            });
+                        DockPosition::Left | DockPosition::Bottom => {
+                            if workspace.left_drawer_view().is_none() {
+                                workspace.set_left_drawer(panel_view, cx);
+                            } else {
+                                workspace.toggle_left_drawer(cx);
+                            }
                         }
                     }
                 });
@@ -898,7 +837,6 @@ pub struct AgentPanel {
     last_configuration_error_telemetry: Option<String>,
     on_boarding_upsell_dismissed: AtomicBool,
     _active_view_observation: Option<Subscription>,
-    pub(crate) sidebar: Option<Entity<crate::sidebar::Sidebar>>,
 }
 
 impl AgentPanel {
@@ -1224,17 +1162,11 @@ impl AgentPanel {
             last_configuration_error_telemetry: None,
             on_boarding_upsell_dismissed: AtomicBool::new(OnboardingUpsell::dismissed()),
             _active_view_observation: None,
-            sidebar: None,
         };
 
         // Initial sync of agent servers from extensions
         panel.sync_agent_servers_from_extensions(cx);
 
-        cx.defer_in(window, move |this, window, cx| {
-            this.sidebar = find_or_create_sidebar_for_window(window, cx);
-            cx.notify();
-        });
-
         panel
     }
 
@@ -3236,7 +3168,7 @@ impl Panel for AgentPanel {
     }
 
     fn toggle_action(&self) -> Box<dyn Action> {
-        Box::new(ToggleFocus)
+        Box::new(ToggleAgentDrawer)
     }
 
     fn activation_priority(&self) -> u32 {
@@ -3744,127 +3676,6 @@ impl AgentPanel {
                 y: px(1.0),
             })
     }
-
-    fn sidebar_info(&self, cx: &App) -> Option<(AnyView, Pixels, bool)> {
-        if !multi_workspace_enabled(cx) {
-            return None;
-        }
-        let sidebar = self.sidebar.as_ref()?;
-        let is_open = sidebar.read(cx).is_open();
-        let width = sidebar.read(cx).width(cx);
-        let view: AnyView = sidebar.clone().into();
-        Some((view, width, is_open))
-    }
-
-    fn render_sidebar_toggle(&self, docked_right: bool, cx: &Context<Self>) -> Option<AnyElement> {
-        if !multi_workspace_enabled(cx) {
-            return None;
-        }
-        let sidebar = self.sidebar.as_ref()?;
-        let sidebar_read = sidebar.read(cx);
-        if sidebar_read.is_open() {
-            return None;
-        }
-        let has_notifications = sidebar_read.has_notifications(cx);
-
-        let icon = if docked_right {
-            IconName::ThreadsSidebarRightClosed
-        } else {
-            IconName::ThreadsSidebarLeftClosed
-        };
-
-        Some(
-            h_flex()
-                .h_full()
-                .px_1()
-                .map(|this| {
-                    if docked_right {
-                        this.border_l_1()
-                    } else {
-                        this.border_r_1()
-                    }
-                })
-                .border_color(cx.theme().colors().border_variant)
-                .child(
-                    IconButton::new("toggle-workspace-sidebar", icon)
-                        .icon_size(IconSize::Small)
-                        .when(has_notifications, |button| {
-                            button
-                                .indicator(Indicator::dot().color(Color::Accent))
-                                .indicator_border_color(Some(
-                                    cx.theme().colors().tab_bar_background,
-                                ))
-                        })
-                        .tooltip(move |_, cx| {
-                            Tooltip::for_action("Open Threads Sidebar", &ToggleWorkspaceSidebar, cx)
-                        })
-                        .on_click(|_, window, cx| {
-                            window.dispatch_action(ToggleWorkspaceSidebar.boxed_clone(), cx);
-                        }),
-                )
-                .into_any_element(),
-        )
-    }
-
-    fn render_sidebar(&self, cx: &Context<Self>) -> Option<AnyElement> {
-        let (sidebar_view, sidebar_width, is_open) = self.sidebar_info(cx)?;
-        if !is_open {
-            return None;
-        }
-
-        let docked_right = agent_panel_dock_position(cx) == DockPosition::Right;
-        let sidebar = self.sidebar.as_ref()?.downgrade();
-
-        let resize_handle = deferred(
-            div()
-                .id("sidebar-resize-handle")
-                .absolute()
-                .when(docked_right, |this| {
-                    this.left(-SIDEBAR_RESIZE_HANDLE_SIZE / 2.)
-                })
-                .when(!docked_right, |this| {
-                    this.right(-SIDEBAR_RESIZE_HANDLE_SIZE / 2.)
-                })
-                .top(px(0.))
-                .h_full()
-                .w(SIDEBAR_RESIZE_HANDLE_SIZE)
-                .cursor_col_resize()
-                .on_drag(DraggedSidebar, |dragged, _, _, cx| {
-                    cx.stop_propagation();
-                    cx.new(|_| dragged.clone())
-                })
-                .on_mouse_down(MouseButton::Left, |_, _, cx| {
-                    cx.stop_propagation();
-                })
-                .on_mouse_up(MouseButton::Left, move |event, _, cx| {
-                    if event.click_count == 2 {
-                        sidebar
-                            .update(cx, |sidebar, cx| {
-                                sidebar.set_width(None, cx);
-                            })
-                            .ok();
-                        cx.stop_propagation();
-                    }
-                })
-                .occlude(),
-        );
-
-        Some(
-            div()
-                .id("sidebar-container")
-                .relative()
-                .h_full()
-                .w(sidebar_width)
-                .flex_shrink_0()
-                .when(docked_right, |this| this.border_l_1())
-                .when(!docked_right, |this| this.border_r_1())
-                .border_color(cx.theme().colors().border)
-                .child(sidebar_view)
-                .child(resize_handle)
-                .into_any_element(),
-        )
-    }
-
     fn render_toolbar(&self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
         let agent_server_store = self.project.read(cx).agent_server_store().clone();
         let focus_handle = self.focus_handle(cx);
@@ -4261,12 +4072,6 @@ impl AgentPanel {
         let use_v2_empty_toolbar =
             has_v2_flag && is_empty_state && !is_in_history_or_config && !is_text_thread;
 
-        let is_sidebar_open = self
-            .sidebar
-            .as_ref()
-            .map(|s| s.read(cx).is_open())
-            .unwrap_or(false);
-
         let base_container = h_flex()
             .id("agent-panel-toolbar")
             .h(Tab::container_height(cx))
@@ -4341,10 +4146,7 @@ impl AgentPanel {
                     h_flex()
                         .size_full()
                         .gap_1()
-                        .when(is_sidebar_open || docked_right, |this| this.pl_1())
-                        .when(!docked_right, |this| {
-                            this.children(self.render_sidebar_toggle(false, cx))
-                        })
+                        .when(docked_right, |this| this.pl_1())
                         .child(agent_selector_menu)
                         .child(self.render_start_thread_in_selector(cx)),
                 )
@@ -4362,10 +4164,7 @@ impl AgentPanel {
                                 cx,
                             ))
                         })
-                        .child(self.render_panel_options_menu(window, cx))
-                        .when(docked_right, |this| {
-                            this.children(self.render_sidebar_toggle(true, cx))
-                        }),
+                        .child(self.render_panel_options_menu(window, cx)),
                 )
                 .into_any_element()
         } else {
@@ -4393,15 +4192,12 @@ impl AgentPanel {
                     h_flex()
                         .size_full()
                         .map(|this| {
-                            if is_sidebar_open || docked_right {
+                            if docked_right {
                                 this.pl_1().gap_1()
                             } else {
                                 this.pl_0().gap_0p5()
                             }
                         })
-                        .when(!docked_right, |this| {
-                            this.children(self.render_sidebar_toggle(false, cx))
-                        })
                         .child(match &self.active_view {
                             ActiveView::History { .. } | ActiveView::Configuration => {
                                 self.render_toolbar_back_button(cx).into_any_element()
@@ -4425,10 +4221,7 @@ impl AgentPanel {
                                 cx,
                             ))
                         })
-                        .child(self.render_panel_options_menu(window, cx))
-                        .when(docked_right, |this| {
-                            this.children(self.render_sidebar_toggle(true, cx))
-                        }),
+                        .child(self.render_panel_options_menu(window, cx)),
                 )
                 .into_any_element()
         }
@@ -4973,44 +4766,14 @@ impl Render for AgentPanel {
             })
             .children(self.render_trial_end_upsell(window, cx));
 
-        let sidebar = self.render_sidebar(cx);
-        let has_sidebar = sidebar.is_some();
-        let docked_right = agent_panel_dock_position(cx) == DockPosition::Right;
-
-        let panel = h_flex()
-            .size_full()
-            .when(has_sidebar, |this| {
-                this.on_drag_move(cx.listener(
-                    move |this, e: &DragMoveEvent<DraggedSidebar>, _window, cx| {
-                        if let Some(sidebar) = &this.sidebar {
-                            let width = if docked_right {
-                                e.bounds.right() - e.event.position.x
-                            } else {
-                                e.event.position.x
-                            };
-                            sidebar.update(cx, |sidebar, cx| {
-                                sidebar.set_width(Some(width), cx);
-                            });
-                        }
-                    },
-                ))
-            })
-            .map(|this| {
-                if docked_right {
-                    this.child(content).children(sidebar)
-                } else {
-                    this.children(sidebar).child(content)
-                }
-            });
-
         match self.active_view.which_font_size_used() {
             WhichFontSize::AgentFont => {
                 WithRemSize::new(ThemeSettings::get_global(cx).agent_ui_font_size(cx))
                     .size_full()
-                    .child(panel)
+                    .child(content)
                     .into_any()
             }
-            _ => panel.into_any(),
+            _ => content.into_any(),
         }
     }
 }

crates/agent_ui/src/connection_view.rs 🔗

@@ -2347,8 +2347,7 @@ impl ConnectionView {
         }
 
         if let Some(multi_workspace) = window.root::<MultiWorkspace>().flatten() {
-            crate::agent_panel::sidebar_is_open(window, cx)
-                || self.agent_panel_visible(&multi_workspace, cx)
+            self.agent_panel_visible(&multi_workspace, cx)
         } else {
             self.workspace
                 .upgrade()

crates/agent_ui/src/sidebar.rs 🔗

@@ -10,8 +10,9 @@ use db::kvp::KEY_VALUE_STORE;
 use editor::Editor;
 use feature_flags::{AgentV2FeatureFlag, FeatureFlagViewExt as _};
 use gpui::{
-    Action as _, AnyElement, App, Context, Entity, FocusHandle, Focusable, ListState, Pixels,
-    Render, SharedString, WeakEntity, Window, actions, list, prelude::*, px,
+    Action, AnyElement, App, AsyncWindowContext, Context, Entity, EventEmitter, FocusHandle,
+    Focusable, ListState, Pixels, Render, SharedString, Task, WeakEntity, Window, actions, list,
+    prelude::*, px,
 };
 use menu::{Cancel, Confirm, SelectFirst, SelectLast, SelectNext, SelectPrevious};
 use project::Event as ProjectEvent;
@@ -28,8 +29,11 @@ use ui::{
 use util::ResultExt as _;
 use util::path_list::PathList;
 use workspace::{
-    MultiWorkspace, MultiWorkspaceEvent, ToggleWorkspaceSidebar, Workspace, multi_workspace_enabled,
+    MultiWorkspace, MultiWorkspaceEvent, Workspace,
+    dock::{DockPosition, Panel, PanelEvent},
+    multi_workspace_enabled,
 };
+use zed_actions::assistant::ToggleThreadsSidebar;
 use zed_actions::editor::{MoveDown, MoveUp};
 
 actions!(
@@ -261,6 +265,23 @@ pub struct Sidebar {
 }
 
 impl Sidebar {
+    pub fn load(
+        _workspace: WeakEntity<Workspace>,
+        mut cx: AsyncWindowContext,
+    ) -> Task<anyhow::Result<Entity<Self>>> {
+        let result = cx
+            .update(|window, cx| {
+                let multi_workspace = window
+                    .root::<MultiWorkspace>()
+                    .flatten()
+                    .ok_or_else(|| anyhow::anyhow!("no MultiWorkspace root found"))?;
+                Ok(cx.new(|cx| Self::new(multi_workspace, window, cx)))
+            })
+            .map_err(|e| anyhow::anyhow!("failed to access window: {e}"))
+            .and_then(|r| r);
+        Task::ready(result)
+    }
+
     pub fn new(
         multi_workspace: Entity<MultiWorkspace>,
         window: &mut Window,
@@ -1716,25 +1737,19 @@ impl Sidebar {
             .into_any_element()
     }
 
-    fn render_thread_list_header(
-        &self,
-        docked_right: bool,
-        cx: &mut Context<Self>,
-    ) -> impl IntoElement {
+    fn render_thread_list_header(&self, cx: &mut Context<Self>) -> impl IntoElement {
         let has_query = self.has_filter_query(cx);
 
         h_flex()
             .h(Tab::container_height(cx))
             .flex_none()
             .gap_1p5()
+            .px_1p5()
             .border_b_1()
             .border_color(cx.theme().colors().border)
-            .when(!docked_right, |this| {
-                this.child(self.render_sidebar_toggle_button(false, cx))
-            })
             .child(self.render_filter_input())
             .when(has_query, |this| {
-                this.when(!docked_right, |this| this.pr_1p5()).child(
+                this.child(
                     IconButton::new("clear_filter", IconName::Close)
                         .shape(IconButtonShape::Square)
                         .tooltip(Tooltip::text("Clear Search"))
@@ -1744,11 +1759,6 @@ impl Sidebar {
                         })),
                 )
             })
-            .when(docked_right, |this| {
-                this.pl_2()
-                    .pr_0p5()
-                    .child(self.render_sidebar_toggle_button(true, cx))
-            })
     }
 
     fn render_thread_list_footer(&self, cx: &mut Context<Self>) -> impl IntoElement {
@@ -1770,40 +1780,6 @@ impl Sidebar {
                     })),
             )
     }
-
-    fn render_sidebar_toggle_button(
-        &self,
-        docked_right: bool,
-        cx: &mut Context<Self>,
-    ) -> impl IntoElement {
-        let icon = if docked_right {
-            IconName::ThreadsSidebarRightOpen
-        } else {
-            IconName::ThreadsSidebarLeftOpen
-        };
-
-        h_flex()
-            .h_full()
-            .px_1()
-            .map(|this| {
-                if docked_right {
-                    this.pr_1p5().border_l_1()
-                } else {
-                    this.border_r_1()
-                }
-            })
-            .border_color(cx.theme().colors().border_variant)
-            .child(
-                IconButton::new("sidebar-close-toggle", icon)
-                    .icon_size(IconSize::Small)
-                    .tooltip(move |_, cx| {
-                        Tooltip::for_action("Close Threads Sidebar", &ToggleWorkspaceSidebar, cx)
-                    })
-                    .on_click(|_, window, cx| {
-                        window.dispatch_action(ToggleWorkspaceSidebar.boxed_clone(), cx);
-                    }),
-            )
-    }
 }
 
 impl Sidebar {
@@ -1936,6 +1912,68 @@ impl Focusable for Sidebar {
     }
 }
 
+impl EventEmitter<PanelEvent> for Sidebar {}
+
+impl Panel for Sidebar {
+    fn persistent_name() -> &'static str {
+        "ThreadsSidebar"
+    }
+
+    fn panel_key() -> &'static str {
+        "threads_sidebar"
+    }
+
+    fn position(&self, _window: &Window, cx: &App) -> DockPosition {
+        AgentSettings::get_global(cx).dock.into()
+    }
+
+    fn position_is_valid(&self, position: DockPosition) -> bool {
+        position != DockPosition::Bottom
+    }
+
+    fn set_position(
+        &mut self,
+        _position: DockPosition,
+        _window: &mut Window,
+        _cx: &mut Context<Self>,
+    ) {
+        // Position is derived from agent settings and follows the agent panel
+    }
+
+    fn size(&self, _window: &Window, _cx: &App) -> Pixels {
+        self.width
+    }
+
+    fn set_size(&mut self, size: Option<Pixels>, _window: &mut Window, cx: &mut Context<Self>) {
+        self.set_width(size, cx);
+    }
+
+    fn icon(&self, _window: &Window, cx: &App) -> Option<IconName> {
+        let settings = AgentSettings::get_global(cx);
+        (settings.enabled(cx) && settings.button).then_some(IconName::ThreadsSidebarLeftClosed)
+    }
+
+    fn icon_tooltip(&self, _window: &Window, _cx: &App) -> Option<&'static str> {
+        Some("Threads Sidebar")
+    }
+
+    fn toggle_action(&self) -> Box<dyn Action> {
+        Box::new(ToggleThreadsSidebar)
+    }
+
+    fn activation_priority(&self) -> u32 {
+        4
+    }
+
+    fn enabled(&self, cx: &App) -> bool {
+        AgentSettings::get_global(cx).enabled(cx)
+    }
+
+    fn starts_open(&self, _window: &Window, _cx: &App) -> bool {
+        self.is_open
+    }
+}
+
 impl Render for Sidebar {
     fn render(&mut self, window: &mut Window, cx: &mut Context<Self>) -> impl IntoElement {
         let ui_font = theme::setup_ui_font(window, cx);
@@ -1961,7 +1999,7 @@ impl Render for Sidebar {
             .bg(cx.theme().colors().surface_background)
             .map(|this| match self.view {
                 SidebarView::ThreadList => this
-                    .child(self.render_thread_list_header(docked_right, cx))
+                    .child(self.render_thread_list_header(cx))
                     .child(
                         v_flex()
                             .relative()
@@ -2071,11 +2109,9 @@ mod tests {
             });
         });
         cx.run_until_parked();
-        let sidebar = panel.read_with(cx, |panel, _cx| {
-            panel
-                .sidebar
-                .clone()
-                .expect("AgentPanel should have created a sidebar")
+        let multi_workspace_entity = multi_workspace.clone();
+        let sidebar = workspace.update_in(cx, |_, window, cx| {
+            cx.new(|cx| Sidebar::new(multi_workspace_entity, window, cx))
         });
         (sidebar, panel)
     }

crates/zed/src/zed.rs 🔗

@@ -707,6 +707,14 @@ async fn initialize_agent_panel(
         })?
         .await?;
 
+    workspace_handle
+        .update_in(&mut cx, |workspace, window, cx| {
+            setup_or_teardown_ai_panel(workspace, window, cx, |workspace, cx| {
+                agent_ui::sidebar::Sidebar::load(workspace, cx)
+            })
+        })?
+        .await?;
+
     workspace_handle.update_in(&mut cx, |workspace, window, cx| {
         let prompt_builder = prompt_builder.clone();
         cx.observe_global_in::<SettingsStore>(window, move |workspace, window, cx| {
@@ -715,6 +723,10 @@ async fn initialize_agent_panel(
                 agent_ui::AgentPanel::load(workspace, prompt_builder, cx)
             })
             .detach_and_log_err(cx);
+            setup_or_teardown_ai_panel(workspace, window, cx, |workspace, cx| {
+                agent_ui::sidebar::Sidebar::load(workspace, cx)
+            })
+            .detach_and_log_err(cx);
         })
         .detach();
 
@@ -1033,6 +1045,15 @@ fn register_actions(
                 workspace.toggle_panel_focus::<TerminalPanel>(window, cx);
             },
         )
+        .register_action(
+            |workspace: &mut Workspace,
+             _: &zed_actions::assistant::ToggleThreadsSidebar,
+             window: &mut Window,
+             cx: &mut Context<Workspace>| {
+                workspace
+                    .toggle_panel_focus::<agent_ui::sidebar::Sidebar>(window, cx);
+            },
+        )
         .register_action({
             let app_state = Arc::downgrade(&app_state);
             move |_, _: &NewWindow, _, cx| {

crates/zed_actions/src/lib.rs 🔗

@@ -516,7 +516,11 @@ pub mod assistant {
             /// Toggles the agent panel.
             Toggle,
             #[action(deprecated_aliases = ["assistant::ToggleFocus"])]
-            ToggleFocus
+            ToggleFocus,
+            /// Toggles the agent drawer open or closed.
+            ToggleAgentDrawer,
+            /// Toggles the threads sidebar panel in the status bar.
+            ToggleThreadsSidebar
         ]
     );