Release Notes:
- Added channel reordering for administrators (use `cmd-up` and
`cmd-down` on macOS or `ctrl-up` `ctrl-down` on Linux to move channels
up or down within their parent)
## Summary
This PR introduces the ability for channel administrators to reorder
channels within their parent context, providing better organizational
control over channel hierarchies. Users can now move channels up or down
relative to their siblings using keyboard shortcuts.
## Problem
Previously, channels were displayed in alphabetical order with no way to
customize their arrangement. This made it difficult for teams to
organize channels in a logical order that reflected their workflow or
importance, forcing users to prefix channel names with numbers or
special characters as a workaround.
## Solution
The implementation adds a persistent `channel_order` field to channels
that determines their display order within their parent. Channels with
the same parent are sorted by this field rather than alphabetically.
## Implementation Details
### Database Schema
Added a new column and index to support efficient ordering:
```sql
-- crates/collab/migrations/20250530175450_add_channel_order.sql
ALTER TABLE channels ADD COLUMN channel_order INTEGER NOT NULL DEFAULT 1;
CREATE INDEX CONCURRENTLY "index_channels_on_parent_path_and_order" ON "channels" ("parent_path", "channel_order");
```
### RPC Protocol
Extended the channel proto with ordering support:
```proto
// crates/proto/proto/channel.proto
message Channel {
uint64 id = 1;
string name = 2;
ChannelVisibility visibility = 3;
int32 channel_order = 4;
repeated uint64 parent_path = 5;
}
message ReorderChannel {
uint64 channel_id = 1;
enum Direction {
Up = 0;
Down = 1;
}
Direction direction = 2;
}
```
### Server-side Logic
The reordering is handled by swapping `channel_order` values between
adjacent channels:
```rust
// crates/collab/src/db/queries/channels.rs
pub async fn reorder_channel(
&self,
channel_id: ChannelId,
direction: proto::reorder_channel::Direction,
user_id: UserId,
) -> Result<Vec<Channel>> {
// Find the sibling channel to swap with
let sibling_channel = match direction {
proto::reorder_channel::Direction::Up => {
// Find channel with highest order less than current
channel::Entity::find()
.filter(
channel::Column::ParentPath
.eq(&channel.parent_path)
.and(channel::Column::ChannelOrder.lt(channel.channel_order)),
)
.order_by_desc(channel::Column::ChannelOrder)
.one(&*tx)
.await?
}
// Similar logic for Down...
};
// Swap the channel_order values
let temp_order = channel.channel_order;
channel.channel_order = sibling_channel.channel_order;
sibling_channel.channel_order = temp_order;
}
```
### Client-side Sorting
Optimized the sorting algorithm to avoid O(n²) complexity:
```rust
// crates/collab/src/db/queries/channels.rs
// Pre-compute sort keys for efficient O(n log n) sorting
let mut channels_with_keys: Vec<(Vec<i32>, Channel)> = channels
.into_iter()
.map(|channel| {
let mut sort_key = Vec::with_capacity(channel.parent_path.len() + 1);
// Build sort key from parent path orders
for parent_id in &channel.parent_path {
sort_key.push(channel_order_map.get(parent_id).copied().unwrap_or(i32::MAX));
}
sort_key.push(channel.channel_order);
(sort_key, channel)
})
.collect();
channels_with_keys.sort_by(|a, b| a.0.cmp(&b.0));
```
### User Interface
Added keyboard shortcuts and proper context handling:
```json
// assets/keymaps/default-macos.json
{
"context": "CollabPanel && not_editing",
"bindings": {
"cmd-up": "collab_panel::MoveChannelUp",
"cmd-down": "collab_panel::MoveChannelDown"
}
}
```
The CollabPanel now properly sets context to distinguish between editing
and navigation modes:
```rust
// crates/collab_ui/src/collab_panel.rs
fn dispatch_context(&self, window: &Window, cx: &Context<Self>) -> KeyContext {
let mut dispatch_context = KeyContext::new_with_defaults();
dispatch_context.add("CollabPanel");
dispatch_context.add("menu");
let identifier = if self.channel_name_editor.focus_handle(cx).is_focused(window) {
"editing"
} else {
"not_editing"
};
dispatch_context.add(identifier);
dispatch_context
}
```
## Testing
Comprehensive tests were added to verify:
- Basic reordering functionality (up/down movement)
- Boundary conditions (first/last channels)
- Permission checks (non-admins cannot reorder)
- Ordering persistence across server restarts
- Correct broadcasting of changes to channel members
## Migration Strategy
Existing channels are assigned initial `channel_order` values based on
their current alphabetical sorting to maintain the familiar order users
expect:
```sql
UPDATE channels
SET channel_order = (
SELECT ROW_NUMBER() OVER (
PARTITION BY parent_path
ORDER BY name, id
)
FROM channels c2
WHERE c2.id = channels.id
);
```
## Future Enhancements
While this PR provides basic reordering functionality, potential future
improvements could include:
- Drag-and-drop reordering in the UI
- Bulk reordering operations
- Custom sorting strategies (by activity, creation date, etc.)
## Checklist
- [x] Database migration included
- [x] Tests added for new functionality
- [x] Keybindings work on macOS and Linux
- [x] Permissions properly enforced
- [x] Error handling implemented throughout
- [x] Manual testing completed
- [x] Documentation updated
---------
Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
Nathan Sobo
and
Mikayla Maki
created
c3653f4
docs: Update "Burn Mode" callout in the models page (#31995)
Click to expand commit body
To be merged tomorrow after the release, which will make the "Burn Mode"
terminology live on stable.
Release Notes:
- N/A
Fixes #31810
Release Notes:
- Fixed a crash that could occur when editing YAML files.
Max Brunsfeld
created
aefb798
inline assistant: Allow to attach images from clipboard (#32087)
Click to expand commit body
Noticed while working on #31848 that we do not support pasting images as
context in the inline assistant
Release Notes:
- agent: Add support for attaching images as context from clipboard in
the inline assistant
Bennet Bo Fenner
created
2c5aa58
Don't show invisibles from inlays (#32088)
Click to expand commit body
Closes #24266
Release Notes:
- Whitespace added by inlay hints is no longer shown when
`"show_whitespaces": "all"` is used.
-
Conrad Irwin
created
7d54d9f
agent: Show warning for image context pill if model doesn't support images (#31848)
Click to expand commit body
Closes #31781
Currently we don't any warning or error if the image is not supported by
the current model in selected in the agent panel which leads for users
to think it's supported as there is no visual feedback provided by zed.
This PR adds a warning on image context pill to show warning when the
model doesn't support it.
| Before | After |
|--------|-------|
| <img width="374" alt="image"
src="https://github.com/user-attachments/assets/da659fb6-d5da-4c53-8878-7a1c4553f168"
/> | <img width="442" alt="image"
src="https://github.com/user-attachments/assets/0f23d184-6095-47e2-8f2b-0eac64a0942e"
/> |
Release Notes:
- Show warning for image context pill in agent panel when selected model
doesn't support images.
---------
Signed-off-by: Umesh Yadav <git@umesh.dev>
Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de>
Umesh Yadav
and
Bennet Bo Fenner
created
cde47e6
assistant_tools: Disallow extra tool parameters by default (#32081)
Click to expand commit body
This prevents models from hallucinating tool parameters.
Release Notes:
- Prevent models from hallucinating tool parameters
Oleksiy Syvokon
created
79f96a5
docs: Improve LuaLS formatter example (#32084)
81058ee
Make `alt-left` and `alt-right` skip punctuation like VSCode (#31977)
Click to expand commit body
Closes https://github.com/zed-industries/zed/discussions/25526
Follow up of #29872
Release Notes:
- Make `alt-left` and `alt-right` skip punctuation on Mac OS to respect
the Mac default behaviour. When pressing alt-left and the first
character is a punctuation character like a dot, this character should
be skipped. For example: `hello.|` goes to `|hello.`
This change makes the editor feels much snappier, it now follows the
same behaviour as VSCode and any other Mac OS native application.
@ConradIrwin
Tommy D. Rossi
created
8974311
vim: Add `Ctrl-w ]` and `Ctrl-w Ctrl-]` keymaps (#31990)
Click to expand commit body
Closes #31989
Release Notes:
- Added support for `Ctrl-w ]` and `Ctrl-w Ctrl-]` to go to a definition
in a new split
Alejandro Fernández Gómez
created
6de37fa
Don't show squiggles on unnecesarry code (#32082)
Click to expand commit body
Co-Authored-By: @davidhewitt <mail@davidhewitt.dev>
Closes #31747
Closes https://github.com/zed-industries/zed/issues/32080
Release Notes:
- Fixed a recently introduced bug where unnecessary code was underlined
with blue squiggles
Co-authored-by: @davidhewitt <mail@davidhewitt.dev>
This PR is a refactor of the existing `ModelType` in
`agent_model_selector`.
In #31848 we also need to know which context we are operating in, to
check if the configured model has image support.
In order to deduplicate the logic needed, I introduced a new type called
`ModelUsageContext` which can be used throughout the agent crate
Release Notes:
- N/A
Bennet Bo Fenner
created
c9aadad
Add a script to connect to the database. (#32023)
Click to expand commit body
This avoids needing passwords in plaintext on the command line....
Release Notes:
- N/A
8e9e3ba
ruby: Add `sorbet` and `steep` to the list of available language servers (#32008)
Click to expand commit body
Hi, this pull request adds `sorbet` and `steep` to the list of available
language servers for the Ruby language in order to prepare default Ruby
language settings for these LS. Both language servers are disabled by
default. We plan to add both in #104 and #102. Thanks!
Release Notes:
- ruby: Added `sorbet` and `steep` to the list of available language servers.
Vitaly Slobodin
created
676ed8f
agent: Use new `has_pending_edit_tool_use` state for toolbar review buttons (#32071)
Click to expand commit body
Follow up to https://github.com/zed-industries/zed/pull/31971. Now, the
toolbar review buttons will also appear/be available at the same time as
the panel buttons.
Release Notes:
- N/A
Danilo Leal
created
4304521
Remove unused load_model method from LanguageModelProvider (#32070)
Click to expand commit body
Removes the load_model trait method and its implementations in Ollama
and LM Studio providers, along with associated preload_model functions
and unused imports.
Release Notes:
- N/A
Ben Brandt
created
04716a0
edit_file_tool: Fail when edit location is not unique (#32056)
Click to expand commit body
When `<old_text>` points to more than one location in a file, we used to
edit the first match, confusing the agent along the way. Now we will
return an error, asking to expand `<old_text>` selection.
Closes #ISSUE
Release Notes:
- agent: Fixed incorrect file edits when edit locations are ambiguous
Oleksiy Syvokon
created
5e38915
Properly register buffers with reused language servers (#32057)
Click to expand commit body
Follow-up of https://github.com/zed-industries/zed/pull/30707
The old code does something odd, re-accessing essentially the same
adapter-server pair for every language server initialized; but that was
done before for "incorrect", non-reused worktree_id hence never resulted
in external worktrees' files registration in this code path.
Release Notes:
- Fixed certain external worktrees' files sometimes not registered with
language servers
Kirill Bulatov
created
f9257b0
debugger: Use UUID for Go debug binary names, do not rely on OUT_DIR (#32004)
Click to expand commit body
It seems that there was a regression. `build_config` no longer has an
`OUT_DIR` in it.
On way to mitigate it is to stop relying on it and just use `cwd` as dir
for the test binary to be placed in.
Release Notes:
- N/A
---------
Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
Alex
and
Piotr Osiewicz
created
5d0c968
editor: Stabilize IME candidate box position during pre-edit on Wayland (#28429)
Click to expand commit body
Modify the `replace_and_mark_text_in_range` method in the `Editor` to
keep the cursor at the start of the preedit range during IME
composition. Previously, the cursor would move to the end of the preedit
text with each update, causing the IME candidate box to shift (e.g.,
when typing pinyin with Fcitx5 on Wayland). This change ensures the
cursor and candidate box remain fixed until the composition is
committed, improving the IME experience.
Closes #21004
Release Notes:
- N/A
---------
Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
Co-authored-by: 张小白 <364772080@qq.com>
Wanten
,
Mikayla Maki
, and
张小白
created
071e684
bedrock: Fix ci failure due model enum and model name mismatch (#32049)
Click to expand commit body
Release Notes:
- N/A
Umesh Yadav
created
2280594
bedrock: Allow users to pick Thinking vs. Non-Thinking models (#31600)
Click to expand commit body
Release Notes:
- bedrock: Added ability to pick between Thinking and Non-Thinking models
Shardul Vaidya
created
09a1d51
bedrock: Fix Claude 4 output token bug (#31599)
Click to expand commit body
Release Notes:
- Fixed an issue preventing the use of Claude 4 Thinking models with Bedrock
Shardul Vaidya
created
ac15194
docs: Add OpenRouter agent support (#32011)
Click to expand commit body
Update few other docs as well. Like recently tool support was added for
deepseek. Also there was recent thinking and images support for ollama
model.
Release Notes:
- N/A
Umesh Yadav
created
988d834
project_panel: When initiating a drag the highlight selection should jump to the item you've picked up (#32044)
Click to expand commit body
Closes #14496.
In https://github.com/zed-industries/zed/pull/31976, we modified the
highlighting behavior for entries when certain entries or paths are
being dragged over them. Instead of relying on marked entries for
highlighting, we introduced the `highlight_entry_id` parameter, which
determines which entry and its children should be highlighted when an
item is being dragged over it.
The rationale behind that is that we can now utilize marked entries for
various other functions, such as:
1. When dragging multiple items, we use marked entried to show which
items are being dragged. (This is already covered because to drag
multiple items, you need to use marked entries.)
2. When dragging a single item, set that item to marked entries. (This
PR)
https://github.com/user-attachments/assets/8a03bdd4-b5db-467d-b70f-53d9766fec52
Release Notes:
- Added highlighting to entries being dragged in the Project Panel,
indicating which items are being moved.
Smit Barmase
created
48eacf3
Add `#[track_caller]` to test utilities that involve marked text (#32043)
Click to expand commit body
Release Notes:
- N/A
Michael Sloan
created
030d4d2
project_panel: Holding `alt` or `shift` to copy the file should adds a green (+) icon to the mouse cursor (#32040)
Click to expand commit body
Part of https://github.com/zed-industries/zed/issues/14496
Depends on new API https://github.com/zed-industries/zed/pull/32028
Holding `alt` or `shift` to copy the file should add a green (+) icon to
the mouse cursor to indicate this is a copy operation.
1. Press `option` first, then drag:
https://github.com/user-attachments/assets/ae58c441-f1ab-423e-be59-a8ec5cba33b0
2. Drag first, then press `option`:
https://github.com/user-attachments/assets/5136329f-9396-4ab9-a799-07d69cec89e2
Release Notes:
- Added copy-drag cursor when pressing Alt or Shift to copy the file in
Project Panel.
Smit Barmase
created
10df7b5
gpui: Add API for read and write active drag cursor style (#32028)
Click to expand commit body
Prep for https://github.com/zed-industries/zed/pull/32040
Currently, there’s no way to modify the cursor style of the active drag
state after dragging begins. However, there are scenarios where we might
want to change the cursor style, such as pressing a modifier key while
dragging. This PR introduces an API to update and read the current
active drag state cursor.
Release Notes:
- N/A
Smit Barmase
created
55120c4
Properly load environment variables from the login shell (#31799)
Click to expand commit body
Fixes #11647
Fixes #13888
Fixes #18771
Fixes #19779
Fixes #22437
Fixes #23649
Fixes #24200
Fixes #27601
Zed’s current method of loading environment variables from the login
shell has two issues:
1. Some shells—fish in particular—write specific escape characters to
`stdout` right before they exit. When this happens, the tail end of the
last environment variable printed by `/usr/bin/env` becomes corrupted.
2. If a multi-line value contains an equals sign, that line is
mis-parsed as a separate name-value pair.
This PR addresses those problems by:
1. Redirecting the shell command's `stdout` directly to a temporary
file, eliminating any side effects caused by the shell itself.
2. Replacing `/usr/bin/env` with `sh -c 'export -p'`, which removes
ambiguity when handling multi-line values.
Additional changes:
- Correctly set the arguments used to launch a login shell under `csh`
or `tcsh`.
- Deduplicate code by sharing the implementation that loads environment
variables on first run with the logic that reloads them for a project.
Release Notes:
- N/A
d23359e
debugger: Fix issues with running Zed-installed debugpy + hangs when downloading (#32034)
Click to expand commit body
Closes #32018
Release Notes:
- Fixed issues with launching Python debug adapter downloaded by Zed.
You might need to clear the old install of Debugpy from
`$HOME/.local/share/zed/debug_adapters/Debugpy` (Linux) or
`$HOME/Library/Application Support/Zed/debug_adapters/Debugpy` (Mac).
Piotr Osiewicz
created
936ad0b
Use better fallback for empty rerun action (#32031)
Click to expand commit body
When invoking the task rerun action before any task had been run, it
falls back to task selection modal.
Adjust this fall back to use the debugger view, if available:
Before:

After:

Release Notes:
- N/A
Based on
https://github.com/zed-industries/zed/issues/18673#issuecomment-2933025951
Adds an anyhow error context with the path used for canonicalization
(also, explicitly mention path at the place from the comment).
Release Notes:
- N/A
Kirill Bulatov
created
2db2271
Do not activate inactive tabs when pinning or unpinning
Click to expand commit body
Closes https://github.com/zed-industries/zed/issues/32024
Release Notes:
- Fixed a bug where inactive tabs would be activated when pinning or
unpinning.
81f8e2e
Limit BufferSnapshot::surrounding_word search to 256 characters (#32016)
Click to expand commit body
This is the first step to closing #16120. Part of the problem was that
`surrounding_word` would search the whole line for matches with no
limit.
Co-authored-by: Conrad Irwin \<conrad@zed.dev\>
Co-authored-by: Ben Kunkle \<ben@zed.dev\>
Co-authored-by: Cole Miller \<cole@zed.dev\>
Release Notes:
- N/A
This adds João's nice suggestion from
https://github.com/zed-industries/zed/pull/31818#discussion_r2118582616.
Release Notes:
- N/A
---------
Co-authored-by: João Marcos <marcospb19@hotmail.com>
Gilles Peiffer
and
João Marcos
created
27d3da6
editor: Fix panic when full width crease is wrapped (#31960)
Click to expand commit body
Closes #31919
Release Notes:
- Fixed a panic that could sometimes occur when the agent panel was too
narrow and contained context included via `@`.
---------
Co-authored-by: Antonio <antonio@zed.dev>
Co-authored-by: Antonio Scandurra <me@as-cii.com>
Bennet Bo Fenner
,
Antonio
, and
Antonio Scandurra
created
03357f3
Fix panic when re-editing old message with creases (#32017)
Click to expand commit body
Co-authored-by: Cole Miller <m@cole-miller.net>
Release Notes:
- agent: Fixed a panic when re-editing old messages
---------
Co-authored-by: Cole Miller <m@cole-miller.net>
Co-authored-by: Cole Miller <cole@zed.dev>
Conrad Irwin
,
Cole Miller
, and
Cole Miller
created
4aabba6
Improve Zed prompts for file path selection (#32014)
Click to expand commit body
Part of https://github.com/zed-industries/zed/discussions/31653
`"use_system_path_prompts": false` is needed in settings for these to
appear as modals for new file save and file open.
Fixed a very subpar experience of the "save new file" Zed modal,
compared to a similar "open file path" Zed modal by uniting their code.
Before:
https://github.com/user-attachments/assets/c4082b70-6cdc-4598-a416-d491011c8ac4
After:
https://github.com/user-attachments/assets/21ca672a-ae40-426c-b68f-9efee4f93c8c
Also
* alters both prompts to start in the current worktree directory, with
the fallback to home directory.
* adjusts the code to handle Windows paths better
Release Notes:
- Improved Zed prompts for file path selection
---------
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Kirill Bulatov
and
Smit Barmase
created
8c46a4f
Make completions menu stay open after after it's manually requested (#32015)
Click to expand commit body
Also includes a clarity refactoring to remove
`ignore_completion_provider`.
Closes #15549
Release Notes:
- Fixed completions menu closing on typing after being requested while
`show_completions_on_input: false`.
Michael Sloan
created
522abe8
Change default formatter settings for LaTeX (#28727)
Click to expand commit body
Closes: https://github.com/rzukic/zed-latex/issues/77
## Default formatter: `latexindent`
Before, formatting was delegated to the language server, which just ran
a `latexindent` executable. There was no benefit to running it through
the language server over running it as an "external" formatter in zed.
In fact this was an issue because there was no way to provide an
explicit path for the executable (causing above extension issue). Having
the default settings configure the formatter directly gives more control
to user and removes the number of indirections making it clearer how to
tweak things like the executable path, or extra CLI args, etc...
## Alternative: `prettier`
Default settings have also been added to allow prettier as the formatter
(by just setting `"formatter": "prettier"` in the "LaTeX" language
settings). This was not possible before because an extra line needed to
be added to the `prettier` crate (similarly to what was done for
https://github.com/zed-industries/zed/issues/19024) to find the plugin
correctly.
> [!NOTE]
> The `prettier-plugin-latex` node module also contained a
`dist/standalone.js` but using that instead of
`dist/prettier-plugin-latex.js` gave an error, and indeed the latter
worked as intended (along with its questionable choices for formatting).
Release Notes:
- LaTeX: added default `latexindent` formatter settings without relying
on `texlab`, as well as allowing `prettier` to be chosen for formatting
---------
Co-authored-by: Peter Tripp <peter@zed.dev>
Luke Naylor
and
Peter Tripp
created
5ae8c4c
Fix word completions clobbering the text after the cursor (#32010)
Click to expand commit body
Release Notes:
- N/A
Michael Sloan
created
d8195a8
project_panel: Highlight containing folder which would be the target of the drop operation (#31976)
Click to expand commit body
Part of https://github.com/zed-industries/zed/issues/14496
This PR adds highlighting on the containing folder which would be the
target of the drop operation. It only highlights those directories where
actual drop is possible, i.e. same directory where drag started is not
highlighted.
- [x] Tests
https://github.com/user-attachments/assets/46528467-e07a-4574-a8d5-beab25e70162
Release Notes:
- Improved project panel to show a highlight on the containing folder
which would be the target of the drop operation.
Smit Barmase
created
2645591
agent: Allow to accept and reject all via the panel (#31971)
Click to expand commit body
This PR introduces the "Reject All" and "Accept All" buttons in the
panel's edit bar, which appears as soon as the agent starts editing a
file. I'm also adding here a new method to the thread called
`has_pending_edit_tool_uses`, which is a more specific way of knowing,
in comparison to the `is_generating` method, whether or not the
reject/accept all actions can be triggered.
Previously, without this new method, you'd be waiting for the whole
generation to end (e.g., the agent would be generating markdown with
things like change summary) to be able to click those buttons, when the
edit was already there, ready for you. It always felt like waiting for
the whole thing was unnecessary when you really wanted to just wait for
the _edits_ to be done, as so to avoid any potential conflicting state.
<img
src="https://github.com/user-attachments/assets/0927f3a6-c9ee-46ae-8f7b-97157d39a7b5"
width="500"/>
---
Release Notes:
- agent: Added ability to reject and accept all changes from the agent
panel.
---------
Co-authored-by: Agus Zubiaga <hi@aguz.me>
Danilo Leal
and
Agus Zubiaga
created
526a7c0
agent: Support `AGENT.md` and `AGENTS.md` as rules file names (#31998)
Click to expand commit body
These started to be used more recently, so we should also support them.
Release Notes:
- agent: Added support for `AGENT.md` and `AGENTS.md` as rules file
names.
Just polishing up a bit the Rules Library design. I think the most
confusing part here was the icon that was being used to tag a rule as
default; I've heard feedback more than once saying that was confusing,
so I'm now switching to a rather standard star icon, which I'd assume is
well-understood as a "favoriting" affordance.
Release Notes:
- N/A