Skip to content

Merge latest upstream Zed into Helix fork - #25

Merged
lukemarsden merged 749 commits into
mainfrom
feature/001617-merge-latest-zed
Mar 23, 2026
Merged

Merge latest upstream Zed into Helix fork#25
lukemarsden merged 749 commits into
mainfrom
feature/001617-merge-latest-zed

Conversation

@lukemarsden

Copy link
Copy Markdown

Summary

Merges 736 upstream commits from zed-industries/zed main into the Helix fork, resolving all conflicts and preserving Helix-specific external_websocket_sync changes. Adapts Helix code to upstream's ACP consolidation (retirement of legacy non-ACP native agent).

Changes

  • Resolved all merge conflicts across ~15 upstream-modified files, keeping all #[cfg(feature = "external_websocket_sync")] blocks intact
  • Updated from_existing_thread() in conversation_view.rs (previously acp/thread_view.rs) to match new upstream API: EntryViewState::new, ThreadView::new, and ConnectedServerState struct changes
  • Fixed agent_panel.rs cfg-gated block: ExternalAgent::NativeAgentAgent::NativeAgent, AcpServerView::from_existing_threadConversationView::from_existing_thread, history now fetched from connection_store instead of removed acp_history field
  • Added feature = "external_websocket_sync" to set_session_list cfg in thread_history.rs so it's callable outside test builds
  • Reverted all .github/workflows/ changes back to pre-merge state — the internal git server rejects pushes that modify this directory (no required GitHub scope)
  • Updated portingguide.md: ACP consolidation section, .github/workflows/ revert rule, updated file paths, E2E phase count (4→10), full commit history

All 4 critical fixes verified present

  1. load_session() clones Entity<NativeAgent> before async spawn (agent.rs)
  2. conversation_view.rs only sends UserCreatedThread and ThreadTitleChanged (no duplicates)
  3. AssistantMessage::content_only() exists (acp_thread.rs)
  4. Follow-up path calls notify_thread_display() before sending (thread_service.rs)

Streaming content accumulation fix

Fixed a race condition where short AI responses (e.g. a single token) were
sent to the Go server with empty content, causing validateStore() to fail.

Root cause: AcpThreadEvent::EntryUpdated fires BEFORE
buffer_streaming_text appends the new chunk to StreamingTextBuffer.
For the first (and possibly only) chunk, throttled_send_message_added
captures empty content. flush_streaming_throttle on Stopped only
re-sends stored pending messages — it does not re-read the now-complete
content. So the Go server's MessageAccumulator ends up with empty
ResponseMessage/ResponseEntries.

Fix (crates/external_websocket_sync/src/thread_service.rs): in the
AcpThreadEvent::Stopped handler, after flush_streaming_throttle, iterate
all assistant/tool_call entries and send a fresh message_added with
content_only(cx) / to_markdown(cx). At Stopped time,
flush_streaming_text has already been called, so all content is available.
The Go server accumulator uses per-messageID overwrite semantics, so these
final events correctly replace any truncated content sent during streaming.

E2E test (run_docker_e2e.sh) passes with both zed-agent and claude
agent types — all 10 phases pass including store validation.

Release Notes:

  • N/A

🔗 Open in Helix

📋 Spec:

🚀 Built with Helix

cameron1024 and others added 30 commits March 16, 2026 13:03
Quick-and-dirty version as we're trying this out with the first cohort.

Release Notes:

- N/A
… when hide_root=true (zed-industries#51530)

Closes zed-industries#45135

Before you mark this PR as ready for review, make sure that you have:
- [x] Added a solid test coverage and/or screenshots from doing manual
testing
- [x] Done a self-review taking into account security and performance
aspects
- [x] Aligned any UI changes with the [UI
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)

Release Notes:

- Fixed project root name appearing in file paths while searching in
file finder.
…tries#51587)

#### Fixes zed-industries#51082

#### Description :

When a user configures `default_config_options` (e.g. a specific model)
for an ACP agent, the setting was only applied when creating a new
session. Resuming or loading an existing session (e.g. from history)
skipped this step, causing the model dropdown to revert to "Default
(recommended)".

#### Fix : 

Extract the config options defaulting logic into a shared helper
apply_default_config_options and call it consistently across all three
session entry points: new_session, resume_session, and load_session
Release Notes:

#### Release notes :
Fixed model dropdown resetting to "Default (recommended)" when opening a
previous conversation from history. Configured models (via
default_config_options) are now correctly applied when resuming or
loading existing sessions.


#### Video :
[Screencast from 2026-03-15
12-55-58.webm](https://github.com/user-attachments/assets/977747b9-390c-4f78-91fc-91feace444e1)
…ed-industries#50583)

Closes zed-industries#47900 

## Root cause

The current markdown preview only re-renders on `EditorEvent::Edited,
DirtyChanged, ExcerptsEdited`, but agent edits are implemented via
[`buffer.edit()`](https://github.com/dongdong867/zed/blob/eb3f92708b6dc67bb534c1c44a200c0cb5c4997b/crates/agent/src/edit_agent.rs#L375)
which does not guaranty to emit the `EditorEvent::Edited` event. Causing
the markdown preview stuck on the last received parsed markdown.

## Applied fix

Subscribing to `EditorEvent::BufferEdited` when initializing the
markdown preview view. This will cause the view to update when received
`BufferEdited` event including agent edits to the file.

## As is/ To be

As is | To be
--- | ---
<video
src="https://github.com/user-attachments/assets/a0b13467-7758-4572-ae01-bcbc40beff6c"
/> | <video
src="https://github.com/user-attachments/assets/3b5463f3-46ad-4fe6-8563-ceb4347035db"
/>

---

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
- [ ] Aligned any UI changes with the [UI
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)

Release Notes:

- Fixed markdown preview not re-rendering when edited by agent
…tries#51462)

## Summary

Closes zed-industries#46126

Dim terminal colors in **Ayu Dark** and **Ayu Mirage** were defined as
light pastels instead of muted/darker versions of the normal colors. On
a dark background, the APCA minimum contrast algorithm boosted these
already-light colors toward white, making "dimmed" text (e.g.
zsh-autosuggestions) appear brighter than normal text.

### Root cause

| Color | Ayu Dark (before) | Ayu Dark (after) | Pattern |
|-------|-------------------|------------------|---------|
| dim_foreground | `#0d1016` (= background!) | `#85847f` | Muted
foreground |
| dim_red | `#febab9` (light pink) | `#a74f53` | 70% of normal red |
| dim_green | `#d8eca8` (light pastel) | `#769735` | 70% of normal green
|
| dim_yellow | `#ffd9aa` (light pastel) | `#b17d3a` | 70% of normal
yellow |

The fix follows the same convention as **Gruvbox** and **One Dark**,
where dim = ~70% brightness of the normal color.

**Ayu Light** was already correct (dim colors are darker, which is
correct for light backgrounds).

## Test plan

- [ ] Open terminal in Zed with Ayu Dark theme
- [ ] Enable zsh-autosuggestions (or any tool that uses dim/faint ANSI
colors)
- [ ] Type a partial command to trigger autosuggestions
- [ ] Verify suggested text appears as muted/dim, not bright white
- [ ] Repeat with Ayu Mirage theme
- [ ] Verify Ayu Light theme is unaffected

---

Release Notes:

- Improved some Ayu Dark/Mirage theme's terminal colors.

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
)

Closes zed-industries#49740

Adds optional file and folder icons to the Git panel so its file list is
easier to scan, especially in larger repositories.

- add folder icons for Git panel entries
- add Git panel settings for file and folder icon visibility

---

Release Notes:

  - Made the Git Panel aware of icon themes.
  - Added the ability to render file type icons in the Git panel.

---------

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
…1674)

Moving to the for here before the fix gets upstreamed. We might revisit
this at a later point anyway.

Release Notes:

- N/A
This PR bumps the version of the HTML extension to v0.3.1.

Release Notes:

- N/A

Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
…running (zed-industries#51498)

This PR is motivated by internal feedback in which the notification that
we show inviting to resolve merging conflicts with an agent also pops up
if the agent itself ran `git merge`. In this case, the notification is
unnecessary noise. So, what I'm doing here is simply _not_ showing it if
there's a running agent.

I want to note that this change is accepting a trade-off here, in which
there could be cases that even if an agent is running, the notification
can still be useful. There could be other ways to identify whether the
agent is running `git merge`, but they all felt a bit too complex for
the moment. And given this is reasonably an edge case, I'm favoring a
simple approach for now.

Release Notes:

- N/A

---------

Co-authored-by: Lukas Wirth <lukas@zed.dev>
Closes #ISSUE

Before you mark this PR as ready for review, make sure that you have:
- [ ] Added a solid test coverage and/or screenshots from doing manual
testing
- [ ] Done a self-review taking into account security and performance
aspects
- [ ] 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: Oleksiy <oleksiy@zed.dev>
Closes zed-industries#43329

## Summary
This fixes `path:line:column` navigation for files containing non-ASCII
text.

Before this change, open path flows were passing the external column
directly into `go_to_singleton_buffer_point`. That happened to work for
ASCII, but it was wrong for Unicode because external columns are
user-visible character positions while the editor buffer stores columns
as UTF-8 byte offsets.

This PR adds a shared text layer conversion for external row/column
coordinates and uses it in the affected open-path flows:
 - file finder navigation
 - recent project remote connection navigation
 - recent project remote server navigation

It also adds regression coverage for the Unicode case that originally
failed.

As a small - necessary - prerequisite, this also adds
`remote_connection` test support to `file_finder`'s dev-deps so the
local regression test can build and run on this branch. That follows the
same feature mismatch pattern previously fixed in zed-industries#48280. I wasn't able
to locally verify the tests/etc. w/o the addition... so I've rolled it
into this PR. Tests are green.

The earlier attempt in zed-industries#47093 was headed in the right direction, but it
did not land and did not include the final regression coverage requested
in review.

## Verification
 - `cargo fmt --all -- --check`
 - `./script/clippy -p text`
 - `./script/clippy -p file_finder`
 - `./script/clippy -p recent_projects`
 - `cargo test -p file_finder --lib --no-run`
- `cargo test -p file_finder
file_finder_tests::test_row_column_numbers_query_inside_file -- --exact`
- `cargo test -p file_finder
file_finder_tests::test_row_column_numbers_query_inside_unicode_file --
--exact`
- `cargo test -p text
tests::test_point_for_row_and_column_from_external_source -- --exact`

## Manual

I reproduced locally on my machine (macOS) w/ a stateless launch using a
Unicode file (Cyrillic)

Before:
 - `:1:5` landed too far left
 - `:1:10` landed around the 4th visible Cyrillic character

After:
 - `:1:5` lands after 4 visible characters / before the 5th
 - `:1:10` lands after 9 visible characters / before the 10th

Release Notes:
- Fixed `path:line:column` navigation so non-ASCII columns land on the
correct character.

---------

Co-authored-by: Kirill Bulatov <kirill@zed.dev>
This should put us in a state where everything finally works in its
entirety.

Release Notes:

- N/A
…ies#51581)

Closes zed-industries#51576

Release Notes:

- Select first entry in the language selector when matching a query



https://github.com/user-attachments/assets/c824c024-d2f1-416e-a347-0eab7bc3ae0a

Signed-off-by: Xiaobo Liu <cppcoffee@gmail.com>
…dustries#49624)

## Summary

- Implements `icon_label` on `GitPanel` to return the total count of
uncommitted changes (`new_count + changes_count`) when non-zero, capped
at `"99+"` for large repos.
- Updates `PanelButtons::render()` to render that label as a small green
badge overlaid on the panel's sidebar icon, using absolute positioning
within a `div().relative()` wrapper.
- The badge uses `version_control_added` theme color and
`LabelSize::XSmall` text with `LineHeightStyle::UiLabel` for accurate
vertical centering, positioned at the top-right corner of the icon
button.

The `icon_label` method already existed on the `Panel`/`PanelHandle`
traits with a default `None` impl, and was already implemented by
`NotificationPanel` (unread notification count) and `TerminalPanel`
(open terminal count) — but was never rendered. This wires it up for all
three panels at once.

## Notes

- Badge is positioned with non-negative offsets (`top(0)`, `right(0)`)
to stay within the parent container's bounds. The status bar's
`render_left_tools()` uses `.overflow_x_hidden()`, which in GPUI clips
both axes (the `overflow_mask` returns a full content mask whenever any
axis is non-`Visible`), so negative offsets would be clipped.
- `LineHeightStyle::UiLabel` collapses line height to `relative(1.)` so
flex centering aligns the visual glyph rather than a
taller-than-necessary line box.
- No new data tracking logic — `GitPanel` already maintains `new_count`
and `changes_count` reactively.
- No feature flag or settings added per YAGNI.

## Suggested .rules additions

The following pattern came up repeatedly and would prevent future
sessions from hitting the same issue:

```
## GPUI overflow clipping

`overflow_x_hidden()` (and any single-axis overflow setter) clips **both** axes in GPUI.
The `overflow_mask()` implementation in `style.rs` returns a full `ContentMask` (bounding box)
whenever any axis is non-`Visible`. Absolute-positioned children that extend outside the element
bounds will be clipped even if only the X axis is set to Hidden.
Avoid negative `top`/`right`/`bottom`/`left` offsets on absolute children of containers
that have any overflow hidden — keep badge/overlay elements within the parent's bounds instead.
```

Release Notes:

- Added a numeric badge to the git panel sidebar icon showing the count
of uncommitted changes.

---------

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
This PR adds the missing methods for the `align-self` css property. The
`align_self` field existed on the `StyleRefinement` struct but was
inaccessible using the `styled` trait.

Release Notes:

- Adds `self_start`, `self_end`, `self_center`, `self_flex_start`,
`self_flex_end`, `self_baseline`, and `self_stretch` methods to the
`trait Styled`
Mostly just a test to check whether everything works properly now.

Release Notes:

- N/A
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:

- Updated our BYOK integration to support the new 1M context windows for
Opus and Sonnet.
This PR bumps the version of the GLSL extension to v0.2.2.

Release Notes:

- N/A

Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
Release Notes:

- Fixed: echo's on experimental audio pipeline

Some more context:
- `EchoCanceller` was not implemented on the output side
- removes the planned migration to a different sample rate (44100) and
channel count (1)
- de-duplicate the interleaved `#cfg[]`'s and centralized them in
`echo_canceller.rs`
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

---------

Co-authored-by: cameron <cameron.studdstreet@gmail.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
…stries#50928)

The Python (debugpy) and Go (delve-shim-dap) debug adapters
unconditionally require network access on every debug session start —
even when the adapter binary is already cached locally. This makes the
debugger completely unusable offline.

Python: fetch_debugpy_whl → maybe_fetch_new_wheel hits pypi; failure
propagates as a fatal error.
Go: install_shim → fetch_latest_adapter_version hits the GitHub API;
failure propagates as a fatal error.
CodeLLDB and JavaScript adapters already handle this correctly.

Fix for Python and Go:

Wrap the network fetch in each adapter with a fallback: if the request
fails and a previously downloaded adapter exists on disk, log a warning
and use the cached version. If no cache exists, the original error
propagates unchanged.

Logs after the fix:

```
2026-03-06T16:31:51+05:30 WARN  [dap_adapters::python] Failed to fetch latest debugpy, using cached version: getting latest release
2026-03-06T16:31:51+05:30 INFO  [dap::transport] Debug adapter has connected to TCP server 127.0.0.1:45533
```

Limitations: 

The debugger must be run at least once with internet connectivity to
populate the cache on disk. This PR does not change that requirement.


Closes zed-industries#45781

Before you mark this PR as ready for review, make sure that you have:
- [ ] Added a solid test coverage and/or screenshots from doing manual
testing
- No automated tests are included. The existing MockDelegate stubs
http_client() and fs() as unimplemented!(), so testing the fallback path
would require new mock infrastructure. The fix was verified manually by
running the debug build offline with and without cached adapters. The
CodeLLDB adapter's equivalent fallback (lines 357-374) also has no
dedicated test.
- [x] Done a self-review taking into account security and performance
aspects

Release Notes:

- Fixed debugger failing to start when offline if a debug adapter was
previously downloaded.
…rpts (zed-industries#51685)

Fixes ZED-5VQ

Release Notes:

- N/A *or* Added/Fixed/Improved ...
…es#51684)

We now share connections across multiple "ConnectionView"s the naming
does not make sense anymore

Release Notes:

- N/A
Closes discussion zed-industries#34890 

This is similar to the vim prev/next method/section motion, but more
flexible because this follows the items in editor's outline (Tree sitter
or LSP provided).

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:

- Added actions `editor::GoToPreviousSymbol` and
`editor::GoToNextSymbol` actions to go to the previous and next outline
symbol. This is either the tree sitter outline, or the LSP provided
outline depending on the configuration.
…es#51684)

We now share connections across multiple "ConnectionView"s the naming
does not make sense anymore

Release Notes:

- N/A
…d-industries#51695)

## Summary

- Update the context window table in `models.md` to reflect that Claude
Sonnet 4.6 and Opus 4.6 now support 1M token context windows (previously
listed as 200k)
- Remove Sonnet 4.5/4.6 from the "may increase in future releases"
callout since the 4.6 models are now at 1M

Release Notes:

- N/A
…ustries#51628)

When the user selected a custom agent (e.g. Codex) and chose "Start
Thread in New Worktree", the new workspace's panel ignored the selection
and defaulted to Zed Agent (NativeAgent).

The fix captures `self.selected_agent()` in
`handle_worktree_creation_requested` before the async task, passes it
through to `setup_new_workspace`, and forwards it to `external_thread`
instead of `None`.

Closes AI-84

(No release notes because it's still feature-flagged.)

Release Notes:

- N/A
benbrandt and others added 28 commits March 20, 2026 21:54
## Context

The registry now distinguishes between websites and repos, so we can
show either or both if available.

## Self-Review Checklist

<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A
…ustries#52045)

Previously, the sidebar toggle worked via an action, which is dependent
on what is focused. I changed it to directly call a method.

Release Notes:

- N/A
## Context

Adds a tool to utilize the UI we already expose to ACP agents. Behind a
feature flag for now.

## How to Review

Mostly a tool to hook up to all of the plan plumbing we already have in
acp thread.

## Self-Review Checklist

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A
Release Notes:

- Fixed a weird niche interaction between niri and nixos that broke
screensharing

---------

Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
Release Notes:

- N/A

---------

Co-authored-by: Finn Evers <finn@zed.dev>
Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
…ries#47101)

Swaps the `arrayvec` dependency for `heapless`, as the `heapless`
library allows changing the type used for the `len` field, which
`arrayvec` hard-codes to `usize`. This means that, for all the
`ArrayVec`s in Zed, we can save 7 bytes on 64 bit platforms by just
storing the length as a `u8`.

I have not benchmarked this change locally, as I don't know what
benchmarking tools are in this project.

As a small bit of context, I wrote the PR to `heapless` to add this
`LenT` generic after seeing a PR on the `arrayvec` crate that seems to
be dead now. Once I saw some of Zed's blog posts about the `rope` crate
and noticed the usage of `arrayvec`, I thought this might be a welcome
change.

Release Notes:

- N/A

---------

Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
…ents (zed-industries#52080)

## Context

We were seeing lots of pending title generation, which should only
happen if we don't have a summarization model.

`handle_models_updated_event` unconditionally overwrote the thread's
summarization model on every registry event, even with `None`. 

We should only setting if explicitly changed by the user or we haven't
set it yet, and only if we actually have one.

It is hard to reproduce this issue.. but I don't think this code was
right in the first place anyway.


## Self-Review Checklist

- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A
## Context

This PR adds an `Unbind` action, as well as syntax sugar in the keymaps
for declaring it
```
{
  "unbind": {
    "tab: "editor::AcceptEditPrediction"
  }
}
```
Is equivalent to
```
{
  "bindings": {
    "tab: ["zed::Unbind", "editor::AcceptEditPrediction"]
  }
}
```
In the keymap, unbind is always parsed first, so that you can unbind and
rebind something in the same block.

The semantics of `Unbind` differ from `NoAction` in that `NoAction` is
treated _as an action_, `Unbind` is treated as a filter. In practice
this means that when resolving bindings, we stop searching when we hit a
`NoAction` (because we found a matching binding), but we keep looking
when we hit an `Unbind` and filter out keystroke:action pairs that match
previous unbindings. In essence `Unbind` is only an action so that it
fits cleanly in the existing logic. It is really just a storage of
deleted bindings.

The plan is to rework the edit predictions key bindings on top of this,
as well as use `Unbind` rather than `NoAction` in the keymap UI. Both
will be done in follow up PRs.

Additionally, in this initial implementation unbound actions are matched
by name only. The assumption is that actions with arguments are bound to
different keys in general. However, the current syntax allows providing
arguments to the unbound actions. Both so that copy-paste works, and so
that in the future if this functionality is added, keymaps will not
break.

## How to Review

- The dispatch logic in GPUI
- The parsing logic in `keymap_file.rs`

## Self-Review Checklist

<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- Added support for unbinding key bindings from the default keymaps. You
can now remove default bindings you don't want, without having to
re-declare default bindings that use the same keys. For instance, to
unbind `tab` from `editor::AcceptEditPrediction`, you can put the
following in your `keymap.json`
```
[
  {
    "context": "Editor && edit_prediction",
    "unbind": {
      "tab": "editor::AcceptEditPrediction"
    }
  }
]
```
- Change the branch button's tooltip to be more accurate given it
displays more stuff than only branches
- Hide the worktree dropdown menu when in a non-Git repo project
- Improve provisioned title truncation
- Remove the plus icon from the "view more" item to improve sidebar's
overall feel
- Remove the always visible "new thread" button but make it visible only
when you're in an empty thread state
- Add worktree icon in the thread item and tooltip with full path
- Space out the worktree name from the branch name in the git picker in
the title bar
- Swap order of views in the git picker to "worktree | branches | stash"
- Improve the "creating worktree" loading indicator

---
<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A
)

## Context

Fixes zed-industries#52022.

Rainbow bracket matching could become incorrect when tree-sitter
returned ambiguous bracket pairs for the same opening delimiter. The
repair path rebuilt pairs using a shared stack across all bracket query
patterns, which let excluded delimiters like Markdown single quotes
interfere with parenthesis matching.

This change scopes that repair logic to each bracket query pattern so
ambiguous matches are rebuilt without mixing unrelated delimiter types.
It also adds a regression test for the Markdown repro from the issue.

<img width="104" height="137" alt="image"
src="https://github.com/user-attachments/assets/4318bb4d-7072-4671-8fb5-c4478a179c07"
/>

<img width="104" height="137" alt="image"
src="https://github.com/user-attachments/assets/07a8a0fc-7618-4edb-a14e-645358d8d307"
/>


## How to Review

Review `crates/language/src/buffer.rs` first, especially the fallback
repair path for bogus tree-sitter bracket matches.

Then review `crates/editor/src/bracket_colorization.rs`, which adds
regression coverage for the issue repro.

## Self-Review Checklist

<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- Fixed rainbow brackets in Markdown when quotes caused parentheses to
match incorrectly
…tle mode (zed-industries#51887)

## Context

<!-- What does this PR do, and why? How is it expected to impact users?
     Not just what changed, but what motivated it and why this approach.

Link to Linear issue (e.g., ENG-123) or GitHub issue (e.g., Closes zed-industries#456)
     if one exists — helps with traceability. -->
Fixes some issues with zed-industries#51842
Namely that the tests were scattered and not well organized (this PR
also makes them more thorough), and a regression where holding the
modifiers for the accept prediction keybind would not cause an incoming
prediction to be immediately previewed.

## How to Review

<!-- Help reviewers focus their attention:
- For small PRs: note what to focus on (e.g., "error handling in
foo.rs")
- For large PRs (>400 LOC): provide a guided tour — numbered list of
files/commits to read in order. (The `large-pr` label is applied
automatically.)
     - See the review process guidelines for comment conventions -->

## Self-Review Checklist

<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- (Preview v0.229.x only) Fixed a regression where holding the modifiers
for the accept edit prediction keybind would not immediately preview
predictions as they arrived
Spec-Ref: helix-specs@960d53e86:001617_merge-latest-zed
…e-latest-zed

Spec-Ref: helix-specs@eab61d5c4:001617_merge-latest-zed
Update Helix-specific code to match upstream's ACP consolidation:
- `from_existing_thread` in `conversation_view.rs` (was `acp/thread_view.rs`)
  updated to match new upstream API: `EntryViewState::new` 7-param signature,
  `ThreadView::new` without `login`/`resume_thread_metadata`, and
  `ConnectedServerState` with `history`/`_connection_entry_subscription` fields.
  Added `connection_store` and `connection_key` parameters. Changed `history`
  parameter from `Entity<AcpThreadHistory>` to `Option<Entity<ThreadHistory>>`.
- `agent_panel.rs`: replaced `crate::ExternalAgent::NativeAgent` with
  `crate::Agent::NativeAgent`, `crate::acp::AcpServerView::from_existing_thread`
  with `ConversationView::from_existing_thread`, and the old `acp_history` field
  access with `connection_store` lookup. Removed now-unused `set_session_list` call.
- `thread_history.rs`: added `feature = "external_websocket_sync"` to
  `set_session_list` cfg so it remains callable from non-test builds.
- `portingguide.md`: updated file paths, E2E phase count (4→10),
  added ACP Consolidation section documenting all renames.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Spec-Ref: helix-specs@2589326de:001617_merge-latest-zed
Spec-Ref: helix-specs@2589326de:001617_merge-latest-zed
GitHub requires elevated scopes to push changes to .github/workflows/.
The internal git server rejects pushes that include workflow changes.
Restore all workflow files to their state before the upstream merge.

Spec-Ref: helix-specs@2fa840a1a:001617_merge-latest-zed
Spec-Ref: helix-specs@2fa840a1a:001617_merge-latest-zed
Spec-Ref: helix-specs@97de613b3:001617_merge-latest-zed
Spec-Ref: helix-specs@97de613b3:001617_merge-latest-zed
Spec-Ref: helix-specs@97de613b3:001617_merge-latest-zed
- AgentServerDelegate::new() dropped project and status_tx args
- AgentServer::connect() now takes project as explicit arg
- connect() returns Rc<dyn AgentConnection> directly (not a tuple)
- new_session/load_session now take PathList instead of &PathBuf
- load_session now takes SessionId + title args (not AgentSessionInfo)
- AuthMethod::id is now a method not a field
- Gemini/ClaudeCode servers replaced by CustomAgentServer with their ids
- CustomAgentServer::new takes AgentId not SharedString

Spec-Ref: helix-specs@97de613b3:001617_merge-latest-zed
- Rename ActiveView::AgentThread field server_view → conversation_view
  in three Helix-specific blocks in agent_panel.rs
- Fix HeadlessConnection to implement new agent_id() method
- Fix HeadlessConnection::new_session signature (PathList instead of &Path)
- Fix is_resume flag to use load_session_id.is_some() (resume_thread removed)
- Fix self.history to self.history() with Option handling

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Spec-Ref: helix-specs@97de613b3:001617_merge-latest-zed
The E2E test Docker container needs to reach the Helix API proxy for
authentication when using hl-... tokens. Two fixes:

1. run_e2e.sh: Use ANTHROPIC_BASE_URL env var for the Zed settings.json
   api_url instead of hardcoding https://api.anthropic.com. Also make
   the default model configurable via AGENT_MODEL env var.

2. run_docker_e2e.sh: Inject ANTHROPIC_BASE_URL into the container and
   resolve the hostname for --add-host injection. Special-cases
   host.docker.internal (not in /etc/hosts on Linux) by looking up the
   Docker bridge gateway IP instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Spec-Ref: helix-specs@97de613b3:001617_merge-latest-zed
…content on Stopped

The streaming text buffer (StreamingTextBuffer) in AcpThread accumulates
text chunks and reveals them gradually via a 16ms timer task. The
AcpThreadEvent::EntryUpdated fires BEFORE a new chunk is appended to the
buffer, so throttled_send_message_added captures content that is one chunk
behind.

flush_streaming_text (called just before Stopped is emitted) flushes the
buffer to the Markdown entity, but flush_streaming_throttle only sends
stored pending messages — it does not re-read the now-complete content.

For short AI responses (e.g. "4"), the entire content may arrive in one
chunk that was never captured by the throttle, leaving the Go server with
only the empty content from the initial NewEntry event. This caused
validateStore() to fail with empty ResponseMessage/ResponseEntries for
Phase 1 and Phase 3 interactions in the E2E test.

Fix: in the Stopped handler, after flush_streaming_throttle, iterate all
assistant/tool_call entries and send a fresh message_added with the current
complete content from content_only(cx) / to_markdown(cx). The Go server
accumulator uses per-messageID overwrite semantics, so these final events
correctly replace any truncated or empty content sent during streaming.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

Spec-Ref: helix-specs@97de613b3:001617_merge-latest-zed
@lukemarsden
lukemarsden merged commit d519bb0 into main Mar 23, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.