## Summary
This PR fixes horizontal jumping of the IME candidate window during text
composition.
On the shared `selected_bounds` path used by Windows, the candidate
window no longer follows the preedit caret character-by-character.
Instead, it anchors to the start of the current visual line, which keeps
the candidate window stable while typing.
Linux Wayland uses a different IME positioning path, so it was not
affected by the original implementation in this PR. This PR now also
includes a Wayland-specific adjustment so that Wayland uses the same
visual-line anchoring behavior.
## Changes
1. **Shared / Windows path**
Updated `selected_bounds` in `crates/gpui/src/platform.rs` to use a
visual-line-aware anchor for preedit text.
This removes the distracting horizontal movement of the candidate window
while typing and keeps the anchor aligned with the active visual line.
2. **Linux Wayland path**
Updated the Wayland IME area calculation in
`crates/gpui_linux/src/linux/wayland/window.rs` to use the same
visual-line-start anchoring strategy for preedit text.
This brings Linux Wayland in line with the Windows behavior while
preserving Wayland's platform-specific IME handling.
## Notes
I had previously tried a separate Wayland-specific fix in
5d0c96872b, but later reverted it in
8cfe7a2a54441f89c170fbdd165a49b3e787b3c4 because the behavior was not
good enough and it regressed the original positioning behavior.
The current Wayland implementation is a new, simpler approach that keeps
the original behavior intact while also removing horizontal
candidate-window jumping.
## Visuals
### Windows / shared path
* **Before the fix:** (The candidate box moves along with the preedit
text, which is distracting)
<img width="918" height="675" alt="before"
src="https://github.com/user-attachments/assets/29cb05e4-3e99-4b54-9ce3-78710b307ce6"
/>
<img width="478" height="682" alt="before_1"
src="https://github.com/user-attachments/assets/cff38b65-96dd-4ed7-b06b-7fbcd448fab9"
/>
* **After the fix:** (Candidate box stays fixed at the line start during
typing, correctly jumps to new lines or follows active segments)
<img width="918" height="675" alt="after"
src="https://github.com/user-attachments/assets/4f50a710-dc0d-4959-a313-1184122ab759"
/>
<img width="478" height="683" alt="after_1"
src="https://github.com/user-attachments/assets/8e9df121-ffcc-45ad-ba0b-f1ad3cef87bc"
/>
### Linux Wayland
* **Before / previous behavior**
<img width="552" height="796" alt="before"
src="https://github.com/user-attachments/assets/e3e84312-c626-41cb-945f-66c13aa96df6"
/>
* **After / current implementation**
<img width="546" height="772" alt="after"
src="https://github.com/user-attachments/assets/a01ab6d7-a3b6-4d56-a1cb-b2b112b6b914"
/>
---
## 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
* [x] Tests cover the new/changed behavior (manual verification only)
* [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
This crash occurred because metion crease were using raw text ranges
that were precomputed before calling editor.edit(), and didn't take into
account that editor normalizes text inserted
The fix is normalizing the text first, then using the normalize text
range for the crease
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:
- Fix a crash that could occur when adding a crease to the agent panel
Closes [#58343](<https://github.com/zed-industries/zed/issues/58343>)
This crash happened because Helix paste restored selection using the raw
clipboard text length, but buffer edits normalize CRLF line endings to
LF before inserting. When pasting CRLF text at or near EOF, the restored
selection could extend past the normalized snapshot length and panic in
`MutableSelectionsCollection::select_ranges`. The fix normalizes the
text before measuring it for selection restoration and adds regression
coverage for CRLF paste in Helix mode.
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:
- Fixed a crash that could occur when pasting at the end of a file in
Helix mode
## Context
When the "Switch branch" picker is opened from the git commit modal and
the user presses Enter, a `\n` character was inserted into the input
instead of confirming the branch selection.
The `"GitCommit > Editor"` keymap context bound `enter` to
`editor::Newline`. This context matches *any* `Editor` descended from
`GitCommit` in the element tree, including the single-line search editor
inside the branch picker popover. Because a context-path binding is more
specific than the global `enter: menu::Confirm` binding, it took
precedence and the picker never received the confirm action.
The commit message editor uses `EditorMode::AutoHeight` (reported in key
context as `mode == auto_height`); the picker's search editor uses
`EditorMode::SingleLine`. Narrowing the context to `"GitCommit > Editor
&& mode == auto_height"` restricts the `editor::Newline` binding to the
commit message editor only. Single-line editors inside the same modal
now fall through to the global `enter: menu::Confirm`, which correctly
confirms the selection.
Closes#58022
## How to Review
Three identical one-line changes, one per platform keymap
(`default-linux.json`, `default-macos.json`, `default-windows.json`):
- `"GitCommit > Editor"` → `"GitCommit > Editor && mode == auto_height"`
Video of manual test after fix :
[Screencast from 2026-06-02
23-16-32.webm](https://github.com/user-attachments/assets/67652cc5-4f8d-42f4-a5a9-ade3499ee880)
## 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
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- Fixed Enter key inserting a newline instead of selecting a branch in
the commit modal branch picker
The regression introduced in #53453 where selecting a remote branch from
the branch picker checked out the remote tracking ref directly, leaving
the repository in detached HEAD state. Instead of creating a local
branch that set the remote branch as it's upstream.
The fix was reverting the old checks we did before #53452 was merged to
figure out if the branch was valid, remote only, local, or local without
the upstream set. Depending on the type of reference it is Zed will
check it out, or create/set the branch with remote tracking to its
upstream branch.
I also added a regression test to prevent this from happening again in
the future
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
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
Closes https://github.com/zed-industries/zed/issues/58153
Release Notes:
- Agent: Fixed image previews not being displayed after submitting a
prompt and then hovering the mentioned image.
Closes AI-354
The "Panel Layout" submenu available in the user menu exposed two quick
menu items to switch between the classic and agentic workspace layout.
These will now also be available as actions, reachable through the
command palette.
<img width="600" alt="Screenshot 2026-06-01 at 8 28@2x"
src="https://github.com/user-attachments/assets/c468b958-9588-4646-a689-6e661a8f6e5a"
/>
Release Notes:
- Exposed actions to switch between the classic and agentic workspace
layout in the command palette.
Holding the go-to-definition modifier (`cmd`/`ctrl`) and moving the
mouse re-issued a `textDocument/definition` request on every mouse-move
event for the same cursor position, because the request deduplication
guard had gone stale, namely:
* `HoveredLinkState::last_trigger_point` was only set when the state was
first created, so the guard for the checking the same position stopped
matching after the first request. It's now refreshed whenever a
definition request is issued, so keeping the mouse on a symbol queries
once instead of on every move. This matters for servers that return a
bare `Location` without an `originSelectionRange` (e.g. phpactor), where
the other guard (`symbol_range`) stays empty and deduplication relies
entirely on `last_trigger_point`.
* The `HoverState::triggered_from` field was dead code, as it was never
written to, so these changes also remove it. The hover-popover path is
already throttled by its show delay, so each mouse move cancels the
pending request before it is sent, with no extra guard needed.
Closes#56193
Release Notes:
- Fixed go to definition repeatedly querying the language server for the
same cursor position
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: dino <dinojoaocosta@gmail.com>
## **NOTE:**
I'm new both to Rust and Zed, so it's mostly vibecoded alleged fix for
#57295, just as a PoC of expected behavior that works on macOS. So
please be critical and skeptical of the code, as it may not account for
many nuances and behavior on other platforms.
## Summary
- Fixes#57295: the `Add to Agent Thread` action (or `cmd->`) was a
silent
no-op when a terminal thread was the active conversation in the agent
panel.
- The action's deferred handler only routed through
`active_conversation_view()`,
which returns `None` for `BaseView::Terminal`, so the selection was
dropped.
- Extends the handler with an `else if` branch that, when a terminal
thread is
active, formats the selection as `@<rel-path>:<start>-<end>` (matching
the
mention syntax CLI agents already understand) and pastes it into the
terminal, then focuses the terminal so the user can edit/submit.
## Test plan
- [x] Select a range of lines in a buffer, open a terminal thread in the
agent
panel, invoke `Add to Agent Thread` from the context menu → the
formatted
mention is pasted into the terminal.
- [x] Same flow via the `cmd->` keybinding on macOS.
- [x] Multiple selections in one buffer produce space-separated
mentions.
- [x] `cargo check -p agent_ui` and `./script/clippy -p agent_ui` pass.
## Demo
<img width="2928" height="1920" alt="ScreenShot 2026-05-20 at 21 03 27"
src="https://github.com/user-attachments/assets/dc29f380-a864-4c12-b454-bdb4201f5b8d"
/>
https://github.com/user-attachments/assets/9d3914d8-8ba2-4bcb-be43-78efb342d8a8
## Release Notes:
- Fixed `Add to Agent Thread` being a no-op when a terminal thread is
the active conversation in the agent panel
---------
Co-authored-by: Martin Ye <martin@zed.dev>
Updates the sandbox authorization prompt for terminal write-path
requests to show a compact, collapsible list of the requested paths. The
list now matches the edited-files disclosure style, sorts paths for
stable scanning, and uses existing file icons plus muted parent
directories so users can quickly see which locations the command wants
to write to.
This is a UI-only change; sandbox permission behavior remains unchanged.
Release Notes:
- Improved agent sandbox permission prompts by showing requested write
paths in a clearer file list
---------
Co-authored-by: Martin Ye <martin@zed.dev>
Follow up to https://github.com/zed-industries/zed/pull/58274 — this PR
limits the height of the commit description in the header so that it
doesn't grow indefinitely pushing the diff multibuffer out of view.
Release Notes:
- N/A
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [ ] ~~Unsafe blocks (if any) have justifying comments~~ (N/A)
- [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
Corrects the value used for traffic light clearance/padding when
building with the macOS 26 SDK (or later). This was originally fixed in
#45351 but regressed in #48800 where `TRAFFIC_LIGHT_PADDING` was moved
to `ui/src/utils/constants.rs` but the local `build.rs` in `title_bar`
did not apply to the `ui` crate.
Release Notes:
- N/A
cc @Anthony-Eid
## Why
This is the first step in moving the Git Graph work into the Git UI
crate before continuing with follow-up refactors and feature work. The
goal is for Git UI components and shared Git UI helpers to live in one
crate, so future changes to the Git Graph can reuse existing `git_ui`
code instead of duplicating it.
This PR is not only a filesystem move. While moving `git_graph` into
`git_ui`, a few small dependency and helper boundaries had to change:
- `git_graph` and `git_ui` both needed the same remote parsing and
commit tooltip construction behavior, so those pieces are now shared
from `git_ui`.
- `git_graph` previously depended on `project_panel` to resolve
file-history actions from the project panel selection. After moving
`git_graph` into `git_ui`, keeping that dependency would create an
undesirable `git_ui` -> `project_panel` relationship. The
project-panel-specific action forwarding now lives in `project_panel`,
and calls into exported `git_ui::git_graph` helpers instead.
- `git_graph` initialization now happens through `git_ui::init`, so
downstream crates only need to initialize `git_ui`.
This prepares the codebase for the next planned PRs: splitting the large
`git_graph.rs` implementation into smaller pieces, then adding Git Graph
features such as keeping the main branch lane at index `0`.
## License removal
The removed `crates/git_graph/LICENSE-GPL` file was a symlink to the
repository root `LICENSE-GPL`. The moved code is now inside `git_ui`,
which is also licensed as `GPL-3.0-or-later` and has its own
`LICENSE-GPL` symlink to the same root license file. The code did not
move to a differently licensed crate; it remains covered by the same GPL
license.
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
---------
Co-authored-by: Anthony Eid <anthony@zed.dev>
So, I am building the "GPUI re-render devtools" in [this
branch](https://github.com/zed-industries/zed/pull/55825)
And while running the new devtools I found a few low-risk
over-invalidation sources and included the easy fixes here:
- Avoid notifying for sticky headers when the computed sticky header
result has not changed.
- Avoid repeated `cx.notify()` calls while overscrolling at the top of
the editor when the scroll position is clamped.
- Give `Button::loading` a keyed animation id so repeat animation frame
requests can be attributed to the concrete loading button instance.
The attached video shows the workflow I used to find these with the new
devtools.
https://github.com/user-attachments/assets/852c64a9-ae91-4878-bbf8-21cc23763c42
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)
- [ ] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
Follow-up hardening on top of #57972 (granular sandbox write
permissions), based on a review of that branch. The most important fix
is that model-requested `fs_write_paths` were joined but never
normalized, so a path containing `..` could pass the lexical
subtree-containment checks while seatbelt canonicalized it to somewhere
else entirely — causing skipped approval prompts and silent runtime
write denials. Write paths are now lexically normalized (via
`util::paths::normalize_lexically`) at the point they enter the system,
both for model requests and for hand-edited persistent grants, so the
containment check, the approval prompt, and the enforced sandbox policy
all operate on the same path.
The subtree insert/prune and containment logic had drifted into roughly
five near-identical copies across `agent`, `agent_settings`, and
`settings_content`; these now share `util::paths::insert_subtree` and
`path_within_subtree`. The dead `SandboxPermissions::covers` (only ever
exercised by its own tests, duplicating the production
`covers_with_persistent`) is removed, and its tests rewritten to cover
the real settings-compilation path including `..` normalization.
The remaining changes reduce brittleness: the sandbox permission option
ids (`allow`, `allow_thread`, `allow_always`, `deny`) are now shared
constants in `acp_thread` instead of bare string literals scattered
across the agent and UI, `persist_sandbox_always_permission` logs
instead of silently doing nothing when no filesystem is available, and a
comment documents why replay always resolves the terminal tool to the
non-sandboxed variant.
Release Notes:
- N/A
---------
Co-authored-by: Martin Ye <martin@zed.dev>
Co-authored-by: MartinYe1234 <52641447+MartinYe1234@users.noreply.github.com>
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
Hello Zed Team, this is my first contribution. I use Zed every day and
have always wanted to see the total for the plus/minus counts in the Git
diff panel. Here is my attempt to make that happen. Please let me know
if there are any issues and I will fix them. Thank you.
Adds git diff stats to the Git panel so users can see the total number
of added and removed lines while reviewing changes.
Verified locally by compiling and running Zed, then confirming the Git
panel displays the diff count as expected.
Release Notes:
- Improved Git panel diff visibility by showing total added and removed
line counts.
<img width="1540" height="1098" alt="zed-add-git-diff-plus-minus-count"
src="https://github.com/user-attachments/assets/5051944e-7cf5-4bb0-81d3-10228e619690"
/>
Use `std::path::absolute` instead of `RealFs::canonicalize` to make the
path absolute in `RealFs::trash` as `canonicalize` also resolves
symlinks, so trashing a symlink moved its target to the trash and left
the link dangling.
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
- Not applicable as we don't have a good infrastructure for testing
`RealFs` changes without hitting the machine's actual filesystem and
testing this on `FakeFs` implementation wouldn't prevent a future
regression, unfortunately.
- [x] Performance impact has been considered and is acceptable
Closes#54900
Release Notes:
- Fixed trashing of symlinks in project panel to actually trash the link
and not its target.
Why: denoise was used on the "new" removed audio pipeline. While we will
(hopefully) reintroduce that later it is currently dead code! Worse dead
code causing issues as the denoise crate breaks compilation on old arm
targets.
denoise (through candle-core) eventually depends on gemm which does not
compile on older arm targets. This is a known issue in gemm (see
sarah-quinones/gemm#31).
Hopefully this will be addressed in gemm before we re-land denoise/new
audio. If it is not we can always compile denoise only for supported
platforms.
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
Closes#57770
Release Notes:
- Fixed Zed not compiling on pre ARMv8.2-A machines
Brings stable logout and additional directories support as well as
removing dep on rmcp + tokio
This also removed the unstable model selector (replaced awhile ago by
session config options) so it removes all of that code.
Native agent still uses it because we have a special model selector that
would need more work to rip out
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
This debug assert was actually invalid, and panicked in debug builds on
valid diagrams. We start building a node only when we find a
`translate()` that we need to fix up, but unconditionally call
`finish_node`. But since `finish_node` does `if let Some(...) =
self.building.take()`, it's a no-op if there is no node being built, so
it's safe to call.
Renamed to `maybe_finish_node` to communicate this fact
Release Notes:
- N/A or Added/Fixed/Improved ...
Closes#58305
OpenAI sunset GPT-5.2 and GPT-5.3-Codex in Codex for ChatGPT account
logins on June 2nd, so sending to them via the ChatGPT Subscription
provider now fails with error. This PR removes those models from ChatGPT
Subscription model list.
Release Notes:
- Removed the retired GPT-5.2 and GPT-5.3 Codex models from the ChatGPT
Subscription provider.
Sets up infra for fixing #46881. Follow-up to the approach discussed in
#36802 (comment).
The initial problem: Go table tests weren't being detected reliably in
larger files. The old approach created one tree-sitter match per table
row, which hit the cursor match limit (64) and caused rows to be
silently dropped.
The suggested fix was to use query repetition to capture all rows in a
single match, then post-process in Rust.
But this hit another problem: some captured rows aren't valid runnables
(e.g., when a struct has multiple string fields and the query can't tell
which one is the test name). Tree-sitter predicates can't validate
subsets of captures within a match, that logic needs to happen in Rust.
This PR adds a `RunnableResolver` trait that lets languages post-process
multi-capture matches. When a query uses `@_run_item` to mark item
boundaries, we split the captures into per-item groups and pass them to
the resolver. The resolver can then:
- Pick which `@run` to use: e.g., compare field names against
`t.Run(tc.name, ...)` to find the right string field.
- Return per-item extras: only the captures that correspond to the
chosen `@run`.
Release Notes:
- N/A
## Context
When a file is opened outside any project, Zed creates a single-file
worktree for it where the file's relative path is `""` (the worktree
root IS the file). Typing to filter in the file picker (Ctrl-P) caused a
crash: `Error: opening project path
"/home/user/foo.txt/foo.txt"`.
Two bugs combined to produce this:
1. **History lookup mismatch** : `fuzzy_nucleo` detects `root_is_file =
true` for single-file worktrees and moves the worktree root name into
`path_match.path` (so `"" → "foo.txt"`). `matching_history_items` stored
the entry under key `""`but looked it up by `"foo.txt"` → miss → item
dropped from history matches.
2. **Search confirm duplication** : because the history match was
dropped, the file appeared as `Match::Search` with `path_match.path =
"foo.txt"`. Confirming the constructed `ProjectPath { path: "foo.txt" }`
inside a worktree rooted at `/home/user/foo.txt` → resolved to
`/home/user/foo.txt/foo.txt`.
Fix 1 adds a fallback empty-path lookup in `matching_history_items` so
single-file worktree entries are found correctly and deduplication
suppresses the search duplicate. Fix 2 is defense-in-depth: if a
single-file worktree file ever reaches
the `Match::Search` confirm handler, it detects `is_single_file()` and
uses an empty path instead.
**Edit :**
After further work, two additional edge cases were fixed:
- `Match::Search` split-open handling now uses the same single-file
worktree path normalization as normal confirm. This prevents
split-opening a single-file worktree search result from resolving
`notes.txt` inside `/path/to/notes.txt` as
`/path/to/notes.txt/notes.txt`.
- History matching now still includes root names for single-file
worktrees when `project_panel.hide_root = true`. Normal folder worktree
roots remain hidden in this mode, but single-file worktrees need their
root name included because the root name is the filename users type into
the picker.
Additional test coverage:
- Added `test_non_project_file_matches_history_with_hidden_root` for the
`hide_root=true` history matching edge case.
- Added `test_single_file_search_result_split_open` for split-opening a
single-file worktree search result.
Closes#54934
Manual test after fix below :
[Screencast from 2026-04-26
23-58-00.webm](https://github.com/user-attachments/assets/3de564d8-cc94-4624-98e3-54dd124bfa2f)
## How to Review
- `crates/file_finder/src/file_finder.rs` : Two targeted changes:
- `matching_history_items` (~line 757): added `.or_else` fallback that
retries the candidates lookup with an empty path when the first lookup
misses, covering the `root_is_file` key mismatch for single-file
worktrees.
- `Match::Search` confirm handler (~line 1640): checks
`wt.read(cx).is_single_file()` and substitutes `RelPath::empty()` for
`path_match.path` to prevent duplication.
- `crates/file_finder/src/file_finder_tests.rs` — Two test changes:
- New test `test_non_project_file_open_with_filter`: opens a file
outside the project, filters for it by name, confirms, and asserts the
correct path is opened.
- Updated `test_search_results_refreshed_on_standalone_file_creation`:
the fix correctly promotes single-file worktree files to
`Match::History`, which activates `skip_focus_for_active_in_search` when
the file is currently open. The test now asserts the match type directly
and closes the picker with `menu::Cancel` instead of confirming.
## 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
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- Fixed file picker failing to open non-project files when a filter is
typed
Add a `custom_headers` setting to each HTTP-based language model
provider
(Anthropic, Bedrock, DeepSeek, Google, LM Studio, Mistral, Ollama,
OpenAI,
OpenAI-compatible, OpenCode, OpenRouter, Vercel AI Gateway, and xAI) so
users
can attach extra headers to every outgoing request. Headers managed by
Zed
(authentication, content-type, etc.) cannot be overridden and are
skipped with
a warning.
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)
- [] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- Added support for configuring custom HTTP headers on language model
providers via `language_models.<provider>.custom_headers`.
Signed-off-by: Aurabindo Pillai <mail@aurabindo.in>
Closes FR-49
This PR fixes stack overflow in flowcharts with deeply nested subgraphs.
Rewrote recursive call to iterate with an explicit stack on heap. Added
test which reproduces the overflow.
We use our fork now, with patch on existing v0.4.0:
https://github.com/zed-industries/merman/commit/1c765dcca2ef5092fcde7bebe8374819563623ef
Release Notes:
- Fixed a crash in when rendering Mermaid diagram flowcharts with deeply
nested subgraphs.
Closes AI-351
This PR builds on top of
https://github.com/zed-industries/zed/pull/57692 by improving the draft
threads UX in the context of worktrees. If you have more than one
worktree loaded for a given group, clicking on the plus button will now
display a menu allowing you to choose for which worktree you'd like to
open a new thread in. This felt particularly relevant in the case of
discarding a draft within a worktree when that was the only thread item
for that worktree, making it hard to come back to it.
Added some extra stuff in here as well with regards to better draft
management. Most notably, if you created a new thread and then typed
something, this draft thread would show a timestamp that's relative to
the creation time of the thread. However, if you moments later deleted
the draft content and then typed something up again, the timestamp would
be stuck in the creation time. That felt wrong because by erasing the
content you effectively reset the draft. So, this branch makes it so, in
this context, the timestamp would be reset to now.
Release Notes:
- Agents: Added improvements for the draft thread UX particularly in the
context of worktrees, allowing to choose for which worktree to open a
thread in when the group contains more than one.
We have a lot of long blocking tasks on both the foreground and
background, this is a start of getting some insight into those.
We will now log tasks running longer then 100ms on the foreground or
background. Hanging actions will also be logged including their name. We
simultaneously collect statistics on task and action performance and
send those to telemetry. This includes quantiles and averages for each
hanging task.
Finally this adds tree dev actions:
- hang action
- hang foreground
- hang background
These cause a hang to check if hang reporting is working and in the
future telemetry.
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
Closes #ISSUE
Release Notes:
- Added logging and telemetry of tasks and actions with performance
issues
This updates docs to reflect changes threshold billing behavior for
individual Zed Pro subscriptions.
- Scope threshold billing language explicitly to individual Zed Pro
subscriptions.
- Remove stale language saying each $10 threshold crossing resets the
threshold to $0.
- Document that threshold invoices start at $10, may rise in $10
increments up to $100, and are not automatically lowered during the same
subscription.
- Split spend-limit docs between Zed Pro and Zed Business, with Business
readers linked to organization billing.
Release Notes:
- N/A
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
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
Closes#56602.
Creating a branch from the branch picker normalizes the typed name with
`replace(' ', "-")`, so leading or trailing spaces became leading or
trailing hyphens (e.g. ` fix-leak ` -> `-fix-leak-`). git rejects such
names, so branch creation failed.
Trimming the query before replacing spaces yields a valid name.
Release Notes:
- git_ui: Fixed branch creation failing when a branch name had leading
or trailing whitespace
---------
Co-authored-by: dino <dinojoaocosta@gmail.com>
Updates the agent server extension documentation to account for the ACP
server extension deprecation.
Release Notes:
- N/A
---------
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
Closes ZED-8SQ
This PR uses the same pattern for `can_select` as other delegates and
also guards `can_select` call in `Picker::render_element` which was
regressed in #50705.
Release Notes:
- Fixed a crash that could occur when searching or configuring tools in
agent profile settings.
## Summary
- Remove the `git2` crate and its C dependencies (`libgit2-sys`,
`libz-sys`), replacing all remaining usage with the git CLI and other
previously used rust crates
- Replace `git2::Patch` in `buffer_diff` with `imara-diff` (used
elsewhere in the codebase for word diffing)
- Replace `git2::Oid` with `[u8; 20]` and the `hex` crate
- Replace `git2::Repository` in `RealGitRepository` with stored paths
and git CLI calls via the existing `GitBinary`
- Fixes a bug where linked worktree git dir events could cause the
repository entry to be dropped
### Motivation
libgit2 does not support the
[reftable](https://github.blog/2024-04-29-highlights-from-git-2-45/#preliminary-reftable-support)
storage format that was introduced in git 2.45 (see
[libgit2#7117](https://github.com/libgit2/libgit2/pull/7117)), meaning
that git operations in the app using these (like git status, branch
names, diffs, e.g.) appeared broken for any repository using
`--ref-format=reftable`. [Git 3 will use reftables by
default](https://www.deployhq.com/blog/git-3-0-on-the-horizon-what-git-users-need-to-know-about-the-next-major-release),
so this needs to be supported eventually.
Most operations used the git binary already, but there were still a
handfull of stragglers using libgit2. By swapping out the remaining
uses, we can remove the dependancy of libgit2 and eliminate ~30k lines
of vendored C and the associated build complexity (cmake, libz,
pkg-config), as well as ensure that all git operations go through
similar codepaths.
Closes#46747
Closes https://github.com/zed-industries/zed/discussions/45702
fixes ZED-76X
fixes ZED-73N
### Notes
- `reload_index` is removed from the `GitRepository` trait since both
implementations were no-ops (the CLI always reads from disk)
- `change_branch` is simplified to `git checkout <name>`, which natively
handles local/remote branch resolution
- `load_index_text` and `load_committed_text` no longer explicitly
filter symlinks (the old code returned `None` for symlinked entries)
## Test plan
- [x] `cargo test -p git` (34 tests)
- [x] `cargo test -p buffer_diff` (14 tests)
- [x] `cargo test -p worktree --
test_linked_worktree_git_dir_events_do_not_panic`
- [x] `cargo test -p util` (108 tests)
- [x] `cargo test -p project -- test_file_status
test_repository_subfolder_git_status test_update_gitignore`
- [ ] Manual testing of diff gutter, staging, branch switching, remote
operations
- [ ] Manual testing with a reftable repository
Release Notes:
- Fixed git integration not working with repositories using the reftable
reference storage format
---------
Co-authored-by: Anthony Eid <anthony@zed.dev>
Adds granular, per-path write permissions to the agent's sandboxed
`terminal` tool.
Previously a command could only request unrestricted filesystem writes
(`allow_fs_write: true`) as an all-or-nothing escape hatch. Now the
model can request write access to specific paths via `fs_write_paths`,
and each granted directory covers its whole subtree. The broad escape
hatch is still available as `allow_fs_write_all: true` for cases where
the paths can't be enumerated up front.
Approval prompts now let the user grant a write request either just for
that command or for the rest of the conversation. Conversation grants
are tracked in memory (never persisted) using pure subtree containment,
so later commands writing under an already-granted path run without
prompting again.
Closes AI-335
Release Notes:
- Improved the agent's terminal sandbox so commands can request write
access to specific paths instead of all-or-nothing filesystem access,
with the option to grant access for a single command or the rest of the
conversation.
---------
Co-authored-by: Anant Goel <anantdgoel@gmail.com>
Co-authored-by: Richard Feldman <oss@rtfeldman.com>
Extraction done from #53453
I removed the default Oid implementation we had and added support back
for SHA264 back as well. I also removed the hex dependency and just
added some of those functions we needed in house so we can avoid
building yet another dependency
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
Adds two built-in agent tools, behind the staff-only
`create-thread-tool` feature flag, that let the agent spawn independent
sibling threads:
- **`create_thread`** creates a new thread with a title and initial
prompt. It runs on the user's behalf and shows up in the agent sidebar
like a thread the user started themselves, but it runs in the background
— the active thread is never interrupted — and it does **not** report
results back to the caller. (Use `spawn_agent` when you want the
results.)
- **`list_agents_and_models`** enumerates the configured agents and, for
the native agent, the available models, so the agent can pick a
cheaper/faster model for bulk work. The motivating stress test was
"spawn 100 threads that each write a haiku, using Haiku instead of
Opus."
By default the sibling shares the parent's project and worktree. If
`use_new_worktree` is set, `create_thread` instead opens a new
background workspace backed by fresh linked git worktrees of the
project's repos — the same flow you get from the worktree picker's
"Create worktree" — and starts the thread there. The new workspace opens
as a background tab so it doesn't pull you away from what you're doing.
A few notes on the design:
- The `agent` crate can't depend on the UI, so there's a
`SiblingThreadHost` trait that `agent_ui::AgentPanel` implements and
installs on the `NativeAgent`. Tool calls in a native-agent thread route
through it.
- Sibling threads go through the same `create_agent_thread` →
`ConversationView` path as the user-facing "new thread" action, so
eviction, persistence, and sidebar rendering match user-created threads.
- An explicit `agent`/`model` override doesn't clobber the panel's
selected agent or the last-used-agent preference — those are snapshotted
and restored around the call.
- The worktree path reuses the existing "Create worktree" machinery
rather than reimplementing it; the agent flow just opens the new
workspace in the background instead of activating it.
A couple of things I left out or want to call out:
- There's no tool to operate on an already-created sibling by session
id. The success payload deliberately omits it, since the session is
populated asynchronously and nothing consumes it yet.
- When a project has multiple worktrees that are linked worktrees of the
*same* underlying repo, they collapse into a single new worktree (they
resolve to the same target path). The tool returns a warning in that
case rather than failing — and this also fixes a latent collision the
manual "Create worktree" flow would hit in the same situation.
Release Notes:
- N/A
Closes https://github.com/zed-industries/zed/issues/57992
Closes AI-349
## Summary
- Run rules-to-skills migration during agent UI init instead of waiting
for feature flags in production.
- Add a command palette action to rerun the migration manually.
- Make AGENTS.md migration appends idempotent to avoid duplicated
default-rule prompts.
Release Notes:
- Added a manual way to trigger the Rules to Skills migration
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)
- [ ] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Summary:
- Added split/unified diff controls to the commit history commit view
using `SplittableEditor`.
- Kept commit messages separate from file diffs with an 8-line
scrollable message panel.
- Fixed split setup edge cases and async/test type mismatches from the
commit view changes.
Verification:
- `cargo check -p git_ui`
- `cargo check -p git_ui --tests`
- `cargo check -p editor --tests`
- `./script/clippy -p git_ui`
- `git diff --check`
Release Notes:
- Improved the commit history diff view by adding the ability to toggle
the split diff mode.
---------
Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
### Summary
Adds the first pass at `#[gpui::bench]`, backed by Criterion, with a new
`BenchAppContext` for GPUI benchmarks.
This ports one editor benchmark to the new setup while keeping the
existing Criterion render benchmarks in place.
### Follow Ups
I eventually want to improve this framework to create custom tracy
profiles that includes additional information such as
- notify count
- entity.update count and time
- event emitted and time for that
I also want to use this to create custom measurements so benches can be
used for
- Frames dropped
- foreground thread time
- Render time
- etc
This PR is a very small proof of initial concept and I'll continue to
build this infrastructure out so Zed and other gpui apps can become a
lot more resilient to dropping frames and hangs. Plus it will make
improving performance a lot easier as well in the future.
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
Removes the feature flag around terminal output selection so the
terminal tool always exposes head_lines and tail_lines. This keeps the
simpler behavior from the landed implementation while avoiding a
separate rollout path for the tool schema.
Release Notes:
- Improved agent terminal output controls by making them available
without a feature flag
Adds option to always search/scan symlinks for more thorough coverage of
#41887 issue
This is a significant rewrite and more thoroughly reviewed and tested
version of the old PR here:
https://github.com/zed-industries/zed/pull/46344
The "never" option was removed from the old PR, since "expanded" is now
the default. Perhaps "never" can be added as an option later if there's
demand for it. Adding that option may resolve#48890 for instance.
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
(significant impact with "always" option, but "expanded" is default)
Release Notes:
- Add option choose between including expanded symlinks or include all
symlinks in project search (#41887)
---------
Co-authored-by: Eric Holk <eric@zed.dev>
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
Adds optional terminal tool parameters that let agents receive only the
first lines, last lines, or both from a command's final output while
leaving the live terminal output visible to users. This is gated by the
terminal-tail feature flag and updates the tool descriptions to steer
agents away from piping through head, tail, or similar filters.
Closes AI-36
Release Notes:
- Let agents use the terminal tool with builtin "head/tail" so they
don't have to pipe to head/tail and lose incremental output
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
Closes #ISSUE
Release Notes:
- N/A or Added/Fixed/Improved ...