2301c5f
Send EP trigger as part of zeta2 prediction request (#47523)
Click to expand commit body
Release Notes: - N/A
Max Brunsfeld 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
7ba0bda
git: Add graph support (#44434)
Closes #26866 ### Summary Adds a git graph to Zed, accessible via the `git_graph::Open` action if a project has an active repository. There's still more to do, but this is a solid foundation to expand upon. The code structure is in line with Zed's codebase and shouldn't require architectural changes to add missing features. The git graph can be opened via the command palette (`git graph: open`) or by binding a key to `git_graph::Open`. It's available when the project has an active git repository. ### Architecture Similar to the Debugger, the git graph is split between a data layer and a view/UI layer. When the view layer is rendering, it queries the data layer for its active state. This setup allows the data layer to lazily request graph data (only when needed for rendering), abstracts collab from the view layer, allows most of the data loading to happen on a background thread, and makes caching easy to implement. #### Graph Loading The graph data is loaded in two phases: 1. `Repository::graph_data()` streams commit structure (SHA, parents, refs) in chunks of 1000 via `git log` 2. `CommitDataReader` lazily fetches full commit details (author, timestamp, subject) on-demand using a persistent `git cat-file --batch` process This two-phase approach makes the initial loading of the graph as fast as possible, because `git log` takes significantly longer when all the needed graph data is queried through it. Zed then lazily loads commits in the user's viewport through `cat-file --batch`. This makes scrolling to any place in the graph extremely snappy and benefits the collaborative architecture by only fetching data needed to render the graph. It also allows Zed to share commit data between different graph visualizations (e.g., date order vs. topological order). #### Performance Tested on both the Zed and LLVM repositories with good performance in both cases. The two-phase loading approach and lazy fetching keep the UI responsive even with large commit histories. #### Testing I added property testing that builds randomized commit graphs and verifies that the graph is constructed correctly. This also works as an integration test and will be expanded in the future to test collab graph visualization, graph filtering, commit actions, etc. ### New Crate - `git_graph` (GPL-licensed) — contains UI and graph computation logic ### Not Yet Implemented - Remote repository support (collab) - Filtering by branch - Commit actions (checkout, cherry-pick, etc.) - Search - Open commit view for selected commit - Resizable columns - Column filtering #### Reference <img width="1624" height="976" alt="Screenshot 2025-01-22 at 8 15 39 PM" src="https://github.com/user-attachments/assets/0f10924a-3964-462f-b320-42d84d02f7bf" /> Special thanks to [Alberto Slavica](https://github.com/pyundev) for submitting #44405, which was a good base to work off of. Release Notes: - git: Add initial version of git graph --------- Co-authored-by: pyundev <pyundev@users.noreply.github.com> Co-authored-by: Cole Miller <cole@zed.dev> Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Anthony Eid , pyundev , Cole Miller , and Zed Zippy created
5418c91
Make auto-signature help respect popover delay (#46745)
Closes #46191 Release Notes: - Make the auto signature popover — `"auto_signature_help": true` — respect `hover_popover_delay`.
Muhammad Salar Khan created
a5eb666
git: Fix panic when committing from side-by-side view (#47425)
When committing, it was possible for the left-hand side multibuffer to get the updated base text (via the `buffer_changed_since_sync` mechanism) without updating its diff snapshot for that buffer (via the diff subscription), causing a mismatch between that multibuffer's diff state and its buffer state. The fix is to ensure for inverted diffs that we always update pull an updated diff snapshot as part of `sync_from_buffer_changes`. This also removes some code that we added in #44838 to sync the left-hand side multibuffer when edits on the right-hand side invalided diff hunks. Instead, the left-hand side will just sync the next time the diff recalculates when this happens, and will always consider hunks from the last diff calculation as valid--so there will be a short window where the diff transforms and `diff_hunks_in_range` don't match between the two sides. That's okay because we don't rely on this in the display map--the code that translates positions between the two sides accesses the diff's `InternalDiffHunk`s directly rather than going through a multibuffer API. Release Notes: - N/A
Cole Miller created
ad8f41a
git: Fix double-lease panic when syncing selections in side-by-side diff (#47430)
Release Notes: - N/A
Cole Miller created
398da33
terminal: Fix `test_terminal_eof` test failing on fish shell (#47410)
It turns out Alacritty sends `AlacTermEvent::ColorRequest` when using the fish shell. That path relies on `cx.theme`, so this change is needed for it to pass. Co-authored-by: Lukas <lukas@zed.dev> Release Notes: - N/A
Smit Barmase created
13e130b
Update .mailmap (#47413)
This PR updates the .mailmap file to merge some more commit authors. Release Notes: - N/A
Smit Barmase created