b0ded23
Fix the bug
MrSubidubi created
b0ded23
Fix the bug
MrSubidubi created
50f677a
Add test
MrSubidubi created
1ee4d24
sidebar: Add "move to new window" action (#52219)
Co-authored-by: Anthony Eid <hello@anthonyeid.me>
Cameron Mcloughlin and Anthony Eid created
372ce88
agent: Wait until linked git worktree state is loaded (#51395)
### Context This fixes a bug where the sidebar would show a newly created git worktree thread as its own project while the recently created workspace is loading its git state. The fix is adding project APIs to await the initial worktree store scan and then each git repo initial snapshot; then awaiting on them before adding the new workspace to the multi-workspace. ### Architecture: I added the `Worktree::Remote::wait_for_snapshot` API to `Worktree::Local` to enable `WorktreeStore` to await for both remote and local projects until there's an initial scan. The `WorktreeStore` uses the watcher pattern so it can update the initial scan state whenever visible worktrees are added or removed from the store. Before you mark this PR as ready for review, make sure that you have: - [x] Added solid test coverage and/or screenshots from doing manual testing - [x] Done a self-review taking into account security and performance aspects - [x] Aligned any UI changes with the [UI checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) Release Notes: - N/A --------- Co-authored-by: Ben Kunkle <ben@zed.dev> Co-authored-by: cameron <cameron.studdstreet@gmail.com> Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Anthony Eid , Ben Kunkle , cameron , and Zed Zippy created
54f12d1
Log when migrating thread metadata in `ThreadMetadataStore` (#52230)
## Context
This will make it easier to diagnose issues if any come up when
migrating thread metadata for the sidebar
## How to Review
<!-- Help reviewers focus their attention:
- For small PRs: note what to focus on (e.g., "error handling in
foo.rs")
- For large PRs (>400 LOC): provide a guided tour — numbered list of
files/commits to read in order. (The `large-pr` label is applied
automatically.)
- See the review process guidelines for comment conventions -->
## Self-Review Checklist
<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
Bennet Bo Fenner created
60a2985
title_bar: Respect Linux titlebar config (#47506)
Currently, Zed always places three fixed window buttons (Minimize, Maximize and Close) on the right side of the window in a fixed order ignoring any user configuration or desktop environment preference (like elementary). This PR adds support for GNOME-style layout strings (`minimize:close`). By default, we pull it from the gsettings portal, but we also allow manual configuration via `title_bar.button_layout` config key. <img width="1538" height="797" alt="image" src="https://github.com/user-attachments/assets/5db6bfa2-3052-4640-9228-95c37f318929" /> Closes #46512 I know it's a relatively large PR for my first one and I'm new to Rust. So, sorry if I've made any huge mistakes. I had just made it for personal use and then decided to try to clean it up and submit it. I've tested with different configs on Linux. Untested on other platforms, but should have no impact. If it's not up to par, it's okay, feel free to close :) Release Notes: - Added support for GNOME's window buttons configuration on Linux. --------- Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Mufeed Ali and Smit Barmase created
466995c
gpui_macos: Guard deferred AppKit calls against closed windows (#51992)
MacWindow methods like activate(), zoom(), toggle_fullscreen(), resize(), prompt(), and titlebar_double_click() capture the raw native_window pointer and spawn detached async tasks on the foreground executor. If the window is closed between the spawn and execution (e.g. the user clicks the close button), the task sends AppKit messages to a closed NSWindow, which throws an ObjC exception in _changeKeyAndMainLimitedOK: and aborts the process. Add an isVisible check inside each deferred task before sending messages to the native window. After [NSWindow close], isVisible returns NO, so the guard prevents the crash. Both the check and the subsequent AppKit call execute synchronously within the same main-thread task, so there is no TOCTOU race. For prompt(), the else branch releases the alert object to avoid leaking it; the oneshot sender inside the completion block is dropped, which cancels the channel and propagates as an error to the caller. Closes ZED-5TN Release Notes: - N/A or Added/Fixed/Improved ...
Lukas Wirth created
f1f21d8
agent: Make branch diff completion use same default branch as branch diff action (#52223)
## Context Before this change the branch diff would compare with local main instead of upstream main. This causes confusion because it's a different diff than the branch diff action would show users, and cause agents to potentially review a much larger diff then it has too. ## Self-Review Checklist <!-- Check before requesting review: --> - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - N/A
Anthony Eid created
f8b74ac
Move permission outcome construction out of the UI layer (#52050)
Follow-up to the terminal permission params refactor, addressing
@benbrandt's [review
feedback](https://github.com/zed-industries/zed/pull/51782#pullrequestreview-2926899804)
about string formatting leaking into the UI layer.
## Changes
### Outcome construction moved to acp_thread
- Added `PermissionOptionChoice::build_outcome(is_allow)` — builds a
`SelectedPermissionOutcome` from a choice, attaching
`SelectedPermissionParams::Terminal` when the choice carries
`sub_patterns`.
- Added
`PermissionOptions::build_outcome_for_checked_patterns(checked_indices,
is_allow)` — handles the `DropdownWithPatterns` per-command checklist
flow, returning `None` when zero patterns are checked (degrading to
once).
The UI's `authorize_with_granularity` no longer does any
`format!("always_allow:{}",...)` string formatting or
`SelectedPermissionParams` construction.
### `option_kind` folded into `SelectedPermissionOutcome`
`SelectedPermissionOutcome` now carries `option_kind:
acp::PermissionOptionKind`, eliminating the separate parameter that was
threaded through the entire `authorize_tool_call` chain:
```
ThreadView::authorize_tool_call
→ Conversation::authorize_tool_call
→ AcpThread::authorize_tool_call
```
Every signature in this chain dropped one parameter.
### `SelectedPermissionParams` removed from UI imports
The type is now only referenced by `acp_thread` (construction) and
`agent` (consumption). The UI passes `SelectedPermissionOutcome`
opaquely.
Release Notes:
- N/A
Eric Holk created
bcd29c8
docs: Add section on extension publishing prerequisites (#51655)
Release Notes: - N/A --------- Co-authored-by: Marshall Bowers <git@maxdeviant.com>
Finn Evers and Marshall Bowers created
23e1bcf
languages: Improve semantic token highlighting for parameters and Python (#52130)
## Context Zed's semantic token highlighting does not cover all token types returned by language servers, so the highlighting looks fairly primitive compared with tree-sitter highlighting, especially for Python language servers. This PR adds some global and Python-specific rules for better highlighting. I need to admit that the built-in Python language servers currently have weak semantic highlighting implementations. Pylance, the closed-source Python language server from Microsoft, provides the best highlighting for now, but I think ty will do better, even though it still has a long way to go. ## How to Review Basically, this is a rule-adding change. Some rules are made global, and some are made Python-specific. ## Self-Review Checklist <!-- Check before requesting review: --> - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - Improved semantic token highlighting for parameters and Python
Xin Zhao created
2938ab9
Fix close_session final save being a guaranteed no-op (#52030)
`close_session` removed the session from `self.sessions` before calling `save_thread`, but `save_thread` immediately looks up the session in `self.sessions` and returns early if it's not found. This meant the explicit final save was always a no-op. Additionally, when the local `session` variable was dropped at the end of the closure, it cancelled any in-flight save from a prior observe callback by dropping `session.pending_save`. So on session close: - The explicit final save was a guaranteed no-op - Any in-flight save from an earlier observation was cancelled **Fix:** Call `save_thread` while the session is still in the map, then extract the `pending_save` task and return it so the caller can actually await the save completing. **Test:** Added `test_close_session_saves_thread` which sets a draft prompt without a `run_until_parked()` before `close_session`, so the only way the data gets persisted is if `close_session` itself performs the save. Also strengthened the existing `test_save_load_thread` similarly. Closes AI-95 Release Notes: - Fixed a bug where closing an agent thread could lose unsaved changes (e.g. draft prompts) made in the same frame.
Richard Feldman created
4049a4c
Fix removed workspace resurrecting via serialization race (#52035)
In `remove_workspace`, the removed `Entity<Workspace>` could still have a pending `serialize_workspace` throttle timer (200ms). When that timer fired, `serialize_workspace_internal` would write the old `session_id` back to the DB — undoing the removal. On next restart, the workspace would reappear. The race window opens whenever any state change (worktree change, breakpoint change, etc.) triggers `serialize_workspace` within 200ms before `remove_workspace` is called. **Fix**: Before the DB cleanup task, `update` the removed workspace entity to: 1. `session_id.take()` — so any in-flight serialization writes `session_id: None` 2. `_schedule_serialize_workspace.take()` — cancel the pending throttle timer 3. `_serialize_workspace_task.take()` — cancel any actively running serialization task This mirrors what `remove_from_session` already does (clearing `session_id`), but `remove_workspace` was missing it. Release Notes: - Fixed a bug where a removed workspace could reappear on next launch due to a serialization race.
Richard Feldman created
5d9e8a2
Replace typewriter/hash worktree naming with adjective-noun pairs (#52221)
Replace the typewriter-brand + random-hash naming scheme for auto-generated git worktree branches with an adjective-noun approach (e.g. `swift-falcon`, `calm-meadow`). - Removed the ~650-entry typewriter brand name list and hash generation - Added 235 adjectives and 228 nouns (~53,500 unique combinations) - Branch names are now checked for exact-match collisions against existing branches - Updated error messaging Closes AI-101 Release Notes: - Improved auto-generated git worktree branch names to use friendlier adjective-noun pairs (e.g. `swift-falcon`) instead of typewriter brand names with random hashes.
Richard Feldman created
aa63f8e
Fix terminal block missing first line via f32 tolerance (#52111)
## Context `TerminalBounds::num_lines()` uses `floor(height / line_height)` to compute the terminal grid row count. When the height is derived from `N * line_height` (as it is for inline/embedded terminals in the Agent Panel), IEEE 754 float32 arithmetic can produce `N - epsilon` instead of `N`, causing `floor()` to return `N - 1`. This makes the terminal grid one row too small, leaving the first line of output in invisible scrollback (since `display_offset = 0`). The same issue applies to `num_columns()`. The fix adds a small tolerance (`0.01`) before flooring, which absorbs float precision errors without affecting genuine fractional results. Closes #51609 ## How to Review Small PR — focus on the tolerance value (`0.01`) in `num_lines()` and `num_columns()` in `crates/terminal/src/terminal.rs`. The two new tests (`test_num_lines_float_precision`, `test_num_columns_float_precision`) verify the fix across 1,000+ float combinations that previously triggered the bug. ## Self-Review Checklist - [x] I've reviewed my own diff for quality, security, and reliability - [ ] Unsafe blocks (if any) have justifying comments - [ ] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - Fixed the first line of terminal output sometimes missing in Agent Panel terminal blocks.
João Soares created
d31d3b8
project: Fix code_actions_on_format edits being reverted when no formatter available (#51605)
Fixes #51490 ## Problem When `code_actions_on_format` is configured (e.g., `source.fixAll.phpcs`) and `formatter` is not explicitly set, code action edits are applied but then reverted during format-on-save. The root cause is in the formatting pipeline's error handling. Code actions and formatters share a single transaction via `.chain()`. When `Formatter::Auto` resolves to `Formatter::Prettier` (PHP defaults to `prettier.allowed: true`), and prettier is not installed or fails, the error propagates via `?` out of the formatter loop, aborting the entire `format_buffer_locally` function. This causes the formatting transaction - which already contains the successfully applied code action edits - to be lost. The workaround of setting `"formatter": []` works because it removes all formatters from the chain, so no formatter can fail and trigger the abort. ## Fix Change error handling for individual formatters (Prettier, External command, Language Server) from propagating errors via `?` to logging the error and continuing to the next formatter. This treats "formatter failed" as a no-op for that specific formatter rather than aborting the entire pipeline. This matches the existing pattern used when `LanguageServer(Current)` finds no server that supports formatting - it already logs and `continue`s rather than erroring. ## Testing - `cargo check -p project` passes - `cargo fmt -p project -- --check` passes Release Notes: - Fixed `code_actions_on_format` edits being reverted when `formatter: "auto"` resolves to an unavailable formatter. --------- Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com> Co-authored-by: Kirill Bulatov <kirill@zed.dev>
Matt Van Horn , Matt Van Horn , and Kirill Bulatov created
b39b995
ep: Fix `teacher` and `repair` output parsers (#52213)
In some cases, we were generating a bunch of junk. Release Notes: - N/A
Oleksiy Syvokon created
256135e
open_ai: Enable parallel tool calling for models that support it (#52203)
## Context We seemed to have disabled it in #28056, because our agent did not support parallel tool calls at the time. ## Self-Review Checklist <!-- Check before requesting review: --> - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - N/A or Added/Fixed/Improved ...
Bennet Bo Fenner created
45ca651
Fix stale diagnostic error markers in file tree (#49333)
## Summary Fixes #48289 Closes https://github.com/zed-industries/zed/issues/52021 Diagnostic error markers (red/yellow dots) in the project panel file tree persisted after errors were resolved. Three root causes: - **WorktreeUpdatedEntries ignored** — when files changed on disk (e.g. `yarn install`), stale diagnostic summaries were never cleared. Added `invalidate_diagnostic_summaries_for_updated_entries()` to clear summaries for `Removed`/`Updated`/`AddedOrUpdated` paths. - **Missing DiagnosticsUpdated emission on server stop** — `stop_local_language_server()` cleared summaries and sent proto messages but never emitted `LspStoreEvent::DiagnosticsUpdated`, so the project panel never refreshed. - **Buffer reload not handled** — reloading a buffer from disk did not clear stale summaries. Added `BufferEvent::Reloaded` handler. All three paths also send zeroed `UpdateDiagnosticSummary` proto messages to downstream collab clients. ## Test plan - [x] `./script/clippy` passes - [x] `cargo test -p project -p project_panel -p worktree` passes (319 tests, 0 failures) - [x] 4 new tests added: - `test_diagnostic_summaries_cleared_on_worktree_entry_removal` - `test_diagnostic_summaries_cleared_on_worktree_entry_update` - `test_diagnostic_summaries_cleared_on_server_restart` - `test_diagnostic_summaries_cleared_on_buffer_reload` - [x] Manual testing: error markers clear when files change on disk - [x] Manual testing: error markers clear on LSP restart Release Notes: - Fixed stale diagnostic data persisting after file reloads, server restarts and FS entry removals
Arthur Jean created
62cea4e
deepseek: Fix empty text segments causing issues (#52199)
## Context
Deepseek seems to have started to return empty text deltas, which causes
issues cause their upstream API does not like empty text blocks to be
included in their request.
In practice this caused issues like `An assistant message with
'tool_calls' must be followed by tool messages responding to each
'tool_call_id'..., because the payload looked like this:
```
User {
content: "Call the now tool a bunch of times",
},
Assistant {
content: Some(
"",
),
},
Tool {
content: "The current datetime is 2026-03-23T13:21:24.084848+00:00.",
tool_call_id: "call_00_iozCfHXJAPR13XwHiAwJ9OEw",
},
```
Now we filter out that empty text, which seems to fix the issue. This
matches our implementation for OpenAI
Closes #51854
<!-- What does this PR do, and why? How is it expected to impact users?
Not just what changed, but what motivated it and why this approach.
Link to Linear issue (e.g., ENG-123) or GitHub issue (e.g., Closes #456)
if one exists — helps with traceability. -->
## How to Review
<!-- Help reviewers focus their attention:
- For small PRs: note what to focus on (e.g., "error handling in
foo.rs")
- For large PRs (>400 LOC): provide a guided tour — numbered list of
files/commits to read in order. (The `large-pr` label is applied
automatically.)
- See the review process guidelines for comment conventions -->
## Self-Review Checklist
<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- deepseek: Fixed issue with tool calling (`An assistant message with
'tool_calls' must be followed by tool messages responding to each
'tool_call_id'...`)
Bennet Bo Fenner created
a75b8c8
languages: Highlight `await` as `keyword.control` in JS/TS/TSX files (#52034)
## Context Fixes https://github.com/zed-industries/zed/issues/51921 `await` was grouped under the generic `@keyword` capture in the tree-sitter highlights queries for JavaScript, TypeScript, and TSX. It should be `@keyword.control`, since it's a control flow keyword — same as `return`, `yield`, `throw`, `break`, etc., which were already correctly classified. This aligns Zed's highlighting with VSCode's behavior, where `await` is tokenized as `keyword.control`. ## How to Review Three single-line moves across highlights files — `await` removed from the `@keyword` list, added to the `@keyword.control` list: 1. `crates/languages/src/javascript/highlights.scm` 2. `crates/languages/src/typescript/highlights.scm` 3. `crates/languages/src/tsx/highlights.scm` ## Self-Review Checklist - [x] I've reviewed my own diff for quality, security, and reliability - [ ] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [ ] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable ## Image : <img width="3072" height="1728" alt="Screenshot from 2026-03-20 22-15-40" src="https://github.com/user-attachments/assets/9e849d4d-dad4-4fa0-b3b8-8e633f96c585" /> Release Notes: - Fixed `await` keyword not being highlighted as `keyword.control` in JavaScript, TypeScript, and TSX files --------- Co-authored-by: Kunall Banerjee <hey@kimchiii.space>
Om Chillure and Kunall Banerjee created
f9f1920
git: Split up compute snapshot to improve repository responsiveness (#51882)
## Context This should allow the UI to update faster with stateful git operations like branch changes, commits, etc. This will also allow Zed to recognized when a new project belongs to a branch sooner than before. ## Self-Review Checklist <!-- Check before requesting review: --> - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - git: Speed up UI responsiveness to branch/worktree changes
Anthony Eid created
adb3533
agent: Add Opencode Zen provider (#49589)
Before you mark this PR as ready for review, make sure that you have: - [x] Added a solid test coverage and/or screenshots from doing manual testing - [x] Done a self-review taking into account security and performance aspects - [x] Aligned any UI changes with the [UI checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) Per Opencode's website: > Zen gives you access to a curated set of AI models that OpenCode has tested and benchmarked specifically for coding agents. No need to worry about inconsistent performance and quality, use validated models that work. > - [x] Testing select models and consulting their teams > - [x] Working with providers to ensure they're delivered properly > - [x] Benchmarking all model-provider combinations we recommend There are so many models available, but only a few work well with coding agents. Most providers configure them differently with varying results. The models under the Zen umbrella typically have a more reliable token(s) per second speed with minimal outages. The opencode ecosystem has improved my workflow if not many others' ! Release Notes: - Added [Opencode Zen](https://opencode.ai/zen) to list of providers --------- Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com> Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de>
grim , Ben Brandt , and Bennet Bo Fenner created
b423194
acp_thread: Mark in progress plan items as pending (#52196)
## Context We were seeing some off by one errors because we weren't counting in progress as either pending or completed. Release Notes: - acp: Fix plan stats showing all tasks as done when items were still in progress.
Ben Brandt created
841ca10
agent_ui: Don't reset provisional title if we already have one (#52193)
## Context If you went back and edited the first message, we were resetting the provisional title, even though the title had previously already been set from a summarization pass. In order to achieve this, we moved the default thread title logic up the UI layer, and allowed AcpThreads to have an optional title. ## Self-Review Checklist <!-- Check before requesting review: --> - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - N/A --------- Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de>
Ben Brandt and Bennet Bo Fenner created
302aa85
MCP remote server OAuth authentication (#51768)
Closes #43162 Implements the OAuth 2.0 Authorization Code + PKCE authentication flow for remote MCP servers using Streamable HTTP transport, as specified by the [MCP auth specification](https://modelcontextprotocol.io/specification/2025-03-26/basic/authorization). Previously, connecting to a remote MCP server that required OAuth would silently fail with a timeout — the server's 401 response was never handled. Now, Zed detects the 401, performs OAuth discovery, and guides the user through browser-based authentication. Step-up authentication and pre-registered clients are not in scope for this PR, but will be done as follow-ups. ## Overview - **401 detection** — When the HTTP transport receives a 401 during server startup, it surfaces a typed `TransportError::AuthRequired` with parsed `WWW-Authenticate` header info. - **OAuth discovery** — Protected Resource Metadata (RFC 9728) and Authorization Server Metadata (RFC 8414) are fetched to locate the authorization and token endpoints. - **Client registration** — Zed first tries CIMD (Client ID Metadata Document) hosted at `zed.dev`. If the server doesn't support CIMD, falls back to Dynamic Client Registration (DCR). - **Browser flow** — A loopback HTTP callback server starts on a preferred fixed port (27523, listed in the CIMD), the user's browser opens to the authorization URL, and Zed waits for the callback with the authorization code. - **Token exchange & persistence** — The code is exchanged for access/refresh tokens using PKCE. The session is persisted in the system keychain so subsequent startups restore it without another browser flow. - **Automatic refresh** — The HTTP transport transparently refreshes expired tokens using the refresh token, and persists the updated session to the keychain. ## UI changes - Servers requiring auth show a warning indicator with an **"Authenticate"** button - During auth, a spinner and **"Waiting for authorization..."** message are shown - A **"Log Out"** option is available in the server settings menu for OAuth-authenticated servers - The configure server modal handles the auth flow inline when configuring a new server that needs authentication. Release Notes: - Added OAuth authentication support for remote MCP servers. Servers requiring OAuth now show an "Authenticate" button when they need you to log in. You will be redirected in your browser to the authorization server of the MCP server to go through the authorization flow. --------- Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
Tom Houlé and Danilo Leal created
968a13d
ep: Fix prompt formatting bug (#52187)
This bug was causing malformed `expected_output` for ~5% of v0316..v0318 examples Release Notes: - N/A
Oleksiy Syvokon created
f5e56b5
helix: Add support for line length in reflow command (#52152)
* Add `editor::RewrapOptions::line_length` to, optionally, override the line length used when rewrapping text. * Update `editor::Editor::rewrap_impl` to prefer `editor::RewrapOptions::line_length`, when set. * Add a `line_length` field to the `vim::rewrap::Rewrap` action. * Update the `:reflow` vim command with `vim::command::VimCommand::args` so as to be able to parse the provided argument as `usize`, ensuring that no effect is taken if the argument can't be parsed as such. Release Notes: - N/A
Dino created
71667cf
sidebar: Fix workspace and project leaking on window close (#52169)
Release Notes: - n/a
Lukas Wirth created
4466d10
agent_ui: Fix pasted image context showing Image instead of actual filename (#52082)
## What Fix image context mentions always showing the generic label `Image` instead of the actual filename when pasting from Finder or picking via the `+` → Image button in the Agent Panel. ## Why `insert_images_as_context` hardcoded the crease label to `MentionUri::PastedImage.name()` (`"Image"`) for every image, regardless of whether it originated from a named file. Both code paths that load images from file paths — `paste_images_as_context` and `add_images_from_picker` — discarded the filename before passing images to the shared insert function. ## Fix - `agent_ui/src/mention_set.rs`: Changed `insert_images_as_context` to accept `Vec<(gpui::Image, SharedString)>` instead of `Vec<gpui::Image>`, using the provided name as the crease label. In `paste_images_as_context`, extract `file_name()` from each path and pair it with the loaded image. Raw clipboard images (screenshots, copy from image editors) continue to use `"Image"` as there is no filename. - `agent_ui/src/message_editor.rs`: Same fix for `add_images_from_picker` — extract `file_name()` from each selected path and pass it alongside the image. Closes #52079 ## Test Plan - [x] `cargo build -p agent_ui` compiles clean - [x] `cargo fmt --all -- --check` format check - [x] Manual verification of: - [x] Copy an image file in Finder (`Cmd+C`), paste into Agent Panel — mention shows actual filename - [x] `+` → Image → pick a file — mention shows actual filename - [x] Screenshot paste (`Cmd+Shift+4`) still shows `Image` - [x] Regular text paste still works ## Screenshots <img width="638" height="569" alt="image" src="https://github.com/user-attachments/assets/859d852c-66f6-4faa-a5fe-59bd34cd3d85" /> --- Release Notes: - Fixed image context mentions always showing `Image` instead of the actual filename when pasting from Finder or using the image picker in the Agent Panel
Suphachai Phetthamrong created
cf4848d
agent_ui: Focus prompt editor when clicking start in git worktree (#52181)
Release Notes: - N/A
Bennet Bo Fenner created
70d1940
agent_ui: Remove duplicated function from agent panel (#52179)
Release Notes: - N/A
Bennet Bo Fenner created
6f2e4b0
ep: Store cumulative and average log-probabilities of predictions (#52177)
For now, the only source of logprobs is `./run.py infer`, which writes them to under the `.predictions` struct. `ep score` copies these values to `.score`. There is some duplication (same value stored in two places), which is unfortunate, but can't be fixed without reworking how scores are stored. Release Notes: - N/A
Oleksiy Syvokon created
4b1a2f3
search: Fix focus replacement field when opening replace (Ctrl+H) (#51061)
Previously, focus stayed on the search bar because a pre-focus check `handle.is_focused(window)` was always false at deploy time. Before you mark this PR as ready for review, make sure that you have: - [x] Added a solid test coverage and/or screenshots from doing manual testing - [x] Done a self-review taking into account security and performance aspects - [x] Aligned any UI changes with the [UI checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) Release Notes: - Fixed: When opening find-and-replace with `Ctrl+H`, the replacement input is now focused instead of the search bar.
Giorgi Merebashvili created
b1e8473
git_ui: Support side-by-side diff view in clipboard selection diff (#51966)
#### Context Switches `TextDiffView` from using `Editor` directly to `SplittableEditor`, enabling side-by-side diff view support for "Diff Clipboard with Selection". The diff view now respects the user's `diff_view_style` setting. Split out from #51457. This PR contains only the `SplittableEditor` wiring. The multibuffer coordinate fix for non-singleton editors will follow in a separate PR. Closes #50912 (partially) #### How to Review Small PR — all changes are in `crates/git_ui/src/text_diff_view.rs`. Focus on: - `new()`: `SplittableEditor::new` replaces `Editor::for_multibuffer`, editor-specific setup goes through `rhs_editor()` - Item trait delegation: `act_as_type`, `for_each_project_item`, `set_nav_history` updated for `SplittableEditor` - Tests: pinned `DiffViewStyle::Unified` and assertions go through `rhs_editor()` #### Self-Review Checklist - [x] I've reviewed my own diff for quality, security, and reliability - [ ] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable #### Video : [Screencast from 2026-03-19 23-11-36.webm](https://github.com/user-attachments/assets/c5a2381d-238d-43ef-ac6f-9994996c0c69) #### Release Notes: - Improved "Diff Clipboard with Selection" to support side-by-side diff view style.
Om Chillure created
b4bd3ff
ep: Add new prompt format (#52167)
This PR adds `v0318`, which is just like `v0316` but with bigger blocks. It seems to perform best so far. It also adds heuristics to avoid placing the marker token on closing braces, which results in much nicer blocks. Finally, it fixes a bug with inserting `<|marker_N|>` mid-line in `v0316` and `v0317`. Release Notes: - N/A
Oleksiy Syvokon created
8b822f9
Fix regression preventing new predictions from being previewed in subtle mode (#51887)
## Context
<!-- What does this PR do, and why? How is it expected to impact users?
Not just what changed, but what motivated it and why this approach.
Link to Linear issue (e.g., ENG-123) or GitHub issue (e.g., Closes #456)
if one exists — helps with traceability. -->
Fixes some issues with https://github.com/zed-industries/zed/pull/51842
Namely that the tests were scattered and not well organized (this PR
also makes them more thorough), and a regression where holding the
modifiers for the accept prediction keybind would not cause an incoming
prediction to be immediately previewed.
## How to Review
<!-- Help reviewers focus their attention:
- For small PRs: note what to focus on (e.g., "error handling in
foo.rs")
- For large PRs (>400 LOC): provide a guided tour — numbered list of
files/commits to read in order. (The `large-pr` label is applied
automatically.)
- See the review process guidelines for comment conventions -->
## Self-Review Checklist
<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- (Preview v0.229.x only) Fixed a regression where holding the modifiers
for the accept edit prediction keybind would not immediately preview
predictions as they arrived
Ben Kunkle created
fb1a98c
multi_workspace: Add actions to cycle workspace (#52156)
Cameron Mcloughlin created
42e7811
sidebar: Fix highlighting "new thread" element after cmd-n (#52105)
Danilo Leal created
87cf32a
agent: Set message editor language to markdown (#52113)
Cameron Mcloughlin created
e8d2627
Fix incorrect rainbow bracket matching in Markdown (#52107)
## Context Fixes #52022. Rainbow bracket matching could become incorrect when tree-sitter returned ambiguous bracket pairs for the same opening delimiter. The repair path rebuilt pairs using a shared stack across all bracket query patterns, which let excluded delimiters like Markdown single quotes interfere with parenthesis matching. This change scopes that repair logic to each bracket query pattern so ambiguous matches are rebuilt without mixing unrelated delimiter types. It also adds a regression test for the Markdown repro from the issue. <img width="104" height="137" alt="image" src="https://github.com/user-attachments/assets/4318bb4d-7072-4671-8fb5-c4478a179c07" /> <img width="104" height="137" alt="image" src="https://github.com/user-attachments/assets/07a8a0fc-7618-4edb-a14e-645358d8d307" /> ## How to Review Review `crates/language/src/buffer.rs` first, especially the fallback repair path for bogus tree-sitter bracket matches. Then review `crates/editor/src/bracket_colorization.rs`, which adds regression coverage for the issue repro. ## Self-Review Checklist <!-- Check before requesting review: --> - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - Fixed rainbow brackets in Markdown when quotes caused parentheses to match incorrectly
Kai Kozlov created
e126857
sidebar: Add another round of refinements (#52101)
- Change the branch button's tooltip to be more accurate given it displays more stuff than only branches - Hide the worktree dropdown menu when in a non-Git repo project - Improve provisioned title truncation - Remove the plus icon from the "view more" item to improve sidebar's overall feel - Remove the always visible "new thread" button but make it visible only when you're in an empty thread state - Add worktree icon in the thread item and tooltip with full path - Space out the worktree name from the branch name in the git picker in the title bar - Swap order of views in the git picker to "worktree | branches | stash" - Improve the "creating worktree" loading indicator --- <!-- Check before requesting review: --> - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - N/A
Danilo Leal created
4a965d1
Feat unbind (#52047)
## Context
This PR adds an `Unbind` action, as well as syntax sugar in the keymaps
for declaring it
```
{
"unbind": {
"tab: "editor::AcceptEditPrediction"
}
}
```
Is equivalent to
```
{
"bindings": {
"tab: ["zed::Unbind", "editor::AcceptEditPrediction"]
}
}
```
In the keymap, unbind is always parsed first, so that you can unbind and
rebind something in the same block.
The semantics of `Unbind` differ from `NoAction` in that `NoAction` is
treated _as an action_, `Unbind` is treated as a filter. In practice
this means that when resolving bindings, we stop searching when we hit a
`NoAction` (because we found a matching binding), but we keep looking
when we hit an `Unbind` and filter out keystroke:action pairs that match
previous unbindings. In essence `Unbind` is only an action so that it
fits cleanly in the existing logic. It is really just a storage of
deleted bindings.
The plan is to rework the edit predictions key bindings on top of this,
as well as use `Unbind` rather than `NoAction` in the keymap UI. Both
will be done in follow up PRs.
Additionally, in this initial implementation unbound actions are matched
by name only. The assumption is that actions with arguments are bound to
different keys in general. However, the current syntax allows providing
arguments to the unbound actions. Both so that copy-paste works, and so
that in the future if this functionality is added, keymaps will not
break.
## How to Review
- The dispatch logic in GPUI
- The parsing logic in `keymap_file.rs`
## Self-Review Checklist
<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- Added support for unbinding key bindings from the default keymaps. You
can now remove default bindings you don't want, without having to
re-declare default bindings that use the same keys. For instance, to
unbind `tab` from `editor::AcceptEditPrediction`, you can put the
following in your `keymap.json`
```
[
{
"context": "Editor && edit_prediction",
"unbind": {
"tab": "editor::AcceptEditPrediction"
}
}
]
```
Ben Kunkle created
0f1e8a6
agent: Fix summarization model being cleared by unrelated registry events (#52080)
## Context We were seeing lots of pending title generation, which should only happen if we don't have a summarization model. `handle_models_updated_event` unconditionally overwrote the thread's summarization model on every registry event, even with `None`. We should only setting if explicitly changed by the user or we haven't set it yet, and only if we actually have one. It is hard to reproduce this issue.. but I don't think this code was right in the first place anyway. ## Self-Review Checklist - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - N/A
Ben Brandt created
aabc967
Swap arrayvec crate for heapless to use LenT optimization (#47101)
Swaps the `arrayvec` dependency for `heapless`, as the `heapless` library allows changing the type used for the `len` field, which `arrayvec` hard-codes to `usize`. This means that, for all the `ArrayVec`s in Zed, we can save 7 bytes on 64 bit platforms by just storing the length as a `u8`. I have not benchmarked this change locally, as I don't know what benchmarking tools are in this project. As a small bit of context, I wrote the PR to `heapless` to add this `LenT` generic after seeing a PR on the `arrayvec` crate that seems to be dead now. Once I saw some of Zed's blog posts about the `rope` crate and noticed the usage of `arrayvec`, I thought this might be a welcome change. Release Notes: - N/A --------- Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
Gnome! and Piotr Osiewicz created
abec0ef
ci: Run clippy for x86_64-apple-darwin target (#52036)
Release Notes: - N/A --------- Co-authored-by: Finn Evers <finn@zed.dev> Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
Cole Miller , Finn Evers , and Jakub Konka created
d663dbb
gpui_macos: Fix x86_64 build error in Submenu (#52059)
Missed in #52028. Release Notes: - N/A
Tree Xie created
17e4b49
livekit_client: Screensharing on Niri + NixOS (#52017)
Release Notes: - Fixed a weird niche interaction between niri and nixos that broke screensharing --------- Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
Cameron Mcloughlin and Jakub Konka created
b99200f
agent: Add update_plan tool (#52048)
## Context Adds a tool to utilize the UI we already expose to ACP agents. Behind a feature flag for now. ## How to Review Mostly a tool to hook up to all of the plan plumbing we already have in acp thread. ## Self-Review Checklist - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - N/A
Ben Brandt created
268f1d2
Ensure that sidebar toggle button works, regardless of focus (#52045)
Previously, the sidebar toggle worked via an action, which is dependent on what is focused. I changed it to directly call a method. Release Notes: - N/A
Max Brunsfeld created