4e64180
acp: Use the official ACP registry URL (#47564)
Click to expand commit body
Release Notes: - N/A
Ben Brandt created
4e64180
acp: Use the official ACP registry URL (#47564)
Release Notes: - N/A
Ben Brandt created
9931c6f
Add SSH remote server for Windows (#47460)
Closes https://github.com/zed-industries/zed/issues/33748 Release Notes: - Windows is now supported as a target platform for SSH remoting. --------- Co-authored-by: Lukas Wirth <me@lukaswirth.dev>
John Tur and Lukas Wirth created
e9d9474
gpui: Map diagonal resize cursor styles on Windows (#47477)
- Adds missing diagonal resize cursor mappings (NWSE/NESW) on Windows. - Fixes `CursorStyle::ResizeUpLeftDownRight` and `ResizeUpRightDownLeft` falling back to Arrow. Release Notes: - N/A
Conashimi created
f21a357
Hide block cursor text when the cursor is within a redacted range (#45549)
Closes [#ISSUE](https://github.com/zed-industries/zed/issues/20696) Release Notes: - Hide block cursor text when the cursor is within a redacted range Screenshot: <img width="434" height="174" alt="image" src="https://github.com/user-attachments/assets/5d9dc140-7abe-49a8-823a-58deb0e170dc" />
Rocky Shi created
3d4582d
git: Skip setting language on git index buffer (#47524)
Skipping setting the language on the git index text buffer improves snappiness for (very) large git diff multibuffers and also significantly lower peak and steady-state RSS. When tested on the chromium repo with `git reset HEAD~1000` and *all* language extensions installed we notice: * current `main`: peak RSS ~45GB, ss RSS ~39GB * this patch: peak RSS ~30GB, ss RSS ~27GB Release Notes: - Improved memory usage of large git diff multibuffers.
Jakub Konka created
19b4e43
agent: Add setting for controlling terminal tool stop button behavior (#47521)
Addressing the feedback left on a previous PR of mine: https://github.com/zed-industries/zed/pull/46663. I feel like this is worthy of a setting. Note, however, that this does not apply to typing `ctrl-c` in the terminal from within the agent panel; this is purely controlling what happens when you click on the "Stop" button in the terminal tool call card. Release Notes: - Agent: Added a setting for controlling the behavior of the stop button in the terminal tool call card (between cancelling the command to run and the thread, or just the command).
Danilo Leal created
2301c5f
Send EP trigger as part of zeta2 prediction request (#47523)
Release Notes: - N/A
Max Brunsfeld created
84b40d5
ep: Add `qa` subcommand to check predictions quality (#47520)
Release Notes: - N/A
Oleksiy Syvokon created
ff34f22
zeta2: Include context in captured examples (#47516)
Closes #ISSUE Release Notes: - N/A *or* Added/Fixed/Improved ... --------- Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Ben Kunkle and Zed Zippy created
e1076cd
languages: Add structs, unions and enums to outline in C (#46125)
Before: <img width="1179" height="739" alt="before" src="https://github.com/user-attachments/assets/de594de2-ac70-40cf-8813-bb8c02e95014" /> After: <img width="1009" height="696" alt="after" src="https://github.com/user-attachments/assets/b68b9f84-7f15-4baf-99ed-a259ca07e815" /> Release Notes: - Fixed struct union enum outline issues for c
ozacod created
56c10d5
git_graph: Add resizable columns (#47485)
Release Notes: - N/A Signed-off-by: Marco Mihai Condrache <52580954+marcocondrache@users.noreply.github.com> Co-authored-by: Anthony Eid <anthony@zed.dev> Co-authored-by: Remco Smits <djsmits12@gmail.com>
Marco Mihai Condrache , Anthony Eid , and Remco Smits created
2bfe0bf
git_graph: Add loading icon when loading initial commit chunk (#47514)
Release Notes: - N/A Co-authored-by: Remco Smits <djsmits12@gmail.com> Co-authored-by: Marco Mihai Condrache <52580954+marcocondrache@users.noreply.github.com>
Anthony Eid , Remco Smits , and Marco Mihai Condrache created
9569157
Clean up error handling for some edge cases to prevent panic (#47513)
Release Notes: - Improved error handling in the dev container crate to prevent panics
KyleBarton created
38821a6
Reduce intensity of refreshing pull diagnostics (#47510)
Before this change we'd spawn N tasks in parallel on every keystroke, afterwards we only allow 1 background diagnostic refresh in flight at a time. This also fixed a bug where we'd send O(n*2) pull diagnostic requests when re-opening a workspace with n editors. Co-authored-by: John Tur <john-tur@outlook.com> Closes #ISSUE Release Notes: - Improved performance when a large number of files were open by making background diagnostics more efficient --------- Co-authored-by: John Tur <john-tur@outlook.com>
Conrad Irwin and John Tur created
25904f6
Add support for refreshing outdated LLM tokens (#47512)
This PR adds support for refreshing LLM tokens that are "outdated"—that is, that are missing some required claims. Release Notes: - Fixed some instances of authentication errors with the Zed API that could be resolved automatically by refreshing the token.
Marshall Bowers created
fa534ae
Don't try to spawn conda if it's not there (#47261)
Closes #ISSUE Release Notes: - Fixed conda showing up in terminal windows
Conrad Irwin created
097cfae
Add helper method for checking if the LLM token needs to be refreshed (#47511)
This PR adds a new `needs_llm_token_refresh` helper method for checking if the LLM token needs to be refreshed. We were duplicating the check for the `x-zed-expired-token` header in a number of spots, and it will be gaining an additional case soon. Release Notes: - N/A
Marshall Bowers created
5d8fd87
editor: Fix bracket color change when system theme changes (#47505)
Closes #47503 I added an observer for `GlobalTheme` changes that check if the accent colors have changed or not. I thought this was closest to the patterns and style in the codebase. I also considered triggering a `SettingsStore` notification on theme reload but that seemed incorrect since the settings didn't really change, even if it would solve the problem (as the editor already observes `SettingsStore` to detect theme changes. Release Notes: - Fixed Bracket color not updating when system theme changes
Smit Chaudhary created
30f8841
editor: Fix inlay hint navigation for WSL/remote file paths (#46473)
Closes #46113 Release Notes: - N/A *or* Added/Fixed/Improved ...
Xin Zhao created
c474771
git_graph: Fix subject not wrapping (#47486)
Before: <img width="314" height="111" alt="image" src="https://github.com/user-attachments/assets/8e3b6ac9-81f5-4d21-aa51-9807afe4a732" /> After: <img width="314" height="111" alt="image" src="https://github.com/user-attachments/assets/d209c38a-9105-4c4f-908e-ca0e063c0cbc" /> Release Notes: - N/A Signed-off-by: Marco Mihai Condrache <52580954+marcocondrache@users.noreply.github.com>
Marco Mihai Condrache created
9201e1f
Don't always expose streaming edit tool (#47495)
Release Notes: - N/A
Michael Benfield created
6b0b95f
Show red X icon for interrupted subagents (#47499)
<img width="677" height="218" alt="Screenshot 2026-01-23 at 11 59 24 AM" src="https://github.com/user-attachments/assets/864c706f-6f9f-44dd-a18c-509f2bed164f" /> When a thread is interrupted while subagents are running, the subagent cards now show a red X icon instead of a green checkmark. This provides clearer visual feedback that the subagent was canceled rather than completed successfully. The icon logic now handles three states: - **Spinner**: when status is Pending or InProgress - **Red X**: when status is Canceled, Failed, or Rejected - **Green checkmark**: when status is Completed This matches the existing pattern used elsewhere in the codebase for showing error states on tool calls. (No release notes because subagents are still behind a feature flag.) Release Notes: - N/A
Richard Feldman created
01d72aa
editor: Fix panics that could occur when content mask had negative bounds (#47327)
Closes #47157 This panic happened because the editor was using `window.content_mask` to get the visible bounds, which had a negative value for its height in some cases. This happened for three reasons: 1. `Bounds::from_corners` returns a negative size if callers pass in corners where `bottom_right < top_left`. I originally wanted to add error checking to this function but didn't, because it might be better to move the error checking higher up. For now I'm going to push a fix and figure out a better solution later 2. `Bounds::intersect` could return negative-sized bounds when the two bounds didn't overlap, instead of returning a zero sized bounds. 3. `Style::paint` sometimes passed invalid corner values to `Bounds::from_corners` (where the computed bottom-right was above/left of the top-left). Release Notes: - editor: Fix a crash that could happen when editor visible line height is zero --------- Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Anthony Eid and Zed Zippy created
c999759
build: Simplify build graph (#47253)
- **title_bar: Extract platform_title_bar from title_bar** - **file_finder no longer depends on search and agent_servers no longer depend on language_models** Release Notes: - N/A --------- Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Piotr Osiewicz and Zed Zippy created
8419979
acp: Add one more registry ID to filter out (#47496)
Release Notes: - N/A
Ben Brandt created
29cf14e
Fix rate limiter holding permits during tool execution (#47494)
The rate limiter's semaphore guard was being held for the entire duration of a turn, including during tool execution. This caused deadlocks when subagents tried to acquire permits while parent requests were waiting for them to complete. ## The Problem In `run_turn_internal`, the stream (which contains the `RateLimitGuard` holding the semaphore permit) was kept alive throughout the entire loop iteration - including during **tool execution**: 1. Parent request acquires permit 2. Parent starts streaming, consumes response 3. Parent starts executing tools (subagents) 4. **Stream/guard still held** while tools execute 5. Subagents try to acquire permits → blocked because parent still holds permit 6. Deadlock if all permits are held by parents waiting for subagent children ## The Fix Two changes were made: 1. **Drop the stream early**: Added an explicit `drop(events)` after the stream is fully consumed but before tool execution begins. This releases the rate limit permit so subagents can acquire it. 2. **Removed the `bypass_rate_limit` workaround**: Since the root cause is now fixed, the bypass mechanism is no longer needed. Note: no release notes because subagents are still feature-flagged, and this rate limiting change isn't actually observable without them. Release Notes: - N/A
Richard Feldman created
9ef825d
docs: Improve Git documentation accuracy and structure (#47419)
This PR updates the Git documentation to accurately reflect the current UI and removes inaccuracies introduced in earlier drafts. **Changes:** - **Added Word Diff setting location**: The `word_diff_enabled` setting is accessible in the Settings Editor under **Languages & Tools > Miscellaneous**, which wasn't documented. - **Simplified Remotes section**: Removed claims about command palette actions for managing remotes that don't exist. The section now accurately describes the remote selector in the Git Panel. - **Added File History section**: Combined two paragraphs that said the same thing. Release Notes: - N/A --------- Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Katie Geer and Zed Zippy created
e6d8797
Allow specifying ZED_VERSION with fallback to latest in `install.sh` (#45522)
This PR updates the Linux install script to support installing a specific version of Zed via the ZED_VERSION environment variable. - If ZED_VERSION is set, that version will be downloaded. - If ZED_VERSION is not set, the script defaults to the latest stable version, preserving existing behavior. - Works for both Linux and macOS installs. - Maintains compatibility with ZED_CHANNEL for preview builds. This enhancement allows users to: - Pin a specific Zed version for reproducible setups or CI workflows. - Easily install older or known-good versions without manually downloading release assets. Usage examples: - Install latest stable (default): curl -f https://zed.dev/install.sh | sh - Install specific version: curl -f https://zed.dev/install.sh | ZED_VERSION=0.216.0 sh Use this — it’s correct, concise, and clearly user-facing: Release Notes * **Added:** Support for installing a specific Zed version via the `ZED_VERSION` environment variable in the install script (defaults to `latest` when unset).
Winner Edwin created
7c98f17
copilot: Decouple authentication from the lifetime of any single Copilot instance (#47473)
Users had trouble signing in due to us relying on the Copilot::global being set, which was never the case. We've decided to use a dedicated LSP instance just for handling auth of Copilot Chat and other goodies. That instance is subscribed to by local Copilot instances for projects. When the Auth instance changes it's state, local instances are prompted to re-check their own sign in status. Closes #47352 Co-authored-by: dino <dinojoaocosta@gmail.com> Release Notes: - Fixed authentication issues with Copilot. --------- Co-authored-by: dino <dinojoaocosta@gmail.com> Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Piotr Osiewicz , dino , and Zed Zippy created
21f49eb
agent: Ensure the activity bar shows up with the `StreamingEditFileTool` (#47417)
Release Notes: - N/A
Michael Benfield created
ff513cb
copilot: Rename enabled_next_edit_suggestions setting to enable_next_edit_suggestions (#47484)
Co-authored-by: Marshall Bowers <marshall@zed.dev> Closes #ISSUE Release Notes: - N/A Co-authored-by: Marshall Bowers <marshall@zed.dev>
Piotr Osiewicz and Marshall Bowers created
3a7c746
Revert " Add vim/emacs modeline support " (#47479)
Reverts zed-industries/zed#44210
I am forced to revert this PR as it completely breaks release builds
with the following panic:
```
thread 'main' (2648653) panicked at crates/rope/src/rope.rs:893:25:
byte index 73 is not a char boundary; it is inside 'স' (bytes 71..74) of `কৰক</translation>
<translation id="9216898458513705996">টেবসমূহ এই ডিভাইচত খোলা `
stack backtrace:
2026-01-23T15:37:48+01:00 INFO [node_runtime] using Zed managed Node.js at /Users/kubkon/Library/Application Support/Zed/node/node-v24.11.0-darwin-arm64 since system Node.js wasn't found on PATH: cannot find binary path
0: __rustc::rust_begin_unwind
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/std/src/panicking.rs:698:5
1: core::panicking::panic_fmt
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/panicking.rs:80:14
2: core::str::slice_error_fail_rt
3: core::str::slice_error_fail
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/str/mod.rs:69:5
4: core::str::traits::<impl core::slice::index::SliceIndex<str> for core::ops::range::Range<usize>>::index
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/str/traits.rs:248:21
5: <str as core::ops::index::Index<core::ops::range::Range<usize>>>::index
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/str/traits.rs:63:15
6: <rope::Chunks>::peek
at /Users/kubkon/dev/zed/crates/rope/src/rope.rs:893:25
7: <rope::Lines>::next
at /Users/kubkon/dev/zed/crates/rope/src/rope.rs:1111:45
8: <project::lsp_store::LspStore>::parse_modeline
at /Users/kubkon/dev/zed/crates/project/src/lsp_store.rs:4570:43
9: <project::lsp_store::LspStore>::on_buffer_added
at /Users/kubkon/dev/zed/crates/project/src/lsp_store.rs:4301:14
10: <project::lsp_store::LspStore>::on_buffer_store_event
at /Users/kubkon/dev/zed/crates/project/src/lsp_store.rs:4166:22
11: <<project::lsp_store::LspStore>::on_buffer_store_event as core::ops::function::FnMut<(&mut project::lsp_store::LspStore, gpui::app::entity_map::Entity<project::buffer_store::BufferStore>, &project::buffer_store::BufferStoreEvent, &mut gpui::app::context::Context<project::lsp_store::LspStore>)>>::call_mut
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/ops/function.rs:166:5
12: <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe::<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}
at /Users/kubkon/dev/zed/crates/gpui/src/app/context.rs:111:44
13: <gpui::app::App as gpui::AppContext>::update_entity::<project::lsp_store::LspStore, (), <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}>::{closure#0}
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:2281:26
14: <gpui::app::App>::update::<(), <gpui::app::App as gpui::AppContext>::update_entity<project::lsp_store::LspStore, (), <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}>::{closure#0}>
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:818:22
15: <gpui::app::App as gpui::AppContext>::update_entity::<project::lsp_store::LspStore, (), <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}>
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:2279:14
16: <gpui::app::entity_map::Entity<project::lsp_store::LspStore>>::update::<(), gpui::app::App, <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}::{closure#0}>
at /Users/kubkon/dev/zed/crates/gpui/src/app/entity_map.rs:445:12
17: <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe::<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}
at /Users/kubkon/dev/zed/crates/gpui/src/app/context.rs:111:22
18: <gpui::app::App>::subscribe_internal::<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <gpui::app::context::Context<project::lsp_store::LspStore>>::subscribe<project::buffer_store::BufferStore, project::buffer_store::BufferStoreEvent, <project::lsp_store::LspStore>::on_buffer_store_event>::{closure#0}>::{closure#0}
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:964:25
19: <alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>> as core::ops::function::FnMut<(&dyn core::any::Any, &mut gpui::app::App)>>::call_mut
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/boxed.rs:2012:9
20: <gpui::app::App>::apply_emit_effect::{closure#0}
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:1407:21
21: <gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain::<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}
at /Users/kubkon/dev/zed/crates/gpui/src/subscription.rs:132:17
22: <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain::<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/collections/btree/map.rs:1177:37
23: <alloc::collections::btree::map::ExtractIfInner<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>, core::ops::range::RangeFull>>::next::<<alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}, alloc::alloc::Global>
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/collections/btree/map.rs:2036:16
24: <alloc::collections::btree::map::ExtractIf<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>, core::ops::range::RangeFull, <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}> as core::iter::traits::iterator::Iterator>::next
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/collections/btree/map.rs:2002:20
25: <alloc::collections::btree::map::ExtractIf<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>, core::ops::range::RangeFull, <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}> as core::iter::traits::iterator::Iterator>::fold::<(), core::iter::traits::iterator::Iterator::for_each::call<(usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>), core::mem::drop<(usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>)>>::{closure#0}>
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/iter/traits/iterator.rs:2602:34
26: <alloc::collections::btree::map::ExtractIf<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>, core::ops::range::RangeFull, <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>::{closure#0}> as core::iter::traits::iterator::Iterator>::for_each::<core::mem::drop<(usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>)>>
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/iter/traits/iterator.rs:828:14
27: <alloc::collections::btree::map::BTreeMap<usize, gpui::subscription::Subscriber<(core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>>::retain::<<gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain<<gpui::app::App>::apply_emit_effect::{closure#0}>::{closure#1}>
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/alloc/src/collections/btree/map.rs:1177:46
28: <gpui::subscription::SubscriberSet<gpui::app::entity_map::EntityId, (core::any::TypeId, alloc::boxed::Box<dyn for<'a, 'b> core::ops::function::FnMut<(&'a dyn core::any::Any, &'b mut gpui::app::App), Output = bool>>)>>::retain::<<gpui::app::App>::apply_emit_effect::{closure#0}>
at /Users/kubkon/dev/zed/crates/gpui/src/subscription.rs:130:21
29: <gpui::app::App>::apply_emit_effect
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:1405:14
30: <gpui::app::App>::flush_effects
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:1308:31
31: <gpui::app::App>::finish_update
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:830:18
32: <gpui::app::App>::update::<core::result::Result<(), anyhow::Error>, <gpui::app::App as gpui::AppContext>::update_entity<project::buffer_store::BufferStore, core::result::Result<(), anyhow::Error>, <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::{closure#3}>::{closure#0}>
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:819:14
33: <gpui::app::App as gpui::AppContext>::update_entity::<project::buffer_store::BufferStore, core::result::Result<(), anyhow::Error>, <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::{closure#3}>
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:2279:14
34: <gpui::app::async_context::AsyncApp as gpui::AppContext>::update_entity::<project::buffer_store::BufferStore, core::result::Result<(), anyhow::Error>, <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::{closure#3}>
at /Users/kubkon/dev/zed/crates/gpui/src/app/async_context.rs:65:13
35: <gpui::app::entity_map::WeakEntity<project::buffer_store::BufferStore>>::update::<gpui::app::async_context::AsyncApp, core::result::Result<(), anyhow::Error>, <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::{closure#3}>
at /Users/kubkon/dev/zed/crates/gpui/src/app/entity_map.rs:750:15
36: <project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}::{closure#0}::<i32>
at /Users/kubkon/dev/zed/crates/project/src/buffer_store.rs:683:18
37: <gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn::<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}::{closure#0}::<i32>
at /Users/kubkon/dev/zed/crates/gpui/src/app/context.rs:244:52
38: <gpui::app::App>::spawn::<<gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:1532:44
39: <scheduler::executor::spawn_local_with_source_location::Checked<<gpui::app::App>::spawn<<gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}> as core::future::future::Future>::poll
at /Users/kubkon/dev/zed/crates/scheduler/src/executor.rs:393:64
40: <async_task::raw::RawTask<scheduler::executor::spawn_local_with_source_location::Checked<<gpui::app::App>::spawn<<gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}>, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>, <scheduler::executor::ForegroundExecutor>::spawn<<gpui::app::App>::spawn<<gpui::app::context::Context<project::buffer_store::BufferStore>>::spawn<<project::buffer_store::LocalBufferStore>::open_buffer::{closure#1}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}, core::result::Result<gpui::app::entity_map::Entity<language::buffer::Buffer>, anyhow::Error>>::{closure#0}>::{closure#0}, scheduler::RunnableMeta>>::run
at /Users/kubkon/.cargo/git/checkouts/async-task-e468f817236eac43/b4486cd/src/raw.rs:296:17
41: <async_task::runnable::Runnable<scheduler::RunnableMeta>>::run
at /Users/kubkon/.cargo/git/checkouts/async-task-e468f817236eac43/b4486cd/src/runnable.rs:788:18
42: gpui::platform::mac::dispatcher::trampoline
at /Users/kubkon/dev/zed/crates/gpui/src/platform/mac/dispatcher.rs:248:14
43: <unknown>
44: <unknown>
45: <unknown>
46: <unknown>
47: <unknown>
48: <unknown>
49: <unknown>
50: <unknown>
51: <unknown>
52: <unknown>
53: <unknown>
54: <unknown>
55: <unknown>
56: <unknown>
57: <unknown>
58: <gpui::platform::mac::platform::MacPlatform as gpui::platform::Platform>::run
at /Users/kubkon/dev/zed/crates/gpui/src/platform/mac/platform.rs:473:17
59: <gpui::app::Application>::run::<zed::main::{closure#9}>
at /Users/kubkon/dev/zed/crates/gpui/src/app.rs:192:18
60: zed::main
at /Users/kubkon/dev/zed/crates/zed/src/main.rs:419:9
61: <fn() as core::ops::function::FnOnce<()>>::call_once
at /rustc/ded5c06cf21d2b93bffd5d884aa6e96934ee4234/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
```
cc @ConradIrwin @elmarco
Jakub Konka created
4efe93c
ui: Fix LoadingLabel animation panic on CJK/emoji text (#45632)
This PR fixes a crash in LoadingLabel where the loading animation progressively revealed text by slicing with byte offsets (.len()), which can panic for UTF-8 multi-byte characters (e.g., CJK) and emoji. Release Notes: - Fix a crash in LoadingLabel’s loading animation when displaying CJK or emoji text.
MomentDerek created
e1c80f4
workspace: Support hot-exit for empty workspaces and single files (#46557)
Enables restoration of empty workspaces (without folders) that contain unsaved items like drafts or single files. Empty workspaces are now identified by workspace_id rather than paths, allowing multiple empty workspaces to coexist and be properly restored on startup. This ensures users don't lose work when closing Zed with unsaved files in empty workspaces. Closes #15098 Release Notes: - Improved: Empty workspaces with unsaved files now restore on startup (hot-exit) --------- Co-authored-by: Kirill Bulatov <kirill@zed.dev>
Feng and Kirill Bulatov created
9db7161
copilot: Add the option to disable Next Edit Suggestions (#47438)
Adds a new setting to GitHub Copilot to toggle the Next Edit Suggestions
feature, it is enabled by default.
## Motivations
Due to some current usability issues with this feature, see #46880, and
some personal anecdotes of using it, it is currently rough to utilize,
so this gives the option to disable it.
## Related
- #47071
- #30124
- #44486
## Release Notes
- Adds the ability to disable GitHub Copilot's Next Edit Suggestions
feature.
## User Interface

## Text Example
The text example will be adding a `z` variable to a `Point3D` class in
TypeScript.
### With Next Edit Suggestions
In this example I am able to just press auto-complete (press TAB) 3x.
```ts
class Point3D {
x: number;
y: number;
z: number; // <-- Cursor before z: suggested
constructor(x: number,
y: number
, z: number // <-- Next Suggestion
) {
this.x = x;
this.y = y;
this.z = z; // <-- Last Suggestion
}
}
```
### Without Next Edit Suggestions
```ts
class Point3D {
x: number;
y: number;
z: number; // <-- Cursor before z: the only suggestion
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
```
André Eriksson created
30ca3ac
languages: Add attribute highlighting in C (#47156)
Closes #46125. Before: <img width="716" height="367" alt="before" src="https://github.com/user-attachments/assets/ce96d3bc-9e90-4eb7-9309-37cc9599e9d9" /> After: <img width="690" height="345" alt="after" src="https://github.com/user-attachments/assets/5d8c84a4-5fe8-4f7c-9e4f-137b5f077171" /> Release Notes: - Updated tree-sitter-c for highlighting attribute specifier in C
ozacod created
9da3f2d
util: Implement host independent Url to PathBuf conversion (#47474)
We might interface with the LSP using URL heres across remotes that have differing path styles which then breaks every now and then when we have windows to unix connections. This should helps us fix these occurences more correctly Release Notes: - N/A *or* Added/Fixed/Improved ...
Lukas Wirth created
336bc3c
outline: Fix uninitiated var declaration not showing in outline (#46499)
For the following code, we didn't show anything; after the fix, they are shown in the outline: <img width="617" height="170" alt="image" src="https://github.com/user-attachments/assets/091a905c-7c1c-4c3a-935f-65c2cd5ae2e5" /> Release Notes: - Fix uninitiated var declaration is not shown in outline.
Haojian Wu created
da3847a
Support multiple snippets locations per extension (#45829)
This allows extensions to add more than one snippet file whilst keeping it backwards compatible. Release Notes: - Added support for specifying multiple snippets paths in extensions.
Finn Evers created
515a840
build: Bump Rust version to 1.93 (#47358)
Release Notes: - N/A --------- Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
Piotr Osiewicz and Jakub Konka created
753302e
acp: Promote registry as default way of installing new agents (#47464)
Release Notes: - acp: Add the ability to install new Agents via the ACP Registry
Ben Brandt created
36fef44
agent_ui: Prioritize file completions that are closer to recently viewed files (#47466)
Release Notes: - Improved @ file completions in agent panel to be more accurate
Lukas Wirth created
01e67d8
acp: Support unstable session/resume request (#47387)
This is behind the beta flag. But some agents don't support a full load flow, but rather just a resume from the current state of the session. They don't emit notifications for past thread messages, which isn't ideal, but the user can at least resume their work without completely losing it. We use it as a fallback if the agent doesn't support loading only, and signal to the user that they won't be able to see previous messages. Release Notes: - N/A
Ben Brandt created
4333d6b
agent_ui: Enable the message queue feature for external agents (#47379)
Closes https://github.com/zed-industries/zed/issues/47330 This PR moves the queue logic out of the native Thread into the shared UI layer (thread view) to enable it for external agents. There's a key difference in behavior, though, between native and external agents: queued messages in the former will be sent in the next turn boundary, given we can easily tell this, whereas for the latter, queued messages will be sent by the end of the generation. We'd need an ACP-level change to provide exactly the same UX between both types of agents, and I figured that's better to have _some_ version of the feature for external agents as opposed to not having it all due to this difference. Release Notes: - Agent: Made the message queue feature available for external agents as well.
Danilo Leal created
d4f2056
remote: Fix when .ssh config is missing (#47310)
Closes #47309 Rewroked the file parsing loop so that if one file is missing it doesn't cause the loop to exit prematurely. Release Notes: * Fixed issue where user .ssh/config file would not parse if global ssh config file was not present. --------- Co-authored-by: Gaff <226665+Gaff@users.noreply.github.com>
Matthew and Gaff created
5eb2ff0
Relax the checks on `xdg_wm_base` to ensure compatibility with Weston 9 (#47185)
Closes #47128 Release Notes: - Relax the checks on `xdg_wm_base` to ensure compatibility with Weston 9.
Ling Hengqian created
916da3d
Increase operations/run for stalebot (#47459)
It's been running out of operations before it could do everything it's supposed to do. Release Notes: - N/A
Lena created
d3b1f7f
git: Fix graph view slow initial loading times (#47453)
The git graph view was missing a `cx.notify` when it loaded commits from the data layer, causing the graph to seem unresponsive until a render was triggered by something else. Release Notes: - N/A
Anthony Eid created
4186e57
Add vim/emacs modeline support (#44210)
Many editors such as vim and emacs support "modelines", a comment at the beginning of the file that allows the file type to be explicitly specified along with per-file specific settings - The amount of configurations, style and settings mapping cannot be handled in one go, so this opens up a lot of potential improvements. - I left out the possiblity to have "zed" specific modelines for now, but this could be potentially interesting. - Mapping the mode or filetype to zed language names isn't obvious either. We may want to make it configurable. This is my first contribution to zed, be kind. I struggled a bit to find the right place to add those settings. I use a similar approach as done with editorconfig (merge_with_editorconfig). There might be better ways. Closes #4762 Release Notes: - Add basic emacs/vim modeline support. Supersedes #41899, changes: - limit reading to the first and last 1kb - add documentation - more variables handled - add Arc around ModelineSettings to avoid extra cloning - changed the way mode -> language mapping is done, thanks to `modeline_aliases` language config - drop vim ex: support - made "Local Variables:" handling a separate commit, so we can drop it easily - various code style improvements --------- Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
Marc-Andre Lureau , Claude , and Conrad Irwin created
8273e6d
agent: Multiline review comments (#47448)
Multiline review comments. Also changes a few existing review comment types to use anchors instead of absolute offsets Release Notes: - N/A
Cameron Mcloughlin created