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
Before this change any agent diff caused us to recompute the entire
buffer's wraps, because we didn't handle the base text of diffs
changing.
Now, thanks to anchors, we can do that.
Release Notes:
- Fixed the editor rewrapping like crazy when agent edits were present
Adds `checkerboard` to `Background`, and use it for the side-by-side
diff.
Note that, since the blockmap can contain multiple `Spacer`s without any
gaps
in between, we ensure that the checkerboard pattern always shows an even
integer number of squares per line, so there are no obvious
discontinuities
in the pattern when this happens.
<img width="590" height="300" alt="image"
src="https://github.com/user-attachments/assets/e8f75f90-b230-4078-bce0-cb3c15613fe7"
/>
Release Notes:
- N/A *or* Added/Fixed/Improved ...
---------
Co-authored-by: Cole Miller <cole@zed.dev>
This extends the LSP settings schema system to also provide autocomplete
for the `settings` field (used for `workspace/configuration` responses),
in addition to the existing `initialization_options` support (#).
Changes:
- Add `settings_schema` method to `LspAdapter` trait and
`CachedLspAdapter`
- Update schema URL paths to be more explicit:
- `lsp/{adapter}/initialization_options` for init options schema
- `lsp/{adapter}/settings` for settings schema
- Add schema resolution logic for the new settings path
- Update tests to verify both schema references
Release Notes:
- Added autocomplete support for the `settings` field in LSP
configuration, complementing the existing `initialization_options`
autocomplete.
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Finn found out the hard way that the new cool tech does not quite work
at times. Back to the drawing board we go (at least partially).
Closes #ISSUE
Release Notes:
- N/A
## Summary
Reviewed and updated all 18 files in `docs/src/ai/` to meet Zed's brand
voice standards. Each file was scored against the 8-criterion rubric and
rewritten where needed to achieve 4+ on all criteria.
**Changes include:**
- Remove "Learn how to/about" patterns (8 instances)
- Replace vague phrases ("various types of tasks", "and more") with
specific examples
- Remove taboo words ("seamless", "naturally extends")
- Remove emotional language ("We're excited/thrilled/happy")
- Remove marketing patterns ("Stay tuned!", exclamation points)
- Remove unverifiable claims ("world's fastest")
- Replace hedging with direct statements
- Remove promotional emphasis (`_free_`, `**_for free_**`)
- Fix typo in external-agents.md ("servers" → "serves")
- Fix broken link syntax for Ollama Turbo
## Test plan
- [x] `mdbook build` succeeds
- [x] Grep for remaining taboo phrases (only one "seamless" in MCP
official quote, preserved intentionally)
- [x] All facts preserved (URLs, keybindings, settings keys, prices,
model names)
Fixes AI-8
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Some language servers include local symbols (e.g., local variables,
parameters) in workspace symbol results. Without the `containerName`
information, these symbols lack context information, making it difficult
to distinguish them from top-level definitions and hindering efficient
symbol lookup.
This change exposes the `container_name` field from LSP
[`SymbolInformation`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#symbolInformation)
to the extension API, allowing language server extensions to access
`symbol.container_name` in `label_for_symbol` and provide meaningful
context when rendering symbol labels.
Note: The `container_name `field is added to all extension API versions
because they seem to share the same underlying Rust types via wasmtime
bindgen. The field is optional, so existing extensions would remain
compatible as far as I understand.
Closes #ISSUE
Release Notes:
- Added `container_name` field to `lsp::Symbol`, accessible via the
extension API's `label_for_symbol` function
---------
Co-authored-by: MrSubidubi <finn@zed.dev>
### Summary
Adds accept/reject tracking for Mercury edit predictions.
### Changes
Sends events to https://api-feedback.inceptionlabs.ai/feedback when:
Accept — user presses Tab
Reject — user presses Escape
Ignore — prediction dismissed implicitly (typing, cursor move, etc.)
Added `discard_explicit` method to the delegate trait to distinguish
explicit vs implicit dismissal. Updated `reject_prediction` and
`reject_current_prediction` methods with an `explicit` bool parameter to
thread this through to the Mercury feedback logic. Other providers are
unaffected—they use the default implementation.
Feedback is fire-and-forget in a background thread, only sent for
predictions that were shown.
### Data Collected
- Request ID (returned from Inception API)
- User action (either accept/reject/ignore)
- Client Zed version (to track updates made to Zed client which could
potentially affect nextedit implementation)
Release Notes:
- N/A
---------
Co-authored-by: Ben Kunkle <ben@zed.dev>
Expands the hardcoded security rules that block dangerous `rm` commands
in the agent terminal tool.
### New blocked patterns
- `rm -rf $HOME` / `rm -rf $HOME/` / `rm -rf ${HOME}` / `rm -rf
${HOME}/`
- `rm -rf .` / `rm -rf ./`
- `rm -rf ..` / `rm -rf ../`
- `rm -rf ~/` (previously only `rm -rf ~` was blocked)
### Flag handling improvements
- Simplified the flag character class from `[rRfF]` to `[rf]` since the
regex is already compiled with case-insensitive mode — less confusing,
same behavior.
- Added tests verifying that reversed flags (`-fr`), uppercase (`RM
-RF`), split flags (`-r -f`), and chained commands all get caught.
### Safe commands still allowed
Paths like `rm -rf ./build`, `rm -rf ~/Documents`, `rm -rf
$HOME/Documents`, `rm -rf ../some_dir`, and `rm -rf .hidden_dir` are
**not** blocked.
Release Notes:
- Auto-block a wider range of agent terminal commands, e.g. `rm -rf
$HOME` in addition to `rm -rf ~`
`brush-parser` handles `;` (sequential execution) and `|` (piping) which
all these shells use, so we can safely parse their commands for
`always_allow` pattern matching.
(No release notes because granular tool permissions haven't been
released yet.)
Release Notes:
- N/A