Commit log

2b6e935 Add remaining tool permissions (#46164)

Click to expand commit body
Add permission checking to the remaining 7 tools that require granular
permissions:
- `edit_file`: Checks path against permission rules  
- `delete_path`: Checks path against permission rules
- `move_path`: Checks both source and destination paths
- `create_directory`: Checks path against permission rules
- `save_file`: Checks all paths, denies if any are blocked
- `fetch`: Checks URL against permission rules
- `web_search`: Checks query against permission rules

Each tool follows the pattern established in PR #46155 (terminal tool):
- `Allow` = proceed without prompting
- `Deny` = return error immediately
- `Confirm` = prompt user for confirmation

The deny > confirm > allow precedence is enforced by the
`decide_permission_from_settings()` function.

Release Notes:

- N/A

---------

Co-authored-by: Amp <amp@ampcode.com>

Richard Feldman and Amp created

8a1cf4d Add structured outline for Markdown (#45643)

Click to expand commit body
Just make outline of markdown to be structured:

<img width="282" height="144" alt="image"
src="https://github.com/user-attachments/assets/6c7e5d5f-ae09-47a9-965a-6f9f9b731ce6"
/>

Release Notes:

- Added structured outline for Markdown.
- Also fixed the breadcrumb display in Issue
[#45663](https://github.com/zed-industries/zed/issues/45663).

Yuantian Ding created

b9de700 git_ui: Unify branch, worktree, and stash pickers in one (#46621)

Click to expand commit body
This PR creates a unified picker for all the Git-related pickers:
branch, worktree and stash. The main motivation for this is to bring
awareness and ease of access for the worktree and stash pickers that
were previously (and arguably) hidden amidst the sea of commands in the
command palette. As worktrees in particular become more relevant for
AI-related flows, having an easier way to reach for its picker will be
beneficial.

Note that the actions/commands remain the same; you can still look for
`git: worktree` or `git: view stash`. The difference is that these
actions will take you to the unified picker with the correct
corresponding active view.


https://github.com/user-attachments/assets/99d1cd6f-a19d-47d3-9bca-d7257e7ed5b8

Release Notes:

- Git: Unify the branch, worktree, and stash pickers into one, making it
easier to find and access them from one another.

Danilo Leal created

bf3cab6 Fix worktree trust not applied on window reuse (#46623)

Click to expand commit body
New workspace/window creates a different `WeakEntity<WorktreeStore>` for
the same path, which was not considered before.

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

Release Notes:

- Fixed worktree trust not applied in window reuse

Kirill Bulatov created

cbb6e2f ep: Fix applying patch to text without a trailing newline (#46471)

Click to expand commit body
Release Notes:

- N/A

Co-authored-by: Agus Zubiaga <agus@zed.dev>

Oleksiy Syvokon and Agus Zubiaga created

37b0560 gpui(windows): Force a paint message when running out foreground budget (#46609)

Click to expand commit body
Release Notes:

- Fixed zed no longer rendering on windows in a timely manner if it gets
overloaded with foreground work

Co-authored-by: John Tur <john-tur@outlook.com>

Lukas Wirth and John Tur created

0eeb743 copilot: Fix double lease panic when signing out (#46619)

Click to expand commit body
Extracted out of #46618 as I wanna fast-track it to Preview.

Release Notes:

- Fixed a crash that occured when signing out of Copilot.

Piotr Osiewicz created

2f093d2 Delete accidentally committed scheduler plan (#46601)

Click to expand commit body
Release Notes:

- N/A

Antonio Scandurra created

38fc4ea Properly notify all language server worktree trust listeners (#46613)

Click to expand commit body
Closes https://github.com/zed-industries/zed/issues/46590


https://github.com/user-attachments/assets/8464a3b6-9258-4d15-9168-56178bf46437

`use smol::channel::{Receiver, Sender};` do not propagate the value
change to all receivers, hence only one language server received the
"worktree trusted" message.
The fix uses `watch` kind of channels instead, and cleans up its state
more eager to rely on the sender drop as another form of notification.

Release Notes:

- Fixed groups of language servers not starting after worktree trust
approval

Kirill Bulatov created

5ddfcf0 editor: Remove unnecessary cloning of selections (#46598)

Click to expand commit body
Stumbled across this upon a PR review - `unfold_ranges` takes a slice of
Ranges and already clones the ranges itself, so we do not need to clone
the selections prior to passing these.

Release Notes:

- N/A

Finn Evers created

819d2f7 project_symbols: Support rust-analyzer path symbol search (#46511)

Click to expand commit body
cc https://github.com/rust-lang/rust-analyzer/pull/21415

Release Notes:

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

Lukas Wirth created

a75d3fc Always show worktree trust, even if other title bar items are hidden with settings (#46606)

Click to expand commit body
Closes https://github.com/zed-industries/zed/discussions/46595

Release Notes:

- Fixed "show project items" keeping worktree trust title bar element
hidden

Kirill Bulatov created

ad1251b First-contribution autolabeler: work around a bug (#46603)

Click to expand commit body
The job was skipping first-time contributors because GitHub was
returning None as their association.

Release Notes:

- N/A

Lena created

5c7abad terminal: Fix IME position when cursor is hidden (#46592)

Click to expand commit body
Closes https://github.com/zed-industries/zed/issues/45553

## Summary

When using applications that hide the terminal cursor (e.g., via ANSI
escape sequence `\e[?25l`), the IME candidate window appeared at the
bottom-left of the screen, and the composition text was not displayed at
all. This affects tools like Claude Code that hide the cursor during
operation.

The root cause was that cursor position calculation was skipped when the
cursor shape was `Hidden`. This fix separates cursor visibility from IME
position calculation by always computing cursor bounds for IME
positioning.

## Movies

### Zed 0.218.6


https://github.com/user-attachments/assets/a66d569a-178d-4bca-a577-fcc65e9fd2c4

### With this fix


https://github.com/user-attachments/assets/456323d1-6c18-45ea-88e8-fb5375c00f98

Release Notes:

- Fixed IME candidate window and composition text position in terminal
when cursor is hidden

koh-sh created

feccf38 terminal_view: Remove intermediate vec allocation (#46600)

Click to expand commit body
`grid_view` takes an iterator of `IndexedCell`s, so we don't have to
collect this into a vec prior to passing this.

Release Notes:

- N/A

Finn Evers created

578911d terminal: Avoid overlapping IME marked text with terminal content (#46227)

Click to expand commit body
Closes #33157

|Before|After|
|--|--|
|<img width="922" height="158" alt="CleanShot 2026-01-07 at 12 18 21@2x"
src="https://github.com/user-attachments/assets/2ba6020f-5159-4ed8-aa2e-374ea3ea4cf5"
/>|<img width="908" height="200" alt="CleanShot 2026-01-07 at 12 19
02@2x"
src="https://github.com/user-attachments/assets/ec946c4e-3220-4944-b34a-1d8d5dcc7ae2"
/>|

Many other terminals seem to do it this way as well.

|Ghostty|Windows Terminal| Visual Studio Code|
|--|--|--|
|<img width="930" height="186" alt="CleanShot 2026-01-07 at 12 23 30@2x"
src="https://github.com/user-attachments/assets/837189aa-2f4c-4a48-b060-f3576b8777e0"
/>|<img width="1414" height="128" alt="c89e03d2d92869d5ec1b8a05ade84df0"
src="https://github.com/user-attachments/assets/8b6d69fb-b34d-4ccd-8a3a-9332487cd427"
/>|<img width="978" height="180" alt="CleanShot 2026-01-07 at 12 27
01@2x"
src="https://github.com/user-attachments/assets/dbc0acc7-3c16-499f-ac32-35e3c0cd0d97"
/>|

Release Notes:

- Fixed UI overlap between IME marked text and terminal content.

ᴀᴍᴛᴏᴀᴇʀ created

d4f6ca4 Update GPUI dependency: ashpd 0.12 -> 0.12.1 (#46564)

Click to expand commit body
Release Notes:

- N/A

TL;DR: There was a closed issue 7 hours ago that changed ashpd version,
it needed another bump.

A dependency of gpui called ashpd has a fix in v0.12.1, GPUI has the
0.12 version. After forking zed and patching the gpui source to be mine
with 0.12.1 it was able to use GPUI as a dependency and compile the
project. The error I was getting and the recomendation to do this PR can
be seen in this [closed issue from
ashpd](https://github.com/bilelmoussaoui/ashpd/issues/325).

After changing the dependecy I hit cargo check:
```bash
   Finished `dev` profile [unoptimized + debuginfo] target(s) in 4m 24s
```

And cargo run:
```bash
  Compiling zed v0.220.0 (/home/user/git/xaviduds/zed/crates/zed)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 9m 44s
     Running `target/debug/zed`
```

Zed compiled and opened:
<img width="1920" height="1042" alt="image"
src="https://github.com/user-attachments/assets/8bc524d1-bc4a-43f8-9da4-b02faecca30c"
/>

Eduardo de Melo Xavier created

a87fed2 Skip worktree trust checks on Zed invisible worktrees (#46563)

Click to expand commit body
Follow-up of https://github.com/zed-industries/zed/pull/46256

Release Notes:

- Fixed worktree trust pop-up appearing on a keymap editor invication

Kirill Bulatov created

0ff0390 Improve snippet parse error context (#46277)

Click to expand commit body
Release Notes:

- N/A


Description:
E.g. Instead of saying:
2026-01-07T09:08:42-06:00 ERROR [crates/snippet_provider/src/lib.rs:46]
failed to parse snippet
  Caused by:
      expected an integer

Now the logs give more valuable information like:
2026-01-07T10:47:39-06:00 ERROR [crates/snippet_provider/src/lib.rs:48]
invalid snippet in /Users/oscarvarto/Library/Application
Support/Zed/extensions/installed/django-snippets/./snippets/python.json
(re_path)

Oscar Vargas Torres created

5ba6258 licenses: Verify validity of the symlink files (#46444)

Click to expand commit body
Release Notes:

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

Lukas Wirth created

e0b8969 editor: Fix DeleteToPreviousSubwordStart and DeleteToNextSubwordEnd interaction with newlines (#46235)

Click to expand commit body
Closes #40110

  Changes:
- `DeleteToPreviousSubwordStart` now deletes `\n` separately from
preceding subwords and whitespace.
- `DeleteToNextSubwordEnd` now deletes `\n` and any following whitespace
separately from subsequent subwords.
- Added an `ignore_newlines` flag to both actions to optionally retain
the old behavior.

These modifications align the subword commands with their word
counterparts and with other popular editors like VSCode and Sublime.

Related to: https://github.com/zed-industries/zed/pull/16848

  Release Notes:

- Improved `DeleteToPreviousSubwordStart` and `DeleteToNextSubwordEnd`
interactions around newlines. You can opt-in into the previous behavior
by adding `{"ignore_newlines": true}` to either action's binds in your
keymap.

  ---

This is my first contribution to Zed! If anything should be done
differently, please let me know. Happy to learn :)

Ruben Fricke created

43c252c Fix `gpui` Linux build failure due to ashpd/zbus incompatibility (#46543)

Click to expand commit body
`ashpd` 0.11 is incompatible with recent zbus/zvariant releases, causing
a compilation error in Linux. Bumping to 0.12 fixes it.
See: https://github.com/bilelmoussaoui/ashpd/issues/323

To reproduce:

```toml
[package]
name = "test-gpui"
version = "0.1.0"
edition = "2021"

[dependencies]
gpui = { git = "https://github.com/zed-industries/zed" }
```

```bash
...
   Compiling ashpd v0.11.0
error[E0277]: the trait bound `AppID: Basic` is not satisfied
   --> /home/neulus/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ashpd-0.11.0/src/documents/mod.rs:391:16
    |
391 |         self.0.call("Info", &(doc_id.into())).await
    |                ^^^^ unsatisfied trait bound
    |
help: the trait `Basic` is not implemented for `AppID`
   --> /home/neulus/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ashpd-0.11.0/src/app_id.rs:10:1
    |
 10 | pub struct AppID(String);
    | ^^^^^^^^^^^^^^^^
    = help: the following other types implement trait `Basic`:
              &B
              BusName<'_>
              ErrorName<'_>
              InterfaceName<'_>
              MemberName<'_>
              NonZero<i16>
              NonZero<i32>
              NonZero<i64>
            and 35 others
    = note: required for `HashMap<AppID, Vec<Permission>>` to implement `zbus::zvariant::Type`
    = note: 1 redundant requirement hidden
    = note: required for `(file_path::FilePath, HashMap<AppID, Vec<Permission>>)` to implement `zbus::zvariant::Type`
note: required by a bound in `proxy::Proxy::<'a>::call`
   --> /home/neulus/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ashpd-0.11.0/src/proxy.rs:172:40
    |
166 |     pub(crate) async fn call<R>(
    |                         ---- required by a bound in this associated function
...
172 |         R: for<'de> Deserialize<'de> + Type,
    |                                        ^^^^ required by this bound in `Proxy::<'a>::call`

error[E0277]: the trait bound `DocumentID: Basic` is not satisfied
   --> /home/neulus/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ashpd-0.11.0/src/documents/mod.rs:500:16
    |
500 |         self.0.call_versioned("GetHostPaths", &(doc_ids,), 5).await
    |                ^^^^^^^^^^^^^^ unsatisfied trait bound
    |
help: the trait `Basic` is not implemented for `DocumentID`
   --> /home/neulus/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ashpd-0.11.0/src/app_id.rs:98:1
    |
 98 | pub struct DocumentID(String);
    | ^^^^^^^^^^^^^^^^^^^^^
    = help: the following other types implement trait `Basic`:
              &B
              BusName<'_>
              ErrorName<'_>
              InterfaceName<'_>
              MemberName<'_>
              NonZero<i16>
              NonZero<i32>
              NonZero<i64>
            and 35 others
    = note: required for `HashMap<DocumentID, file_path::FilePath>` to implement `zbus::zvariant::Type`
note: required by a bound in `proxy::Proxy::<'a>::call_versioned`
   --> /home/neulus/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ashpd-0.11.0/src/proxy.rs:195:40
    |
188 |     pub(crate) async fn call_versioned<R>(
    |                         -------------- required by a bound in this associated function
...
195 |         R: for<'de> Deserialize<'de> + Type,
    |                                        ^^^^ required by this bound in `Proxy::<'a>::call_versioned`

For more information about this error, try `rustc --explain E0277`.
error: could not compile `ashpd` (lib) due to 2 previous errors
```

Release Notes:

- N/A

Neulus created

3f2c7c6 Use let chain to avoid `clippy::unnecessary_unwrap` (#46409)

Click to expand commit body
No bug, just shows up running the tests on `clippy 0.1.92 (ded5c06cf2
2025-12-08)`

Release Notes:

- N/A

Martin Pool created

af6385a Fix Windows IME composition string being displayed incorrectly (#46545)

Click to expand commit body
Previously, a new composition string was processed before a new
composition result. Thus, in the case that a keystroke creates a new
composition result and composition string, the processing of the new
result would overwrite the new string, even though they should both be
displayed. Processing them in the reverse order fixes this issue.
 
Fixes #42201

Additionally: while fixing this issue, I discovered that the Japanese
IME sometimes moves the cursor far away from the inserted text. WPF
works around this issue by only respecting the IME's requested cursor
position if it's adjacent to uncommitted text. So, we copy this
workaround.

Release Notes:

- N/A

John Tur created

ecc3928 Fix cancellation regression: make edit_file_tool handle cancellation (#46527)

Click to expand commit body
PR #46306 changed cancellation to wait for tools to complete before
returning. This was correct behavior - it allows tools like terminal to
capture their output on cancellation. The real issue was that many tools
didn't check for cancellation, so they would continue running until they
finished.

## The Problem

When the user pressed Escape to cancel during a tool operation, tools
would continue running because they never checked for the cancellation
signal. The thread correctly waited for tools to complete (so terminal
could capture output), but tools like edit_file, grep, fetch, etc. would
just keep going.

## The Fix

Add cancellation handling to all tools using the same pattern as
`terminal_tool`: use `select!` to race between the tool's main work and
`event_stream.cancelled_by_user()`. When cancelled, tools break out of
their loops or return early.

## All Tools Now Cancellation-Aware

| Tool | Change |
|------|--------|
| `edit_file_tool` | Checks cancellation in edit event processing loop |
| `terminal_tool` | Already handled cancellation |
| `grep_tool` | Checks cancellation in search result iteration loop |
| `fetch_tool` | Checks cancellation during HTTP fetch |
| `web_search_tool` | Checks cancellation during web search |
| `find_path_tool` | Checks cancellation during path search |
| `read_file_tool` | Checks cancellation during buffer open |
| `copy_path_tool` | Checks cancellation during file copy |
| `move_path_tool` | Checks cancellation during file move/rename |
| `delete_path_tool` | Checks cancellation during delete operation |
| `create_directory_tool` | Checks cancellation during directory
creation |
| `save_file_tool` | Checks cancellation during buffer open and save |
| `restore_file_from_disk_tool` | Checks cancellation during buffer open
and reload |
| `open_tool` | Checks cancellation during authorization |
| `diagnostics_tool` | Checks cancellation during buffer open |
| `ContextServerTool` (MCP) | Checks cancellation during external server
calls |

**Synchronous tools (no async work, return immediately):**
- `list_directory_tool` - Reads worktree snapshot synchronously
- `now_tool` - Returns current time immediately
- `thinking_tool` - Returns immediately

## MCP Tools Automatically Handled

MCP tools (user-defined tools via context servers) are now automatically
cancellation-aware without any user action. The `ContextServerTool`
wrapper races the external server request against
`event_stream.cancelled_by_user()`.

## Testing

- Added `CancellationAwareTool` test helper that mirrors the
cancellation pattern
- Updated `test_cancellation_aware_tool_responds_to_cancellation` to
properly await the cancel task and verify the tool detected cancellation

Release Notes:

- Fixed a regression where pressing Escape wouldn't immediately cancel
in-progress tool operations

Richard Feldman created

c6a38f2 open_ai: Use proper type for Responses API `input` (#46526)

Click to expand commit body
This PR makes it so we use a proper type for the Responses API `input`
rather than a `serde_json::Value`.

It should have never used `serde_json::Value` to begin with.

Release Notes:

- N/A

Marshall Bowers created

73d9353 Integrate scheduler crate into GPUI (#44810)

Click to expand commit body
## Motivation

This PR unifies the async execution infrastructure between GPUI and
other components that depend on the `scheduler` crate (such as our cloud
codebase). By having a scheduler that lives independently of GPUI, we
can enable deterministic testing across the entire stack - testing GPUI
applications alongside cloud services with a single, unified scheduler.

## Summary

This PR completes the integration of the `scheduler` crate into GPUI,
unifying async execution and enabling deterministic testing of GPUI
combined with other components that depend on the scheduler crate.

## Key Changes

### Scheduler Integration (Phases 1-5, previously completed)
- `TestDispatcher` now delegates to `TestScheduler` for timing, clock,
RNG, and task scheduling
- `PlatformScheduler` implements the `Scheduler` trait for production
use
- GPUI executors wrap scheduler executors, selecting `TestScheduler` or
`PlatformScheduler` based on environment
- Unified blocking logic via `Scheduler::block()`

### Dead Code Cleanup
- Deleted orphaned `crates/gpui/src/platform/platform_scheduler.rs`
(older incompatible version)

## Intentional Removals

### `spawn_labeled` and `deprioritize` removed
The `TaskLabel` system (`spawn_labeled`, `deprioritize`) was removed
during this integration. It was only used in a few places for test
ordering control.

cc @maxbrunsfeld @as-cii - The new priority-weighted scheduling in
`TestScheduler` provides similar functionality through
`Priority::High/Medium/Low`. If `deprioritize` is important for specific
test scenarios, we could add it back to the scheduler crate. Let me know
if this is blocking anything.

### `start_waiting` / `finish_waiting` debug methods removed
Replaced by `TracingWaker` in `TestScheduler` - run tests with
`PENDING_TRACES=1` to see backtraces of pending futures when parking is
forbidden.

### Realtime Priority removed
The realtime priority feature was unused in the codebase. I'd prefer to
reintroduce it when we have an actual use case, as the implementation
(bounded channel with capacity 1) could potentially block the main
thread. Having a real use case will help us validate the design.

## Testing
- All GPUI tests pass
- All scheduler tests pass
- Clippy clean

## Architecture

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                          GPUI                                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ gpui::Background-    β”‚    β”‚ gpui::ForegroundExecutor   β”‚ β”‚
β”‚  β”‚ Executor             β”‚    β”‚  - wraps scheduler::       β”‚ β”‚
β”‚  β”‚  - scheduler: Arc<   β”‚    β”‚    ForegroundExecutor      β”‚ β”‚
β”‚  β”‚    dyn Scheduler>    β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                 β”‚                  β”‚
β”‚             β”‚                             β”‚                  β”‚
β”‚             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β”‚
β”‚                        β–Ό                                     β”‚
β”‚            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                         β”‚
β”‚            β”‚  Arc<dyn Scheduler>   β”‚                         β”‚
β”‚            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                         β”‚
β”‚         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                      β”‚
β”‚         β–Ό                             β–Ό                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚ PlatformSchedulerβ”‚      β”‚   TestScheduler    β”‚           β”‚
β”‚  β”‚   (production)   β”‚      β”‚ (deterministic)    β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

Release Notes:

- N/A

---------

Co-authored-by: Antonio Scandurra <me@as-cii.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Yara <git@yara.blue>
Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>

Nathan Sobo , Antonio Scandurra , Claude Opus 4.5 , Yara , and Zed Zippy created

17dbe8d Add right-click menu action to copy path in the breadcrumb button (#46483)

Click to expand commit body
This PR adds a right-click action to the breadcrumb button to copy the
path, when there is some (i.e., untitled buffers and others won't have
this feature).


https://github.com/user-attachments/assets/94ece12c-3071-4a07-a04d-8d89e10fd59e

Release Notes:

- Added the ability to right-click the breadcrumb button when it's a
file path and copy the path.

Danilo Leal created

e04d044 Fix fold persistence corruption from external file changes (#46011)

Click to expand commit body
## Summary

Fixes #33633 - folds corrupting after external file modifications.

The existing fold persistence stored raw byte offsets, which become
stale when files are modified externally (git operations, other editors,
sync tools). This caused folds to capture wrong content on restore -
users reported "wrong lines getting folded" with systematic offsets.

**Solution: Content fingerprinting**
- Store 32-byte content samples at fold boundaries
- On restore, validate fingerprints match; if not, search buffer for new
positions
- Handles edge cases: short folds (< 32 bytes), duplicate content,
boundary positioning

**Bonus fix: Ungraceful exit survival**
- Entity IDs change between sessions, but workspace cleanup's CASCADE
DELETE was wiping folds before new editors could save
- Now migrates folds to new entity_id immediately after restore

## Test plan

- [x] Unit test for fingerprint storage/retrieval
(`test_save_and_get_editor_folds_with_fingerprints`)
- [x] Manual test: fold sections, add content at file start externally,
reopen β†’ folds restore at correct positions
- [x] Manual test: fold sections, Ctrl+C, reopen β†’ folds survive
- [x] Existing fold tests pass (`cargo test -p editor`)

## Release Notes

- N/A

---------

Co-authored-by: Hector <hector@cyberneticwilderness.com>

Brandt Weary and Hector created

93e3a39 Simplify networking tests even more (#46489)

Click to expand commit body
Release Notes:

- N/A

Mikayla Maki created

f5c924c Revert "lsp: Do not reuse disk-based diagnostics (#46437)" (#46487)

Click to expand commit body
This reverts commit dd43891521484dc25d520e3c1551d9d211a1f2fa.

This commit was causing issue with diagnostics:
https://zed-industries.slack.com/archives/C07NUKHLVUZ/p1767999287421729

Release Notes:

- Reverted #46437

Marshall Bowers created

dffed22 acp: Add keybindings for session config option categories (#46484)

Click to expand commit body
Adds the normal mode/model keybindings for the first config option of a
given category

Release Notes:

- N/A

Ben Brandt created

451bf25 language_models: Add support for using OpenAI Responses API through Zed provider (#46482)

Click to expand commit body
This PR adds support for using the OpenAI Responses API through the Zed
provider.

This is gated behind the `open-ai-responses-api` feature flag.

Part of CLO-34.

Release Notes:

- N/A

Marshall Bowers created

613183b acp: Update agent-client-protocol Rust SDK to v0.9.3 (#46481)

Click to expand commit body
Release Notes:

- N/A

Ben Brandt created

0afe91f Prepopulate empty patch in example capture (#46480)

Click to expand commit body
This makes it a smoother workflow to capture an edit prediction example
from Zed and then write what you'd expect the patch to be.

Release Notes:

- N/A

Max Brunsfeld created

bf87d0e Fix vim mouse selections (#45177)

Click to expand commit body
Closes #27720

Release Notes:

- vim: Fixed selection drifting slowly to the right when selecting
chaotically with the mouse.

Conrad Irwin created

b212cfb search: Stream project search results sooner (#45245)

Click to expand commit body
- **project search: Stream result buffers sooner in remote scenarios**
- **Fix remote server build**

Closes #ISSUE

Release Notes:

- Improved performance of project search in remote projects.

---------

Co-authored-by: Smit <smit@zed.dev>
Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Co-authored-by: Conrad <conrad@zed.dev>

Piotr Osiewicz , Smit , Zed Zippy , Smit Barmase , and Conrad created

442c236 languages: Fix Python venv auto-activation for PowerShell 7 (#46465)

Click to expand commit body
Summary
This PR fixes an issue where Python virtual environments (`venv`, `uv`,
etc.) were not automatically activated when opening a terminal using
PowerShell 7.

Details
`ShellKind` distinguishes between the legacy Windows PowerShell
(`ShellKind::PowerShell`) and the newer PowerShell 7
(`ShellKind::Pwsh`). Previously, the logic in
`resolve_venv_activation_scripts` only checked for
`ShellKind::PowerShell`, causing `activate.ps1` resolution to fail for
`Pwsh` users.
This change adds `ShellKind::Pwsh` to the resolution list, mapping it to
`activate.ps1` just like the legacy PowerShell.

Release Notes:

- Fixed Python virtual environments not automatically activating in
PowerShell 7

Xin Zhao created

1062e2c vim: Add `use_match_quotes` setting for % motion, default is `true` (#42615)

Click to expand commit body
Add a `match_quotes` parameter to the `vim::Matching` action that
controls whether the `%` motion should treat quote characters (', ", `)
as matching pairs.

In Neovim, `%` only matches bracket pairs (([{}])), not quotes. Zed's
existing behavior includes quote matching, which some users prefer. To
preserve backwards compatibility while allowing users to opt into
Neovim's behavior, this PR:

1. Adds an optional `match_quotes` boolean parameter to the
   `vim::Matching` action
2. Updates the default vim keymap to use ["vim::Matching", {
   "match_quotes": true }], preserving Zed's current behavior
3. Users who prefer Neovim's behavior can rebind `%` in their keymap:

```
{
    "context": "VimControl && !menu",
    "bindings": {
        "%": ["vim::Matching", { "match_quotes": false }]
    }
}
```

When `match_quotes` is `false`, the `%` motion will skip over quote
characters and only match brackets/parentheses, matching Neovim's
default behavior.

Release Notes:

- vim: Added match_quotes parameter to the vim::Matching action to control
whether % matches quote characters

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>

Hans and dino created

a941577 agent: Split up Agent and Text Thread History (#46457)

Click to expand commit body
Scopes the history to the individual panes and paves the way for history
per external agent.

Release Notes:

- N/A

Ben Brandt created

ddf70bc Fix incorrect usages of `Zeta2FeatureFlag` (#46462)

Click to expand commit body
Closes #ISSUE

Release Notes:

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

Ben Kunkle created

0d082a3 Fix visual test font regression (#46461)

Click to expand commit body
The visual test infrastructure changes in #46324 accidentally switched
from `settings::init(cx)` to `SettingsStore::test(cx)`, which uses
Courier font instead of the real Zed fonts (IBM Plex Sans / Lilex).

This restores the correct font loading:
1. Load embedded fonts with `Assets.load_fonts(cx)`
2. Use `settings::init(cx)` to get the real default settings with proper
fonts

Release Notes:

- N/A

Richard Feldman created

e6467fc ep: Fix editable region for teacher models (#46459)

Click to expand commit body
Editable region was different for Zeta2 and Teacher, leading to "Edits
outside of editable region" errors.

Release Notes:

- N/A

Co-authored-by: Agus Zubiaga <agus@zed.dev>

Oleksiy Syvokon and Agus Zubiaga created

5deb4aa remote: Pass `-q` on ssh remotes when running one shot commands (#46458)

Click to expand commit body
This pollutes tasks and similar with a `connection closed` message
otherwise.

Release Notes:

- Fixed terminal tool for agents ending with `connection closed` on
remote hosts polluting context

Lukas Wirth created

5f92b31 git: Fix a bug where BranchDiff shows incorrect diffs (#46433)

Click to expand commit body
This happens when a user's default branch has different remote and local
versions on their system. Because we would get a diff using just a
branch name without including it's remote name as well

This is a better default because it's far less confusing from a user's
perspective to debug what's going on.

Release Notes:

- git: Fix BranchDiff showing incorrect diffs when default local branch
is out of sync with the remote default branch

Anthony Eid created

dd43891 lsp: Do not reuse disk-based diagnostics (#46437)

Click to expand commit body
Fixes #41220

Co-authored-by: dino <dinojoaocosta@gmail.com>

Closes #41220

Release Notes:

- Rust: Fixed diagnostics being stale when working across path
dependencies

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>

Piotr Osiewicz and dino created

7142e6a agent_ui: Add per-file and total number of lines added and removed (#46454)

Click to expand commit body
This PR adds the total and per-file number of lines added and removed
per thread, using the same logic to compute these as in the commit view.
Here's how they show up in the UI:

<img width="500" height="514" alt="Screenshot 2026-01-09 at 11β€― 27@2x"
src="https://github.com/user-attachments/assets/e3a4a14f-a4ee-4e95-a77b-86d14914e9d6"
/>

Release Notes:

- Agent: Added the total and per-file number of lines added and removed
in a thread.

Danilo Leal created

f42d714 Add `ep --failed=skip` to exclude errored examples from output (#46453)

Click to expand commit body
Release Notes:

- N/A

Oleksiy Syvokon created

b550463 remote: Add build-remote-server-binary for use in benchmarks (#46451)

Click to expand commit body
Benchmarks that depend on remote server would not rebuild the remote
server binary outside of dev builds. Let dependants of remote opt into
building the binary even in release builds.

Release Notes:

- N/A

Piotr Osiewicz created

30f776e open_ai: Move `responses` module to its own file (#46450)

Click to expand commit body
This PR moves the `responses` module to its own module in the `open_ai`
crate.

Release Notes:

- N/A

Marshall Bowers created