4eda1fa
agent: Guard against agent producing stringified arrays in edit tool
Lukas Wirth created
4eda1fa
agent: Guard against agent producing stringified arrays in edit tool
Lukas Wirth created
062ae00
Support unbind in keymap (#52225)
## Context
This PR builds on https://github.com/zed-industries/zed/pull/52047,
adding support for the new behavior to the keymap editor. The primary
change is replacing usages of `NoAction` with `Unbind` when updating the
users keymap, i.e. deleting/editing default bindings.
This PR does not completely solve the UI challenge of `Unbind`. For now,
we just don't show Unbind entries in the UI, and mark unbound
keybindings as unbound (shown in screenshot).
<img width="3854" height="2230" alt="Screenshot 2026-03-23 at 11 49
42 AM"
src="https://github.com/user-attachments/assets/843856c6-2c94-47c1-be44-21becfdf467e"
/>
## How to Review
- Check behavior changes in keymap updates
- Check UI changes and filters in keymap editor
<!-- 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 or Added/Fixed/Improved ...
Ben Kunkle created
cae8d3e
settings_ui: Fix open settings keybind always taking precedence (#52277)
Solves an issue introduced by https://github.com/zed-industries/zed/pull/49527 until we land https://github.com/zed-industries/zed/pull/52275. No release notes since this is only on Nightly. Release Notes: - N/A
Finn Evers created
6d3ebd4
Upgrade tree-sitter-rust, de-list bsn (#52251)
## Context Recently, we put bsn in the list of "macros to not reparse as rust" (#51353). We have since updated tree-sitter-rust to better handle the `@"string"`, `:"string"`, etc cases, and can un-list bsn from the special casing. on main, the highlighting currently looks like this for `bsn` and for `not` (represents "other macros"). Note the `:"player.bsn"` string is re-parsed as rust tokens. <img width="1728" height="1084" alt="Screenshot 2026-03-23 at 9 33 35 AM" src="https://github.com/user-attachments/assets/94ea5a6d-228b-44dd-857b-c41edcbd9af0" /> This pr, plus the tree-sitter-rust updates results in better handling by default. <img width="1728" height="1084" alt="Screenshot 2026-03-23 at 11 38 47 AM" src="https://github.com/user-attachments/assets/fb6f71e3-7bcf-4c06-8e84-ce0823010b2e" /> Release Notes: - N/A
Chris Biscardi created
cc56071
Fix thread's worktree being discarded upon archiving the previous thread in the sidebar (#52271)
This PR fixes a bug where archiving a thread could cause the *next* thread to be opened in the current workspace, even though it belonged to a different worktree. Release Notes: - N/A
Max Brunsfeld created
28687ff
audio: Remove rodio audio backend (#51945)
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com> We've decided to remove rodio backend for audio as we didn't have time to get it to a nice spot. I personally believe we should eventually re-land it (the composable pipelines are quite nice!), but given that we need audio to work, this seems like the best way forward. We won't have to worry about all the ways in which the legacy pipeline interoped with rodio's. ## 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: - audio: Experimental rodio audio backend has been removed. --------- Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com> Co-authored-by: Yara <git@yara.blue>
Piotr Osiewicz , Smit Barmase , and Yara created
3225e53
agent_ui: Don't reset cursor position when editing queued messages (#52210)
## Context When typing on the read-only queued message editor, we push the content to the main, editable message editor. However, the cursor position was being reset when that happened. This PR fixes that by tracking the cursor offset when doing that, also accounting for the case where there could be pre-existing content in the message editor. ## How to Review - Queue a message in the agent panel - Place your cursor somewhere in the middle of your queued message and type something - See how the cursor position is preserved once it goes down to the main message editor ## 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: - Agent: Fix cursor position being reset when editing queued messages.
Danilo Leal created
ae6a9c5
agent_ui: Fix full screen behavior on worktree creation (#52269)
## Context This PR removes the behavior in which we turn the agent panel full screen on worktree creation, even if there aren't any files open. Changing the width behavior of the panel will ultimately solve this, and auto-full screening it turned out to be surprising. Also, in reaction to this, I've added an icon button in the agent panel's toolbar when in full screen so it's easier to get out of it. Eventually though, we can probably remove it (also because of the flexible width work). ## How to Review - Create a new worktree from a thread and see the panel with the same width - See the "disable full screen" icon button in the toolbar when you full screen it --- - [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
d30652f
sidebar: Adjust the sidebar UI slightly (#52228)
This PR: - Moves the "remove workspace" option into the context menu, so that it's not swapping places with the + button in some circumstances. This matches codexs behavior. Another solution to the problem could be having the add button remain even when the "new thread" option exists. - Adds a "go to workspace" button to the header ## 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: Danilo Leal <daniloleal09@gmail.com>
Mikayla Maki and Danilo Leal created
0b9aeaf
Make close sidebar button work regardless of focus state (#52260)
Like https://github.com/zed-industries/zed/pull/52045, but for the *close* button. Release Notes: - N/A
Max Brunsfeld created
78df135
Change the default panel layout (#52232)
This PR adjusts the default panel layout for anyone on the agent v2 feature flag. Note that this changes the right status bar items to show in reverse priority order, and then adjusts priorities so that the "project management" buttons appear to the right, and the outline panel appears to the far left. The reversal "cancels out" most of the priority changes, except the outline panel and the collab panel. ## 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: - Swapped the order of the collab and outline status bar buttons
Mikayla Maki 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