Searching (and related vim stuff like `*`/`n`/`N`) now work in the LHS
of a
split diff.
Also fixes the bug with indent guides being visible through the spacer
checkerboard pattern.
Release Notes:
- N/A
Closes#46506
Release Notes:
- Fixed an issue where the codestral URL used for credentials would be
different than the one used for requests causing authentication errors
This PR extends error telemetry coverage in the agent panel, building on
#46836 which added telemetry for thread errors.
`"Agent Panel Error Shown"` (extended)
Now also fires for:
- **Load errors** - when an agent fails to start
- **Configuration errors** - when LLM provider setup is incomplete
`"Agent Token Limit Warning"` (new event)
Fires when a thread approaches or exceeds its token/context limit. This
is tracked separately from errors because it's an informational warning,
not a failure.
## Implementation Notes
- All telemetry fires **once per error occurrence**, not on every render
- Load error telemetry fires in `handle_load_error()` when the error is
first received
- Token limit telemetry uses a flag to track state transitions (Normal →
Warning → Exceeded)
- Configuration error telemetry tracks the last emitted error kind to
avoid duplicates
Release Notes:
- N/A *or* Added/Fixed/Improved ...
---------
Co-authored-by: Michael Benfield <mbenfield@zed.dev>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This PR adds a new `supported_effort_levels` method to the
`LanguageModel` trait.
This can be used to retrieve the list of effort levels that the model
supports, which will eventually be used to drive the UI for selecting
the thinking effort.
Right now this list will only be populated for Cloud models.
Release Notes:
- N/A
The provider dropdown and GitHub Copilot sign-in button were not
tab-navigable because they lacked tab_index. The copilot button
conditionally sets tab_index only when edit_prediction is true, since
it's also used in the agent configuration panel where tab navigation
isn't used.
Closes#48391
Release Notes:
- Fixed focus skipping provider dropdown and GitHub Copilot button in
edit prediction settings
Implements the enhancement requested in #24655 - enables tab switcher to
show all open files across all panes deduped. It's called "follow mode"
because whichever is the active pane is ALWAYS where the file, terminal,
etc will be opened from the tab switcher (not married to this mode
name).
Adds `follow_mode: true` option to `tab_switcher::ToggleAll`. When
enabled:
- **Shows all tabs across panes** - Same file in multiple panes appears
once (deduped by path)
- **Opens in active pane** - Selecting a file opens it in current pane,
creating independent editor instances
- **Moves terminals** - Non-file items (terminals, multibuffers) move to
current pane instead of duplicating
- **Preview & restore** - Navigate with arrow keys / tab to preview,
Escape restores original state
Intended for vim/helix `:buffers` command workflow while respecting
Zed's tab-based paradigm.
### Usage
```json
["tab_switcher::ToggleAll", {"follow_mode": true}]
```
### Implementation
**Preview pattern:** Clone item handles during navigation, clean up on
dismiss
- **Files**: Preview with cloned handle, confirm closes preview and
opens fresh (independent editors)
- **Terminals**: Preview with cloned handle, confirm removes from source
(moves to current pane)
**Key technical details:**
- Ignore workspace events during follow mode to prevent list re-sorting
from preview operations
- Preserve preview tab status on confirm
- Close operations remove from all panes in follow mode
- Remove from source before activating to ensure correct focus
management
### Test Coverage
21 tests total (14 new follow mode tests):
- File behavior: deduplication, independent editors, preview status
preservation, close behavior
- Non-file behavior: terminal movement, focus management, single pane
scenarios
- General: MRU stability, restore on dismiss
### Release Notes
- Added `follow_mode` option to `tab_switcher::ToggleAll` for vim-style
buffer list showing all deduped open files across panes opening in
active pane
## Q&A
**Q: Why not tie this to vim mode?**
A: This feature is different enough from vim/helix buffer behavior that
I opted not to couple them. It is an approximation using Zed's tab
switcher/picker and would take architectural changes to implement real
vim/helix buffers. Additionally, both follow mode and regular tab
switcher mode are useful window/tab management workflows that vim or
non-vim users may want regardless of their editing mode preference.
**Q: How to use this?**
A: For a vim/helix-like workflow:
1. **Bind the follow mode tab switcher** - Add to your keymap:
```json
{
"context": "Workspace",
"bindings": {
"cmd-i": ["tab_switcher::ToggleAll", {"follow_mode": true}]
}
}
```
2. **Hide the tab bar (optional)** - Add to settings:
```json
{
"tab_bar": {
"show": false
}
}
```
3. **Move tabs to other pane on close (optional)** - Add to your keymap
to join tabs into next pane when closing:
```json
{
"context": "Pane",
"bindings": {
"cmd-w": "pane::JoinIntoNext"
}
}
```
This makes closing a tab behave more like vim's split closure - items
move to the adjacent pane instead of being closed.
If you find that you'd rather have the tab bar visible, there's a pretty
good chance you don't need/want this feature. Vim/helix don't have
visible tab bars, so this feature is primarily for users who want that
sort of experience where buffers are not tied to a specific split/pane
and closing a split does not impact the available buffers.
## Future Work
A few additional features could make for more complete vim/helix-like
buffer workflow:
**`:bd` (buffer delete) improvements:**
- Should close the buffer from ALL panes, not just the current one
- Current implementation: `workspace::CloseActiveItem` only closes in
current pane
- Needed: New action like `workspace::CloseActiveItemAcrossPanes` and/or
update vim command mapping
**`:q` (quit) improvements:**
- Should close the split/pane while preserving its tabs
- Behavior: merge tabs into next pane (like `pane::JoinIntoNext`),
unless it's the last pane
- Last pane: close the pane and all its items
- Current implementation: `workspace::CloseActiveItem` closes active
item, not the pane
- Needed: New action or pane closure logic that moves tabs before
closing
These are complementary to this feature and can be done as separate PRs.
Release Notes:
- Add `tab_switcher::ToggleUnique` to allow a more vim-like tab
switching experience.
This PR removes the `fn name()` default method from the `AgentTool`
trait (which just returned `Self::NAME`) and replaces all call sites
with direct use of the `NAME` associated constant. This lets us use it
as a single source of truth in macros that want to access it at compile
time.
This PR also replaces hardcoded tool name string literals throughout the
codebase with the corresponding `NAME` constants, so tool name
references stay in sync if a tool is renamed.
Intentionally not changed:
- **Display strings** like `"Thinking"` and `"Subagent"` (user-facing UI
labels)
- **Serde attributes** like `#[serde(rename = "thinking")]` (wire
format)
- **The test assertion** `assert_eq!(SubagentTool::NAME, "subagent")`
(replacing the literal would make it tautological)
- **MCP server names** like `"mcp:srv:terminal"` (not tool identifiers)
Release Notes:
- N/A
<img width="588" height="485" alt="Screenshot 2026-02-05 at 1 29 10 PM"
src="https://github.com/user-attachments/assets/f3d36c8b-b371-4226-af60-bdc2c6b34009"
/>
<img width="586" height="468" alt="Screenshot 2026-02-05 at 1 30 15 PM"
src="https://github.com/user-attachments/assets/878e91ad-948c-4b35-a37b-f5a8db7e0b3f"
/>
This adds Claude Opus 4.6 as a new Anthropic model, along with 1M
context window variants for both Opus 4.6 and Sonnet 4.5.
## Opus 4.6
Adds `ClaudeOpus4_6` and `ClaudeOpus4_6Thinking` with the same
properties as other Claude 4+ models (200k context, 8192 max output
tokens, fine-grained tool streaming beta header).
## 1M context variants
Adds 1M context window variants for Sonnet 4.5 and Opus 4.6. These are
identical to their base models except:
- Context window is 1,000,000 tokens instead of 200,000
- They send the `context-1m-2025-08-07` beta header
Release Notes:
- Added Claude Opus 4.6
- Now Claude Opus 4.6 and Sonnet 4.5 BYOK models support variations that
have context windows of 1 million tokens (and have different pricing)
Release Notes:
- Fixed `HelixSelectLine` with an empty first line and a pre-existing
selection.
---------
Co-authored-by: Jakub Konka <kubkon@jakubkonka.com>
Co-authored-by: Lena Falk <lena@zed.dev>
When the version is the same we used to still seek through the
underlying fragment sumtree despite having nothing to return. This has a
lot of unnecessary overhead.
Release Notes:
- N/A *or* Added/Fixed/Improved ...
Follow-up of https://github.com/zed-industries/zed/pull/46356
* better selection in highlights panel to show the color of the active
item
* no `DiffbaselessAnchor` entity to cause flickering and highlighting
issues
* react on theme and theme settings change and refresh semantic tokens
* do not eagerly flicker when refreshing the tokens
* do not show semantic tokens in the editor menu for non-applicable
buffers
Release Notes:
- N/A
Otherwise cloning the snapshot is more expensive than it should be.
Release Notes:
- N/A *or* Added/Fixed/Improved ...
Co-authored-by: Cole Miller <cole@zed.dev>
The icons in the far left of the multibuffer toolbar were shifting a bit
to the side when toggling the buffer search, so this PR fixes that. I'm
also removing the labeled button for the expand/collapse all excerpts;
relying only on the icon-button version of it, given it's simpler and
similarly clear.
https://github.com/user-attachments/assets/8ee44c9f-3082-4160-ac77-a3cf489b318a
Release Notes:
- N/A
This also fixes the isolated whitespace change metric, which is not
takes cursor position into account (it's okay to insert a newline if it
has a cursor on it)
Release Notes:
- N/A
The previous URL pointed to the model access page which no longer exists
(not a 404, tho). The model catalog page is the current location for
selecting and requesting access to Bedrock models.
| Before | After |
|--------|--------|
| <img width="1732" height="1125" alt="Screenshot 2026-02-04 at 12 50
13"
src="https://github.com/user-attachments/assets/f513e7c9-aa70-439a-afd0-ef8177ada463"
/> | <img width="1732" height="1125" alt="Screenshot 2026-02-04 at 12 52
11"
src="https://github.com/user-attachments/assets/6609215e-1bbb-4ed1-b57d-422ed7893498"
/> |
Release Notes:
- Fixed Bedrock model catalog URL in Agent Panel settings
Round 2 of #46269 with conflicts properly resolved.
This came up a few times across various extensions. With us about to
ship a new API version soon, it might be worth to add.
Release Notes:
- N/A
---------
Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
This moves some more of our CI jobs over to xtask and gh-workflow. This
primarily originated from the current GitHub actions outage to move
these actions over to Namespace runners. However, while I was at it I
decided to move these over to gh_workflow, as we benefit from sharing
more stuff across these files and less hacking around in YAML-files
directly.
Release Notes:
- N/A
Fixes an issue where syntax highlighting would be incorrect in certain
cases for JS, because of duplicate keyword definitions.
Release Notes:
- Fixed issue where certain keywords were incorrectly highlighted in JS
files
Apple recommends checking the system’s thermal state and adjusting
behavior to reduce resource usage, giving the system a chance to cool
down. While this API is macOS-specific, the same idea likely applies to
other platforms - those are intentionally out of scope for this PR.
As a first step, we cap the frame rate at 60 fps when the system reports
a critical thermal state. In that situation, pushing higher frame rates
doesn’t buy us anything and just adds more heat. This also gives us a
hook for future improvements, like reducing other work when the system
is under sustained thermal pressure.
Ref:
https://developer.apple.com/library/archive/documentation/Performance/Conceptual/power_efficiency_guidelines_osx/RespondToThermalStateChanges.html
Release Notes:
- Zed now reduces resource usage when the system is under high thermal
stress
---------
Signed-off-by: Marco Mihai Condrache <52580954+marcocondrache@users.noreply.github.com>
Co-authored-by: Anthony Eid <anthony@zed.dev>
The other day I was testing the debugging feature and I noticed a
**very** small visual bug. When you click on the breakpoint circle to
set a breakpoint, the breakpoint color remains in the wrong state until
the mouse moves.
After debugging for a while, I noticed that the issue was that the
PhantomVariableIndicator variable attribute
`collides_with_existing_breakpoint` was not being updated until the
mouse moved. With the following change, the attribute is updated when
the user clicks the breakpoint, toggleling tha attribute.
### Prior behaviour:
https://github.com/user-attachments/assets/3dfa8e25-e970-49a3-8e87-0ecadabb3a3c
As you can see in the video, prior to this change, the breakpoint would
only change to the correct color when the mouse moved.
### New behaviour
https://github.com/user-attachments/assets/356e84dc-42e5-4440-afab-0fbc4b3a1f0a
With this new change, the breakpoint updates right after the user
clicks, no need to move the mouse.
### Disclaimers
- I'm new to this codebase, so any feedback is extremely welcomed! If
you know of a better place where this could be handled, let me know and
I'll explore further.
https://github.com/user-attachments/assets/12d4b9df-e5d7-4955-b58d-dd63563c5c1b
Release Notes:
- N/A
---------
Co-authored-by: Anthony Eid <anthony@zed.dev>
Currently we always compute breadcrumbs and sticky headers on every
editor paint which is not cheap to do especially in bigger files, moving
this off to be computed on event handling where they change and then
caching them can save serveral milliseconds per render in bigger files.
This also puts matching brackets refreshing and document highlights on a
background task, as this tends to block the main task for prolonged time
as well.
Release Notes:
- N/A *or* Added/Fixed/Improved ...
Thanks to @jackTabsCode for the original commit that I based my work off
of.
See: #27703
Release Notes:
- Fixed clicking "Collapse All" from context menu on a project root
collapsing all project roots instead of that one.
- Added new `project panel: collapse selected entry and children` action
that collapses the selected directory and all its subdirectories.
- Added "Collapse All" option to the context menu for all directories,
not just project roots.
---------
Co-authored-by: Jack T <jack@jackt.space>
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
For: https://github.com/zed-industries/zed/pull/47328
Release Notes:
- Fixed an issue where selecting "Collapse All" on the root directory or
triggering the collapse all action would sometimes collapse the entire
root instead of keeping it expanded when there's a single worktree.
## Problem
Zed's terminal permission system validates commands using regex patterns
against string representations of parsed commands. The
`SimpleCommand::to_string()` method in brush-parser preserves the raw
lexical form including shell quotes, causing pattern matching to fail on
obfuscated commands.
For example, all of these are semantically equivalent to `rm -rf /` in
POSIX shells, but produced different strings from `to_string()` that
bypassed the hardcoded deny pattern `rm\s+(-[rf]+\s+)*/\s*$`:
| Input | `extract_commands()` returned | Matched deny pattern? |
|---|---|---|
| `rm -rf /` | `"rm -rf /"` | ✅ Yes |
| `rm -rf '/'` | `"rm -rf '/'"` | ❌ No |
| `'rm' -rf /` | `"'rm' -rf /"` | ❌ No |
| `r'm' -rf /` | `"r'm' -rf /"` | ❌ No |
| `rm -r'f' /` | `"rm -r'f' /"` | ❌ No |
| `rm -rf \/` | `"rm -rf \\/"` | ❌ No |
Both hardcoded deny patterns (Phase 2, which operates on extracted
sub-commands) and user-configured `always_deny` patterns were affected.
## Fix
Replace the `simple_command.to_string()` call in
`extract_commands_from_simple_command` with manual construction that:
1. Iterates the command name (`word_or_name`) and word arguments from
the suffix
2. Normalizes each word by parsing it into `WordPiece`s via
`brush_parser::word::parse`
3. Reconstructs the semantic (unquoted) value from each piece:
- `Text` — used as-is
- `SingleQuotedText` — used as-is (brush-parser already strips the
wrapping quotes)
- `EscapeSequence` — leading `\` stripped to produce the unescaped
character
- `AnsiCQuotedText` — used as-is (brush-parser already evaluates
`$'...'`)
- `DoubleQuotedSequence` / `GettextDoubleQuotedSequence` — inner pieces
recursively normalized
- `TildePrefix` — preserved as `~` + suffix
- `ParameterExpansion` / `CommandSubstitution` /
`BackquotedCommandSubstitution` / `ArithmeticExpression` — original
source text preserved so patterns like `\$HOME` and `\${HOME}` continue
to match
4. Joins normalized words with spaces
Falls back to the raw `word.value` if word parsing fails.
## Cross-shell safety
The normalization operates on POSIX-parsed ASTs (brush-parser uses POSIX
grammar), so it applies POSIX quoting rules. For non-POSIX shells
(Nushell, PowerShell, Xonsh, Elvish, etc.) where quoting semantics
differ, any mismatch results in false positives (overly cautious
denials), never false negatives. This is the correct error direction for
a security feature. When brush-parser fails to parse a non-POSIX
command, `extract_commands` returns `None` and the existing fallback
(raw-string matching with `allow_enabled=false`) handles it.
(No release notes because granular tool permissions are still
feautre-flagged.)
Release Notes:
- N/A
`find_target()` failed to match numbers followed by a dot and a
non-digit (e.g. `1. item`), because the dot unconditionally reset
the scan state, discarding the number. Additionally, numbers at the
start of non-first lines were missed because the backward scan
stopped on the preceding newline and the forward scan immediately
broke on it.
Closes#47761
Release Notes:
- Fixed vim increment (`ctrl-a`) and decrement (`ctrl-x`) not working on Markdown ordered list markers like `1.`, `2.`, etc.
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: dino <dinojoaocosta@gmail.com>
- Update AI docs with missing features we shipped in December 2025
- Apply new brand voice to new docs
Release Notes:
- N/A *or* Added/Fixed/Improved ...
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
These changes update subword motions in order to also take `$` and `=`
into consideration as stopping punctuation, improving the subword
motions for certain languages where `$` and `=` are commonly used, like
PHP, for variables and assignments.
Closes#48267
Release Notes:
- Improved Vim's subword motions to stop at `$` and `=` characters