Commit Graph
37338 Commits
Author SHA1 Message Date
Richard Feldman 4a15e201ba Don't block thread creation when PromptStore fails to initialize (#52333)
NativeAgentServer::connect used `prompt_store.await?` which turned any
PromptStore initialization failure (permission denied, disk issues,
etc.) into a hard connection error, putting the ConversationView into
LoadError state and preventing all new native agent threads from being
created.

Changed to `.log_err()` so the error is logged at ERROR level but thread
creation proceeds with `prompt_store: None`. `NativeAgent::new` already
accepts `Option<Entity<PromptStore>>` and handles `None` gracefully —
user custom prompts won't load but threads still work.

Added a regression test that serializes a stale thread ID, loads the
panel (triggering the "last active thread not found in database"
warning), then dispatches NewThread through the real NativeAgentServer
path and verifies it produces a connected thread.

Release Notes:

- Agent panel now handles filesystem errors more gracefully
2026-04-24 12:32:28 +00:00
XiaoYan LiandNeel 03064b953f agent_ui: Switch to All filter when last archived thread is removed (#54763)
When the archive view's filter is set to "Archived Only" and the user
deletes (or unarchives) the last archived thread, the toggle button
becomes disabled because there are no archived threads left. With the
filter still pinned to "Archived Only", the list goes empty and there's
no way for the user to switch back to the All view.

This fixes it by automatically falling back to `ThreadFilter::All`
inside `update_items` whenever the current filter is `ArchivedOnly` but
the store has no archived entries. Since `update_items` is invoked from
the `ThreadMetadataStore` observer, this covers all paths that mutate
the store, not only deletions triggered from this view.

Release Notes:

- Fixed the agent thread archive view getting stuck on an empty
"Archived Only" list after the last archived thread was removed.

---------

Co-authored-by: Neel <neel@zed.dev>
2026-04-24 12:02:08 +00:00
Joseph T. Lyons b034259591 Fix broken rustfmt in git graph code (#54730)
rustfmt is broken in this code. I believe it's too deep / complex in the
builder pattern. After factoring some bits out, it now auto formats.

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

Closes #ISSUE

Release Notes:

- N/A
2026-04-24 11:44:36 +00:00
Oleksiy Syvokon 250e697ff7 project_search: Fix project search status text and refactor search state (#54753)
This change fixes a small bug where we were showing "Loading project..."
even when in fact we had already started the search.

It also refactors three booleans in the `SearchState` enum, so that it's
harder to make similar mistakes in the future.


Release Notes:

- N/A
2026-04-24 10:45:16 +00:00
Xiaobo Liu 93e9bef8a5 editor: Make parse_blocks synchronous since it has no await points (#54756)
Release Notes:

- N/A

Signed-off-by: Xiaobo Liu <cppcoffee@gmail.com>
2026-04-24 10:40:20 +00:00
Matt Van HornandMatt Van Horn adab7b8871 language_models: Honor images capability for custom OpenAI models (#54223)
## Summary

Users who add custom OpenAI models under
`language_models.openai.available_models` can set `capabilities.images:
true` to declare that the endpoint accepts image inputs. Today, that
setting is silently ignored: the Agent panel's image-attach button stays
disabled regardless, and the only workaround is to switch to a built-in
OpenAI model, attach the image, and switch back.

Root cause: `Model::Custom` does not carry a `supports_images` field,
and the OpenAI provider's `supports_images()` for the `Custom` arm
hardcodes `false`.

## Changes

1. `crates/settings_content/src/language_model.rs`: add `images: bool`
to `OpenAiModelCapabilities` with `#[serde(default)]` so existing
settings.json files keep working unchanged.
2. `crates/open_ai/src/open_ai.rs`: add `supports_images: bool` to
`Model::Custom` with a matching serde default.
3. `crates/language_models/src/provider/open_ai.rs`: pass
`model.capabilities.images` into the `Model::Custom` variant in
`provided_models`, and return the stored value from `supports_images()`
for `Custom`.

Existing `Model::Custom { .. }` match sites (`completion.rs:829`,
various in `open_ai.rs`) all use `..` so they continue to compile
without change.

## Testing

- `cargo check -p settings_content -p open_ai -p language_models`:
clean.
- I was not able to complete `./script/clippy` locally: the build
stalled on the first-time `webrtc-sys` download for livekit-rust-sdks
(TLS close_notify failure on docs.rs mirror). Happy to rerun once CI has
cached artifacts.
- Manually verified the capability plumbing by tracing: settings.json ->
`OpenAiModelCapabilities.images` -> `Model::Custom { supports_images }`
-> `supports_images()` -> `Thread::prompt_capabilities` ->
`SessionCapabilities.supports_images()` -> `build_add_context_menu` gate
in `thread_view.rs`.

## Related Issues

Closes #50752

Release Notes:

- Fixed custom OpenAI models ignoring the `capabilities.images` setting
in `language_models.openai.available_models`.

This contribution was developed with AI assistance (Codex).

---------

Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
2026-04-24 10:36:46 +00:00
Lukas Wirth c5a2807492 Remove smol as a dependency from a bunch of crates (#53603)
We aren't making use of it in these crates and it unblocks some
web-related work

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-04-24 10:29:51 +00:00
Kirill Bulatov 872faf0a7b Exit early on mutating actions in readonly editor (#54758)
Hides and disables all mutating editor actions for readonly editors.

Certain actions (as cmd-backspace mentioned in the issue) could be
somewhat beneficial to have for navigation purposes, but we'd better
shape that story properly, let's build a "harness" and disable the
mutating ones first.

Closes https://github.com/zed-industries/zed/issues/47333

Release Notes:

- Fixed readonly editor having certain mutation actions enabled
2026-04-24 10:17:53 +00:00
MoulberryandBen Kunkle 4d668fa368 Fix showing unsupported window controls on Linux Wayland (#50609)
Release Notes:

- Fixed showing unsupported window controls on Linux Wayland

Before:
<img width="207" height="84" alt="image"
src="https://github.com/user-attachments/assets/174d3488-7c40-4b36-a1b5-76b85e19b796"
/>

After:
<img width="185" height="90" alt="image"
src="https://github.com/user-attachments/assets/82f10cbb-a834-4db9-a8e7-9e5156b3397e"
/>

Co-authored-by: Ben Kunkle <ben@zed.dev>
2026-04-24 10:10:12 +00:00
Tom HouléandBennet Bo Fenner 89d2dcebba agent_ui: Fix permissions getting granted to wrong tool call (#54683)
Release Notes:

- Fixed an issue where the first tool call would always be accepted when
parallel tool calls were made, rather than the one that was actually
clicked

---------

Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de>
2026-04-24 09:52:28 +00:00
Smit Barmase 749fcfdfd8 gpui: Fix out-of-bounds panic rendering GIFs (#54701)
Clamp the cached `frame_index` of an `img` element when the underlying
image changes so a stale index from a previous, longer animation cannot
index out of bounds on the new image.

Release Notes:

- Fixed a panic when a GIF was replaced with one that had fewer frames
in Markdown Preview.
2026-04-24 09:46:50 +00:00
Om ChillureandDanilo Leal 6bf00800c6 Fix agent thread sidebar covering window buttons (#54755)
## Summary

Fixes an oversight in the agent threads archive sidebar's header: on
Linux and Windows it only accounted for macOS traffic lights, so the
custom window controls (minimize/maximize/close) rendered on top of the
sidebar. The main sidebar
(`crates/sidebar/src/sidebar.rs::render_sidebar_header`) already handles
this correctly — this PR mirrors that pattern in
`ThreadsArchiveView::render_header`.

### What changed
- `crates/agent_ui/src/threads_archive_view.rs`
- `render_header` now computes `traffic_lights`, `left_window_controls`,
and `right_window_controls` (matching `sidebar.rs`) and reserves space /
renders controls accordingly when not fullscreen.
- Added `render_left_window_controls` / `render_right_window_controls`
helpers that delegate to `platform_title_bar`.
  - Imported `workspace::CloseWindow`.
- `crates/agent_ui/Cargo.toml`
  - Added `platform_title_bar` dependency.

### Behavior
- macOS (sidebar on left): unchanged — traffic-light padding + divider.
- Linux/Windows, sidebar on left: renders left-side window controls
inside the header.
- Linux/Windows, sidebar on right: renders right-side window controls
inside the header.
- Fullscreen: no controls rendered, same as before.

#### Closes #54596

### 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

### Video 

[Screencast from 2026-04-24
14-27-51.webm](https://github.com/user-attachments/assets/47009458-2acb-4b65-bff6-d25302a0342e)

Release Notes:

- Agent: Fixed the threads sidebar overlapping the window control
buttons on Linux and Windows.

Co-authored-by: Danilo Leal <67129314+danilo-leal@users.noreply.github.com>
2026-04-24 09:42:05 +00:00
Dino c5354fe056 keymaps: Update no action bindings to null (#54506)
Update uses of `zed::NoAction` in default keymaps with `null` seeing as
`zed::NoAction` is being deprecated.

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
2026-04-24 09:33:26 +00:00
Albab Hasan df905d3893 gpui: Fix Core Foundation object leaks on macOS (#49022)
release `TISInputSource` returned by
`TISCopyCurrentKeyboardLayoutInputSource` in `MacKeyboardLayout::new()`,
and `CFUUIDRef` returned by `CGDisplayCreateUUIDFromDisplayID` in
`MacDisplay::uuid()`. both follow the core foundation create rule and
must be released by the caller.

Release Notes:

- N/A
2026-04-24 09:09:29 +00:00
Lukas Wirth 58d3a9eef4 gpui_shared_string: Implement SharedString via smol_str (#54649)
This reduces the size of Sharedstring from 32 bytes to 24 while also
allowing for small-string optimization, meaning strings with length < 23
bytes will not actually allocate.

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-04-24 08:58:26 +00:00
Finn Evers b9b50e3b9e ci: Reduce compliance notifications on success (#54669)
...What a beatiful syntax to have in a context where anything else would
not be evaluated regardless.

Release Notes:

- N/A
2026-04-24 08:56:22 +00:00
Sakethanddino 9a1b538fa0 Highlight nested JSX member expression tags (#53750)
The highlight queries only matched JSX member-expression tags when the
object was a plain identifier (`<A.B>`), so tags with more than one dot
like `<A.B.C>` lost their component-tag highlighting.

The fix explicitly captures every leaf `identifier` and
`property_identifier` at each nesting depth (up to 3 levels) in the
JavaScript and TSX highlight queries so each token gets its own
`@tag.component.jsx` capture that beats the generic `@property` rule.

A more concise approach, capturing the whole nested
`(member_expression)` node as a single `@tag.component.jsx` blob, does
not work because the generic `(property_identifier) @property` rule
targets a smaller, more specific node inside the blob, winning the
resolution for inner segments like `B` in `<A.B.C>`. 

Closes #53305 

Release Notes:

- Fixed highlighting for nested JSX member expression tags in JavaScript
and TSX files.

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>
2026-04-24 08:45:47 +00:00
67e41996be agent: Propagate tool permission decisions to pending permission prompts (#54679)
When the agent issued several parallel tool calls that all required
confirmation, clicking "Always for en.wikipedia.org" (or similar) on the
first prompt would persist the new rule to settings but leave the
sibling prompts stuck waiting on their own oneshot channels. The same
happened across subagents, and whenever the user edited settings.json by
hand while prompts were on screen.

`ToolCallEventStream::authorize()` now takes full ownership of the
permission decision. It evaluates the tool-permission settings up front,
and on Confirm it spawns a task that races the user's response against a
`SettingsStore` observer. When settings change, it re-runs the decision;
a new Allow or Deny drops the response receiver, flips the tool call
status to dismiss the prompt UI, and resolves the task without user
input. Subagents fall out of this for free since each thread observes
`SettingsStore` independently.

A few tools (`copy_path`, `move_path`, `delete_path`,
`create_directory`, `save_file`, `restore_file_from_disk`, and the
`edit-file` helper) sometimes need to prompt even when settings say
Allow — for example, edits that target `.zed/settings.json`. For those,
a new `authorize_always_prompt()` method skips the settings check and
always waits for user input; tools pick between the two at the call site
based on whether the path is sensitive.

Closes #54101.

Release Notes:

- In the agent panel, when you click "Always allow" for a tool, this
decision now gets propagated to other pending calls to the same tool.

Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de>
2026-04-24 08:42:44 +00:00
John Tur 7d42f276f2 Pixel snapping (#54728)
Painting primitives at non-integer pixel coordinates produces blurry
output. Pixel snapping converts layout coordinates into integer
device-pixel coordinates so painted edges land exactly on physical pixel
boundaries.

Non-integer coordinates can arise for several reasons, including:

- flex distribution, percentages, centering, and text measurement can
produce fractional element sizes and positions;
- at fractional scale factors (for example 125% or 150%), integer
logical-pixel values can map to non-integer device-pixel values.

We pixel-snap by rounding in device-pixel space, after multiplying by
`scale_factor`, so that snapping targets physical pixels. Bounds are
divided by `scale_factor` before being returned to GPUI.

Midpoints are rounded toward zero. This is a stylistic choice: a
1-logical-pixel line at 150% scale should render as 1 dp rather than 2
dp.

Pixel snapping is done in two phases:

1. Pre-layout metric snapping. Before Taffy computes layout, all
authored absolute lengths are rounded in `to_taffy`. This includes
borders, padding, gaps, and explicit sizes. Custom-measured leaf nodes
have their measured sizes rounded up to integer device-pixel lengths.
2. Post-layout edge snapping. After Taffy resolves the tree, layout
relationships such as flex shares, grid tracks, percentages, and
centering can produce new fractional edge positions. Boxes now have
edges in absolute coordinates, and snapping must decide where those
edges land on the device-pixel grid.

Ideally, post-layout snapping would satisfy:

- Edge closure. Two raw layout edges at the same absolute position
should snap to the same pixel column.
- Translation stability. A component's internal geometry should not
change when it moves to a new absolute position.

These goals are in tension because rounding is not associative. The
simple local schemes make different tradeoffs:

- Absolute edge rounding gives each window coordinate one answer, so
coincident edges always close globally. But a span's snapped length is
`round(far) - round(near)`, which may change by 1 dp as its absolute
origin moves.
- Parent-relative edge rounding rounds each child inside its parent's
coordinate space. This guarantees translation stability, but a shared
edge reached through different parents can accumulate different
rounding, causing non-closure between cousins.
- Length rounding rounds each width, height, and thickness independently
and then places boxes from those rounded lengths. Sizes stay stable
under translation, but neighboring boxes derive their shared boundary
from different sources, so closure is not guaranteed.

We apply absolute edge rounding for each element's outer box in
post-layout rounding to preserve closure. Border and padding widths are
not touched by post-layout rounding; they keep their pre-layout rounded
value so that they remain stable under translation.

This gives both closure and translation stability in the case that all
local metrics are integer device-pixel lengths. Pre-layout rounding
covers that in most cases. The exception is metrics resolved by layout
relationships, such as percentages. Outer box edges will still close
globally, and painted border widths are still snapped independently, but
the raw content-box origin can carry a 1 dp residual into descendants.

---

Fixes https://github.com/zed-industries/zed/issues/46360
Fixes https://github.com/zed-industries/zed/issues/44528
Fixes https://github.com/zed-industries/zed/issues/40282
Fixes https://github.com/zed-industries/zed/issues/42257

---


Release Notes:

- Fixed potentially blurry appearance of UI elements when using
fractional display scaling.
2026-04-24 08:31:43 +00:00
Finn Evers eb9e9135e3 ci: Improve messaging around compliance failures (#54636)
Release Notes:

- N/A
2026-04-24 08:27:25 +00:00
John Tur 20c4fb032d Pass shift-home and shift-end keystrokes to the terminal (#54706)
It's not clear what this logic was supposed to do, and it was preventing
shift+{special key} combinations from being sent to the terminal.

Fixes #52985

Release Notes:

- N/A
2026-04-24 06:41:37 +00:00
prayansh_chhablaniandJakub Konka 485181a06a Helix jump list (#46467)
Closes #41580

This implements Helix's jump list, Zed already supports jumplists, so
all that is done is re-binding ctrl-s to to that instead. In another PR
we can extend this by adding space+j functionility to see all selections
in jumplist.

after this change:
Pressing Ctrl+S saves the current cursor position to the jumplist,
allowing the user to navigate back to this position using Ctrl+O
(backward) and Ctrl+I (forward), consistent with regular Helix's
behavior.

Release Notes:

- N/A *or* Added/Fixed/Improved ...

---------

Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
2026-04-24 06:37:31 +00:00
Daniel GräfeandChristopher Biscardi 385f6134bb gpui: Add support for NSWindow's representedFilename (#48029)
This sets the accessibility document property (AXDocument) of the
window, which other apps can use to understand what file the current
window represents. Document-based apps on macOS are generally expected
to set this property.

The document path is set via `Window::set_document_path()` which calls
`setRepresentedFilename:` on the underlying NSWindow. The workspace
updates this path in `update_window_title()` whenever the active item or
project structure changes. For tests, instead of trying to somehow
assemble a proper NSWindow, we store the document path on the window
mock used for testing and check its value.

Motivation: I am the developer of Timing, an automatic time tracking app
for Mac. Timing uses the `AXDocument` property (a standard property of
most document-based app windows on macOS) to understand what document
the user is working on. With this change, Timing is able to understand
which directory the user is working in. Without this, Timing would only
record the window title, i.e. the filename without information about the
containing directory. I've had several users ask for better support for
Zed.

Here's a screenshot of the macOS Accessibility Inspector showing the
`AXDocument` property with this change. The UI of Zed itself does not
change. However, in my dev build of Zed, the traffic lights are a bit
too large and misaligned. However, this happens even when building
`main`, so I assume it’s unrelated to my changes.

<img width="1370" height="1162" alt="Screenshot 2026-01-30 at 16 18 25"
src="https://github.com/user-attachments/assets/dc260252-91fb-41e1-97a9-e6fb843c6a70"
/>

Release Notes:

- Set the represented filename property of windows on macOS

---------

Co-authored-by: Christopher Biscardi <chris@christopherbiscardi.com>
2026-04-24 03:48:27 +00:00
Eric Holk 9adb4ea63e Fix agent threads missing from sidebar after upgrade (#54723)
Fixes #54618.

## Summary

After upgrading from `v0.232.x` to `v0.233.5+`, many users reported that
most
of their agent threads "disappeared" from the sidebar. The threads are
still
on disk in the legacy `threads.db` — but they never make it into
`sidebar_threads`, which is the only table the new sidebar UI reads
from, so
they're unreachable from the UI.

The root cause is a race between `ThreadStore::reload` and
`migrate_thread_metadata`:

- `ThreadStore::new` constructs with an empty in-memory `Vec` and kicks
off
  `reload()` as a fire-and-forget task.
- `migrate_thread_metadata` runs during `agent_ui::init` and reads
  `ThreadStore::global(cx).read(cx).entries()` synchronously, without
  awaiting that reload.
- On cold boot the migration observes an empty iterator, early-returns
on
  `to_migrate.is_empty()`, and never populates `sidebar_threads`. The
  migration runs every launch, so it keeps losing the race forever.

Empirically, the only rows that *did* end up in `sidebar_threads` for
affected users came from `handle_conversation_event` writing rows when
the
user actively interacted with a thread. That's why users would typically
see
a handful of recently-touched threads rather than their full history.

## Fix

1. `ThreadStore` now tracks its current reload as a `Shared<Task<()>>`
and
   exposes it via `reload_task()`. `migrate_thread_metadata` awaits this
   before reading `entries()`.
2. Move the top-5-per-project unarchive pass out from under the
   `is_first_migration` guard. Previously the rescue only ran when
   `sidebar_threads` was empty, which meant any user who had even one
pre-existing row (e.g. from interacting with a thread on a prior launch)
got every subsequent batch of migrated threads archived with no rescue.
   Running the rescue per-batch is stateless and idempotent — a user who
bounces between older releases and newer ones still gets their top 5 per
   project surfaced each time a new batch is migrated.

No new KVP flag or one-shot backfill is needed: because the migration
already dedupes by session_id and runs on every launch, the next cold
boot
on a fixed build picks up any legacy threads that earlier launches
missed.

## Structure

The PR is split into two commits to make the diff easy to verify:

1. **Regression test** — fails on `main`, reproduces the cold-boot race
by
seeding the legacy DB, reinitializing `ThreadStore` to get a fresh empty
   cache, and running the migration without parking first.
2. **The fix** — gates entries reads on `reload_task().await`, and
adjusts
the per-batch rescue policy. Updates one existing test's assertions to
   match the new per-batch rescue policy.

## Validation

- The regression test fails on `main`, passes after the fix.
- All `agent_ui`, `agent::thread_store`, and `sidebar` lib tests pass.
- `./script/clippy -p agent -p agent_ui` is clean.
- End-to-end repro with a real on-disk data dir: launched `v0.230.2 →
v0.231.2 → v0.232.3 → v0.233.8` as a non-staff user, creating 15 threads
  and interacting with one, reproduced the reported state (1 thread in
sidebar, 14 missing). Launched a debug build of this branch against the
same data dir: `Migrating 14 thread store entries` in the log, 15 rows
in
`sidebar_threads` with 6 unarchived (the interacted-with thread plus the
  5 most recent), 9 archived and reachable from the archive view.

Release Notes:

- Fixed agent threads appearing to be missing after upgrading to the
parallel-agents sidebar. The thread-metadata migration was racing
against the on-disk thread store's async reload and skipping itself on
every launch. Upgrading to this build runs the migration successfully;
previously-missing threads are surfaced either in the sidebar (5 most
recent per project) or in the archive view.
2026-04-24 03:09:30 +00:00
shiwyangandConrad Irwin 9fe32ac141 Support GFM callouts in Markdown (formerly GitHub admonitions) (#54661)
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 #10022 

Release Notes:

- Added support for GFM alert callouts (`> [!NOTE]`, `> [!TIP]`, `>
[!IMPORTANT]`, `> [!WARNING]`, `> [!CAUTION]`) in markdown preview,
rendering each type with a colored left border, icon, and bold label.

---------

Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
2026-04-24 02:52:54 +00:00
0194fe0576 git: Replace file history view with git graph (#50288)
## Summary

This PR replaces the git file history view with the git graph view that
doesn't render the graph canvas. This has several advantages

1. Benefits from the graphs performance and lazy loading
2. Gets the graph's search for free
3. Resizable columns
4. The commit information panel
5. Is persistent 
6. Cleans up a lot of code

The one con of this change is the graph doesn't have support
remote/collab support yet, but that is a WIP and should be merged within
a week.

Also, the git graph now propagates errors to the UI, which is the last
thing on the graph's stable launch todo list!

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:

- N/A *or* Added/Fixed/Improved ...

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>
Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Co-authored-by: Joseph T. Lyons <JosephTLyons@gmail.com>
2026-04-24 02:51:19 +00:00
Finn EversandDanilo Leal 9b40411c6a Fix bad GitHub merge queue merge (#54721)
No, sadly, the title is not a typo. See
https://www.githubstatus.com/incidents/zsg1lk7w13cf for the context.
I'll read with joy and popcorn through that root cause analysis.

It makes literally zero sense what happened here, but for some completly
bonkers reason GitHub completely messed up the merge queue with
https://github.com/zed-industries/zed/pull/54632.

I have no idea how it happened. It makes literally zero sense. A PR
going into the merge queue should have the same LoC when getting out of
it. GitHub obviously does not check this. GitHub causes extra work with
a feature that is supposed to save time.

Thanks, I guess.

Release Notes:

- N/A

---------

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
2026-04-23 23:47:30 +00:00
robinojwandChris Biscardi a1cb3706f4 markdown_preview: Independent font family and theme (#54003)
## Summary

Adds two user-facing settings that let the markdown preview render with
a font family and theme independent from the editor. Both are optional
and fall back to the editor defaults when unset.

```json
{
  "markdown_preview_font_family": "Georgia",
  "markdown_preview_theme": "Solarized Light"
}
```

## Details

- New `MarkdownFont::Preview` variant, used only by the preview surface.
- New `MarkdownStyle::themed_with_overrides()` that accepts explicit
`ThemeColors` and `SyntaxTheme` so the preview can render with a theme
other than the active editor theme. Existing `themed()` callers are
unchanged.
- The preview pane background adopts the chosen theme's
`editor_background`.
- Follows the pattern already used by `agent_ui_font_size` /
`agent_buffer_font_size`.

## Scope

Sizing-related changes (`markdown_preview_font_size`,
`markdown_preview_line_height`, typography tweaks, responsive max-width
container) were in an earlier revision of this PR and have been removed
per review feedback — they interact with the Cmd+/- zoom behavior in
ways that still need design work, and will land in a follow-up.

## Files Changed

- `crates/settings_content/src/theme.rs` — schema
- `crates/theme_settings/src/settings.rs` — runtime + accessor
- `crates/markdown/src/markdown.rs` — `MarkdownFont::Preview` +
`themed_with_overrides()`
- `crates/markdown_preview/src/markdown_preview_view.rs` — theme
resolution, style selection, background
- `crates/markdown_preview/Cargo.toml` — `theme` dependency
- `crates/settings/src/vscode_import.rs` — new fields in struct literal

Release Notes:

- Added `markdown_preview_font_family` and `markdown_preview_theme`
settings to customize the markdown preview independently from the
editor.

Co-authored-by: Chris Biscardi <chris@christopherbiscardi.com>
2026-04-23 23:41:07 +00:00
Max Brunsfeld 41cf3a8950 Always preserve worktree order rather than sorting lexicographically (#54716)
Release Notes:

- Zed now keeps project directories in the order they were added, rather
than implicitly sorting them lexicographically.
2026-04-23 22:20:16 +00:00
Max Brunsfeld 8cd2d599ae Disable sidebar if agent panel is disabled (#54713)
Closes https://github.com/zed-industries/zed/issues/54523

Release Notes:

- N/A
2026-04-23 21:45:01 +00:00
Joseph T. LyonsandDanilo Leal a5c5dd0912 Adjust UI for gutter right-click menus (again) (#54710)
- #54632 unintentionally reverted changes introduced in #54681, likely
due to a merge conflict resolution issue.

See the original PR for the changes.

Release Notes:

- N/A

Co-authored-by: Danilo Leal <danilo@zed.dev>
2026-04-23 21:21:45 +00:00
Max Brunsfeld 5f4cd80a83 Display open worktrees list more consistently with titlebar (#54432)
* Call it "Open Worktrees" instead of "Open Workspaces"
* Show worktree icon and 'main' for the main worktree

Release Notes:

- N/A
2026-04-23 20:24:00 +00:00
Joseph T. Lyons 4fc8a581e9 Add a git: copy branch name action (#54702)
I frequently use the branch name copy action in GitHub Desktop.
I want to do this in Zed.

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 a `git: copy branch name` action.
2026-04-23 19:51:57 +00:00
Leon QadirieandJakub Konka 74456c8b49 vim: Ensure surrounding markers contain cursor for Helix surround operations (#47163)
Closes #47155, introduced by #44317

I naively trusted `crates/vim/src/object.rs:1624`'s
`surrounding_markers` to check whether the cursor is actually
surrounded, but it has nearest match fallback behavior, apparently by
design as indicated by `test_anyquotes_object` in the same file.

Release Notes:

- Fixed Helix surround operations falling back to closest match if
cursor not surrounded

Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
2026-04-23 18:45:26 +00:00
Kirill Bulatov fca4d60ce1 Disable miniprofiler by default (#54645)
Needs https://github.com/zed-industries/zed/pull/54635 for the profile
overrides added into default settings json to work.
Part of https://github.com/zed-industries/zed/issues/48968
Another part of the fix related seems to be
https://github.com/zed-industries/zed/pull/45669 ?

Using the steps from the issue and profiling on macOs had shown that Zed
has 2 memory "leaks" in play when a certain file is being rewritten a
lot of times.

* First, the thread profiler registers a lot of tasks' data and fills
its buffer to the limit:

<img width="3456" height="2158" alt="image"
src="https://github.com/user-attachments/assets/f183312d-4389-4072-8915-d54e60419b08"
/>

* Second, if the buffer gets open, the undo history fragments start to
creep up infinitely:

<img width="3456" height="2158" alt="image"
src="https://github.com/user-attachments/assets/61a2b66b-81fd-4973-9c3c-c339f886d9b2"
/>

The PR aims to solve the first issue by disabling the profiling by
default, yet leaving the way to turn in on quickly with settings.

The memory usage profiling shows that the memory usage is now
dynamically affected by the new setting:

<img width="2032" height="1136" alt="image"
src="https://github.com/user-attachments/assets/8a6c76b9-6fb7-44bc-ac1d-3c34afe7c575"
/>

While the test directory being thrashed with the script from the issue, 
* first, Zed starts with the profiling disabled
* then gets the profiling enabled which results in the memory growth
close to 1 minute mark of the screenshot
* last, the profiling gets disabled again, releasing all the memory
accumulated

Release Notes:

- Improved Zed's default memory usage
2026-04-23 18:41:52 +00:00
2f445d4059 gpui: Fix follow_tail not re-engaging after scrollbar drag (#54570)
Fixes an inconsistency with the way scrolling interacts with the
`follow_tail` GPUI list feature:
- Scrolling normally sets `follow_state` to `FollowState::Tail {
is_following: false }`, so later scrolling to the bottom re-engages
`follow_tail`
- Scrolling by dragging the scrollbar previously set `follow_state` to
`FollowState::Normal`, preventing `follow_tail` from re-engaging after
scrolling to the bottom

As far as I can tell this behavior was unintentional, despite there
being a test that exercised this exact behavior that `follow_tail`
doesn't re-engage after dragging the scrollbar — my best guess is that
that test was derived from the bugged scrollbar handler logic, and not
based on any actual intent for scrollbar drags to prevent `follow_tail`
from re-engaging.

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 agent panel auto-scroll not re-engaging after interacting with
the scrollbar

---------

Co-authored-by: Danilo Leal <67129314+danilo-leal@users.noreply.github.com>
Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
2026-04-23 18:36:41 +00:00
Danilo Leal 0ab64d6414 branch_picker: Add button to filter remote branches (#54632)
This PR brings back the button to filter remote branches when accessing
the title bar's branch picker with the mouse. It was unintentionally
removed when we introduced the new worktree picker.

Release Notes:

- N/A
2026-04-23 18:26:44 +00:00
Ben Kunkle 398f430818 fs: Handle i64 and u64 values from libc::statfs (#54699)
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 ...
2026-04-23 18:24:07 +00:00
Mikhail PertsevandJakub Konka b359a42d56 helix: Add Helix's "Amp Jump" Feature (#43733)
# Helix Amp Jump Navigation

## Overview

Implements Helix-style "amp jump" (`g w`) navigation for jump-to-word
functionality. This feature displays two-character labels on each word
in the visible area, allowing users to quickly jump to any word by
typing its label. Labels alternate between forward and backward
directions (same algorithm as in the Helix) from the cursor position,
giving closer jump targets easier-to-type labels.

## Context

- **Request:** Implement "amp jump" navigation similar to Helix editor's
jump-to-word feature.
- **Scope:** Full implementation including label generation, UI
rendering, and input handling.
- **Inspiration:** Helix editor's "amp jump" and vim-easymotion/hop.nvim
plugins.

## How It Works

1. Press `g w` to activate "amp jump"
2. Two-character labels appear on all words in visible area
3. User types the two-character label shown on the target word
4. Cursor jumps to that word


![img](https://3axhz45qqw.ufs.sh/f/6ZbnPrl7GVDFemyq4vCkvmpc5P1uMQlS20sVCwig8nb4TBDK)

Release Notes:

- Added in Helix mode the "amp jump" navigation (`g w`) that displays
two-character labels on words for quick cursor navigation. Labels
alternate between forward and backward directions from the cursor,
prioritizing closer targets with easier-to-type labels. The color of the
labels can be controlled via a new `helix.jump_label_accent` setting

---------

Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
2026-04-23 17:38:25 +00:00
Yara 🏳️‍⚧️ 54d5eaeade OSC8-URIs support in terminal (#54322)
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 #39339 

Release Notes:

- Fixed hyperlinks in the terminal on UNIX
2026-04-23 17:32:16 +00:00
c6bdb69734 Adjust UI for gutter right-click menus (#54681)
- Don't render the tooltip while the menu is open to avoid collision
- Try to maintain the trigger element visible while the menu is open
- Tweak bookmarks icon and tooltip description copy

Release Notes:

- N/A

---------

Co-authored-by: Yara 🏳️‍⚧️ <git@yara.blue>
Co-authored-by: Joseph T. Lyons <JosephTLyons@gmail.com>
2026-04-23 17:05:51 +00:00
Ben Kunkle 1b277fe2d0 ep: Dont send type definition requests to tombi (#54676)
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

Closes #ISSUE

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-04-23 17:03:41 +00:00
cf8eb424b0 Add warning when git commit title is longer than 72 chars (#54653)
Adds a warning to the git commit panel when the message title (i.e.
first line) is longer than 72 (configurable) chars.

<img width="406" height="227" alt="image"
src="https://github.com/user-attachments/assets/08b900d0-3865-4530-8495-e301d5b8c452"
/>

<img width="754" height="482" alt="image"
src="https://github.com/user-attachments/assets/574ebaa5-d6b7-48cd-9ca4-6ee01172ccb4"
/>


Release Notes:

- Added: Display a warning when git commit message title exceeds a
configurable limit

---------

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
Co-authored-by: Danilo Leal <67129314+danilo-leal@users.noreply.github.com>
2026-04-23 17:02:36 +00:00
Neel 6f84d9be2c editor: Fix Open File from multibuffer header jumping to wrong excerpt (#54652)
Reconciles `Open File` behaviour to the same action as using the
keybinds.

Closes #54502

Release Notes:

- Fixed a bug where the `Open File` button would not jump to the excerpt
containing the active cursor.
2026-04-23 16:42:38 +00:00
Hamza ParachaandNeel 4733ae4de3 agent_ui: Serialize copied selection mentions as links (#54031)
Fixes #53981

Selection mentions inserted from the agent panel are stored as folded
placeholder text in the message editor. That meant a normal copy would
put the literal `selection` token on the clipboard, and pasting into a
new thread would lose the original mention context.

This teaches `MessageEditor` to serialize selected folded mentions as
their mention links before writing to the clipboard. The surrounding
text stays intact, and the existing paste path can rebuild the mentions
in a fresh thread.

Release Notes:

- Fixed copied agent prompts replacing selection mentions with the
literal word `selection`.

---------

Co-authored-by: Neel <neel@zed.dev>
2026-04-23 16:37:00 +00:00
Yara 🏳️‍⚧️ 8127c975bc Fix gutter_context_menu not showing (#54574)
To hide the gutter_context_menu in collab notes (where it would be empty
anyway) we checked for the collaboration_hub. But that is unrelated to
collab notes it turns out :)

So now we check for the presence of a project which is always false for
collab notes.

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

Closes #54559

Release Notes:

- N/A Fixed context menu in the editor gutter not showing when there was
a break-point set but breakpoints are not shown in the buffer.
2026-04-23 16:28:05 +00:00
Yara 🏳️‍⚧️ c7dd199a85 Revert "workspace: Fix edge case when saving workspace with no paths" (#54688)
Reverts zed-industries/zed#52810

This seems to have broken CI, after this was merged every test run
failed with:

```
Summary [ 145.368s] 5753 tests run: 5750 passed, 3 failed, 20 skipped
        FAIL [   0.411s] (5476/5753) workspace persistence::tests::test_gc_preserves_current_and_last_sessions
        FAIL [   0.431s] (5477/5753) workspace persistence::tests::test_gc_deletes_empty_workspace_with_items
        FAIL [   0.452s] (5479/5753) workspace persistence::tests::test_gc_deletes_stale_outside_window
```

Release Notes:
- N/A
2026-04-23 16:23:27 +00:00
Max Brunsfeld 33ebeb9850 Don't show parallel agent announcement if AI is disabled (#54571)
Fixes https://github.com/zed-industries/zed/issues/54568

Release Notes:

- N/A
2026-04-23 15:57:22 +00:00
Eric Holk 4a5fbf6a3f Request summarized thinking for Claude Opus 4.7 (#54217)
Starting with Claude Opus 4.7, Anthropic omits thinking content from
responses by default; callers must pass `display: "summarized"` to keep
seeing thinking summaries. Without opting in, the agent UI shows a long
pause with no visible thinking, and users get no progress indication
during extended reasoning.

This extends the adaptive-thinking wire type with an optional `display`
field and requests `Summarized` from every call site that builds an
adaptive thinking request (direct Anthropic, Copilot Chat proxy, Zed
Cloud, and Bedrock).

## Notes

- Applied at the adaptive-thinking layer rather than special-casing Opus
4.7. The `display` parameter is accepted by every
adaptive-thinking-capable model, and the previous behavior (visible
summaries) is what users already see on Opus 4.6 / Sonnet 4.6, so there
is no behavior change for those models.

Release Notes:

- Restored thinking summaries for Claude Opus 4.7.
2026-04-23 15:43:02 +00:00
Danilo Leal ad2939f2e0 Don't show branch and worktree title bar buttons if Git is disabled (#54667)
Closes https://github.com/zed-industries/zed/issues/54628

Release Notes:

- Fixed a bug where the worktree and branch buttons in the title bar
were still being displayed despite `disable_git` being turned on.
2026-04-23 15:33:34 +00:00