148b102
Update the PR template to have a checklist (#48646)
Click to expand commit body
Release Notes: - N/A
Mikayla Maki created
148b102
Update the PR template to have a checklist (#48646)
Release Notes: - N/A
Mikayla Maki created
73d10cb
Shell parser: Handle I/O redirects, here-documents, and compound commands (#48635)
This PR improves the shell command parser to correctly handle I/O redirects, here-documents, and compound command constructs. Previously, commands hidden inside redirect targets, here-document bodies, or function definition redirects could go undetected by the permission system. ## Changes - **Redirect handling**: Capture I/O redirects on simple commands, compound commands (`if`/`while`/`for`/`case`/subshells/brace groups), and function definitions - **Nested command extraction**: Extract commands from redirect file targets (e.g. `> $(dangerous_cmd)`) and here-document bodies - **Bare redirect rejection**: Return `None` for bare redirects with no command name (e.g. `> /etc/passwd`), which forces confirmation - **Compound command redirects**: Apply redirects on compound commands to their inner body commands - **Fail-closed error handling**: `extract_commands_from_word` and `normalize_word_piece_into` now return `None` on parse failures instead of silently succeeding - **Test coverage**: Extensive tests for quoted redirect targets, no-space redirects, clobber operators, fd-to-fd redirects, pipe+redirect combinations, function definition redirects, and more Release Notes: - Improved shell command parsing to correctly detect commands hidden in I/O redirects, here-documents, and compound command constructs.
Richard Feldman created
cab418a
Fix MCP tool name parsing: use newline delimiter instead of colon (#48636)
MCP tool names can contain colons (e.g. `mcp:server:tool`), which broke
the `splitn(3, ':')` parsing of always-allow/always-deny pattern option
IDs. This switches to newline (`\n`) as the delimiter between tool name
and pattern, since newlines cannot appear in either component.
## Changes
- **Option ID format**: Changed from
`always_allow_pattern:{tool}:{pattern}` to
`always_allow_pattern:{tool}\n{pattern}`
- **Response parsing**: Replaced `splitn(3, ':')` with `strip_prefix` +
`split_once('\n')`
- **Error logging**: Added `log::error!` when pattern parsing fails
(previously silent)
- **Tests**: Updated test assertions in `agent` and `agent_ui` crates
No release notes because granular tool permissions are still
feature-flagged.
Release Notes:
- N/A
Richard Feldman created
7fa4cfc
Strengthen hardcoded rm security rules and add path normalization (#48640)
This PR hardens the terminal tool's hardcoded security rules for
destructive commands like `rm -rf /`, and adds path normalization to
prevent traversal-based bypasses.
## Path normalization
Adds `normalize_path` which resolves `..`, `.`, and redundant path
separators, and `decide_permission_for_path` which checks permissions
against both raw and normalized paths (taking the most restrictive
result). This prevents attacks like `rm -rf /tmp/../../` which
previously bypassed the `rm -rf /` rule.
## rm command expansion
Adds `expand_rm_to_single_path_commands` which splits multi-argument rm
commands into individual single-path commands for checking. This catches
cases like `rm -rf /tmp /` where the dangerous path is the second
argument.
## Regex hardening
- **FLAGS**: Now accepts digits, underscores, and uppercase in long
flags (e.g. `--no-preserve-root`)
- **`--flag=value`**: Correctly matched as a single flag token
- **Trailing flags**: Handles GNU rm's acceptance of flags after path
operands (e.g. `rm / -rf`)
- **`--` marker**: Detects end-of-options bypass attempts (e.g. `rm -rf
-- /`)
- **Whitespace**: Handles tabs and other whitespace, not just spaces
## `$HOME`/`${HOME}` handling
Normalizes the suffix after `$HOME`/`${HOME}` variable references so
that traversal attacks like `rm -rf $HOME/./` or `rm -rf ${HOME}/foo/..`
are correctly detected.
Release Notes:
- Strengthened terminal security rules to detect path traversal attacks
in destructive commands like `rm -rf`.
Richard Feldman created
4a89623
Handle authorization send errors instead of silently dropping with .ok() (#48639)
The two `unbounded_send` calls in `ToolCallEventStream`'s authorize methods were using `.ok()` to silently discard send failures. This meant that if the authorization channel was closed, the tool call would hang indefinitely waiting for a response that would never come. ## Changes - Both `authorize_third_party_tool` and `authorize` methods now use `if let Err(error)` to detect send failures - On failure, logs the error with `log::error!` and returns `Task::ready(Err(...))` so callers get immediate, meaningful feedback Release Notes: - Tool authorization failures are now logged and reported instead of being silently ignored.
Richard Feldman created
acbc6a1
Remove fine-grained tool streaming beta header (now GA) (#48631)
Fine-grained tool streaming is now [generally available on all models and platforms](https://platform.claude.com/docs/en/release-notes/overview#february-5-2026) as of February 5, 2026, so the `fine-grained-tool-streaming-2025-05-14` beta header is officially listed as no longer needed. See https://github.com/zed-industries/zed/pull/48508#discussion_r2773653965 Release Notes: - N/A
Richard Feldman created
d8b2c03
Improve rate predictions modal (#48630)
Closes #ISSUE Release Notes: - N/A *or* Added/Fixed/Improved ...
Ben Kunkle created
263d8e5
Remove zeta example capturing (#48627)
Closes #ISSUE Release Notes: - N/A *or* Added/Fixed/Improved ...
Ben Kunkle created
30ec2ca
Support custom fold text for LSP folds (#48624)
Follow-up of https://github.com/zed-industries/zed/pull/48611 Release Notes: - N/A
Kirill Bulatov created
438a820
Clean up some `Cargo.toml` files (#48623)
This PR cleans up some `Cargo.toml` files after #48602. Release Notes: - N/A
Marshall Bowers created
a8ae51c
build: Tear up crate graph (move terminal closer to editor) (#48602)
- **build: remove assistant_slash_commands dependency in assistant_text_thread** - **diagnostics: Do not depend on search** - **Remove terminal_view's dependency on search** - **sever breadcrumbs <-> editor dep (for the sake of terminal_view)** Release Notes: - N/A
Piotr Osiewicz created
afafb66
agent: Highlight latest models available through the Zed provider (#48614)
This PR updates the model selector to highlight the latest models that are available through the Zed provider: <img width="388" height="477" alt="Screenshot 2026-02-06 at 1 46 41 PM" src="https://github.com/user-attachments/assets/70760399-ecf6-46e3-80a7-cb998216c192" /> Closes CLO-205. Release Notes: - Added a "Latest" indicator to highlight the latest models available through the Zed provider.
Marshall Bowers created
fd1d5fc
settings_ui: Fix Ollama icon and other small UI details in EP subpage (#48612)
Taking out unnecessary icons and description text, too! Release Notes: - N/A
Danilo Leal created
6c253a7
Add `textDocument/foldingRange` LSP support (#48611)
Closes https://github.com/zed-industries/zed/issues/28091 Off in language settings by default: ` "lsp_folding_ranges": "off",`, when enabled, disables tree-sitter indent-based folding and enables fetching of LSP ones instead. Falls back to tree-sitter if LSP-based one brings no results. Release Notes: - Added `textDocument/foldingRange` LSP support, use ` "lsp_folding_ranges": "on",` language settings to fetch and prefer the LSP folds
Kirill Bulatov created
101a53d
Respect workspace override in `git: diff` (#48535)
Closes #ISSUE Release Notes: - Fixed an issue where the `git: diff` action would not respect the active worktree
Ben Kunkle created
980479f
Refactor LSP-related logic (#48604)
* split more logic away into its own modules for document colors, code lens and inlay hints * remove unnecessary cache_version for document colors Release Notes: - N/A
Kirill Bulatov created
4f8ff64
Fix settings migrations for nested platform/channel/profile keys (#48550)
Previously, some settings migrations only operated on root-level keys and missed settings nested under platform keys (`macos`, `linux`, etc.), channel keys (`nightly`, `stable`, etc.), or profile blocks. This fixes migrations to recurse into those nested locations. Also fixes `m_2026_02_02` to gracefully skip when `edit_predictions` is not an object (e.g. `true`) instead of bailing and aborting the entire migration chain. Release Notes: - Fixed settings migrations to correctly handle settings nested under platform, channel, or profile keys.
Richard Feldman created
aa33a50
language_models: Enable setting reasoning effort for OpenAI models through Zed provider (#48605)
This PR adds support for setting the reasoning effort for OpenAI models through the Zed provider. This is gated behind the `cloud-thinking-effort` feature flag. Release Notes: - N/A Co-authored-by: Tom Houlé <tom@tomhoule.com>
Marshall Bowers and Tom Houlé created
35459f0
Detect and reject overlapping edit ranges in streaming_edit_file_tool (#48547)
In `streaming_edit_file_tool.rs`, edits are sorted in reverse order and applied sequentially. If the LLM produces overlapping edit ranges, the first applied edit shifts the buffer, and the second edit's range targets stale offsets, leading to incorrect results. This adds a `windows(2)` check on the sorted (descending by start) edits that verifies each earlier-in-file range's end does not exceed the next later-in-file range's start. The validation is done before entering the buffer update closure so the error can propagate cleanly via `anyhow::bail!`. Release Notes: - Fixed bug where streaming edits could apply edits incorrectly if the model requested overlapping edit regions.
Richard Feldman created
3d57951
feature_flags: Rename `cloud-thinking-toggle` feature flag (#48598)
This PR renames the `cloud-thinking-toggle` feature flag to `cloud-thinking-effort`. This feature flag has expanded slightly in scope, so we want the name to be more representative of what it gates. Release Notes: - N/A Co-authored-by: Tom Houlé <tom@tomhoule.com>
Marshall Bowers and Tom Houlé created
8e56667
git: Implement `OpenExcerpts` for the left side of the side-by-side diff (#48438)
By opening the corresponding positions in the corresponding main buffers. Release Notes: - N/A
Cole Miller created
e2267ab
Fix text_threads_dir() non-compliance with XDG spec (#45771)
Closes #41373 Release Notes: - Ensures that XDG specs are followed on MacOS and Linux with backwards compatibility. Changes -Added ```state_dir``` to get XDG_STATE_HOME on macos and linux, no change to windows. -Changed ```text_threads_dir``` to a fallback, ```text_threads_dir_fallback``` -Re-implemented ```text_threads_dir``` to use ```state_dir``` --------- Co-authored-by: AdamJedl <100023363+AdamJedl@users.noreply.github.com>
Marcus Mäkilä and AdamJedl created
7377cb6
Canonicalize --user-data-dir path to match file watcher events (#48470)
This commit updates the `paths::set_custom_data_dir` implementation so as to always canonicalize the provided `dir`, even when dealing with an absolute path. This ensures that we correctly deal with symlinks and don't end up not reacting to filesystem watcher events in this specific case. For example, when using `--user-data-dir /tmp/zed` on macOS, since `/tmp` is a symlink to `/private/tmp`, if any setting was changed, the application would not react, as the event would be using `/private/tmp/zed/config/settings.json`, while the watcher would be looking out for `/tmp/zed/config/settings.json`. Lastly, the canonicalization of the path is now done after `std::fs::create_dir_all` is called, in order to guarantee that the directory already exists at that point. Release Notes: - N/A
Dino created
4167f17
SplittableEditor: Sync custom blocks between RHS and LHS editors (#48575)
Release Notes: - Added handling of custom blocks in the RHS editor by creating matching dummy custom blocks rendered as spacer blocks in the LHS editor when in split view.
Jakub Konka created
669f8cc
project_panel: Refactor selection state ownership (#48586)
This PR moves `selection` from `State` to `ProjectPanel`. In async `update_visible_entries`, the `old.selection` copied into `new_state` was never read or updated. After async completion, we already either set the new selection (when provided) or keep the current selection value. So storing `selection` in `State` was redundant. This simplifies a confusing code path without changing behavior. Release Notes: - N/A
Smit Barmase created
7667fd3
Tidy up semantic tokens settings ui (#48581)
Follow-up of https://github.com/zed-industries/zed/pull/46356 Before: <img width="719" height="217" alt="image" src="https://github.com/user-attachments/assets/64464318-3b84-4129-9a12-721aaa6ae953" /> After: <img width="686" height="213" alt="image" src="https://github.com/user-attachments/assets/1776ced1-4367-4ad0-9e60-c3661e07675e" /> Release Notes: - N/A
Kirill Bulatov created
fe0f7f3
project_panel: Fix previous selection not restoring when filename editor blurs (#48578)
Prep for: https://github.com/zed-industries/zed/pull/46750 Edit-state cleanup in the Project Panel was inconsistent between Escape cancel and blur. Blurring the filename editor during file/folder creation could clear edit state without restoring the previous selection. This routes both paths through the same discard flow and adds test coverage for the blur case. Release Notes: - Fixed an issue where blurring the filename editor in the Project Panel could lose the previous selection while creating a file or folder.
Smit Barmase created
37bd7b3
Autolabel pull requests by bots (#48579)
In combination with auto-labeling staff PRs, this makes it possible to see the community PRs with `-label:staff -label:bot` in the search query on https://github.com/zed-industries/zed/pulls Release Notes: - N/A
Lena created
c94b28f
Autolabel staff's pull requests (#48576)
Modifying the existing github workflow here instead of adding a new one because we're already triggering on the same thing (new PR opened) and checking the same thing (staff team membership) but throwing away the result. Another CI job doing largely the same checks seemed unnecessary. Release Notes: - N/A
Lena created
c430681
Do not pass zeta prompt format in production endpoint (#48541)
This allows us to switch the prompt format without client-side changes. If we want to experiment with prompt formats or models other than the currently-deployed one, we can use the raw endpoint, and do prompt construction and output processing on the client. This also adds an optional environment parameter to the raw endpoint, so that we can use that endpoint in the new scheme where we're deploying to separate environments for different zeta prompt versions. Release Notes: - N/A
Max Brunsfeld created
2cecdab
Don't watch parent directory of global gitexcludes file (#48408)
Closes: #48560 Release Notes: - Fixed an issue where Zed would try to open all edited files in ~ if your git config had a globalexludes in ~ that did not exist. --------- Co-authored-by: Cole Miller <cole@zed.dev>
Conrad Irwin and Cole Miller created
7cb4d75
Housekeeping: Improve error handling and small fixes (#48552)
A collection of small independent fixes: - **Visual test runner**: Replace ~20 instances of `.ok()` and `let _ =` with `.log_err()` to avoid silently discarding errors per project guidelines. - **recent_projects**: Add missing `remote_connection/test-support` to the `test-support` feature gate. - **util/shell.rs**: Add doc comment on `supports_posix_chaining()` explaining its relationship to tool permission pattern matching. Release Notes: - N/A
Richard Feldman created
ff4489f
Revert "Remove VS Code references from Copilot integration" (#48555)
Reverts zed-industries/zed#48528 Release Notes: - N/A
Mikayla Maki created
9860106
agent: Add support for setting thinking effort for Zed provider (#48545)
This PR adds the ability to set the thinking effort of a model. Right now this only applies to Opus 4.6 through the Zed provider. This is gated behind the `cloud-thinking-toggle` feature flag. UI is still rough; needs a design pass: <img width="639" height="163" alt="Screenshot 2026-02-05 at 7 45 54 PM" src="https://github.com/user-attachments/assets/2b5a9ef8-74cd-498e-9c81-b92666572409" /> <img width="263" height="148" alt="Screenshot 2026-02-05 at 7 45 58 PM" src="https://github.com/user-attachments/assets/40232cb0-1743-443b-b04c-5cd33065513d" /> Release Notes: - N/A
Marshall Bowers created
8d73084
git: Side-by-side search matches panic (#48544)
Fixes a panic when using a search anchor from one side of a side-by-side in the other. Release Notes: - N/A *or* Added/Fixed/Improved ...
Cameron Mcloughlin created
eb9103e
git: Side-by-side diff searching (#48539)
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
Cameron Mcloughlin created
9743dbc
agent: Add `agent.default_model.enable_thinking` setting (#48536)
This PR adds a new `enable_thinking` setting for the default model, which controls whether the model uses thinking or not. Release Notes: - N/A
Marshall Bowers created
0d9bcf0
Fix Codestral API key credentials URL mismatch (#48513)
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
Ben Kunkle created
e4d8209
agent_ui: Add additional telemetry for thread errors (#47971)
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>
Katie Geer , Michael Benfield , and Claude Opus 4.5 created
a2ca075
language_model: Add `supported_effort_levels` method to `LanguageModel` (#48523)
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
Marshall Bowers created
5259b24
settings_ui: Fix tab navigation in edit predictions settings (#48530)
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
Austin Cummings created
e8030ae
Improve extension installation (#48518)
Release Notes: - N/A Co-authored-by: Max <max@zed.dev> Co-authored-by: Piotr <piotr@zed.dev>
Mikayla Maki , Max , and Piotr created
4144422
ep: Fix `parse-output` for repaired outputs (#48529)
Release Notes: - N/A
Oleksiy Syvokon created
72a12eb
Remove VS Code references from Copilot integration (#48528)
Release Notes: - N/A
Mikayla Maki created
a22092c
settings_content: Remove unused methods from `AgentSettingsContent` (#48526)
This PR removes some unused methods from the `AgentSettingsContent` type. Release Notes: - N/A
Marshall Bowers created
0e29766
Update `cosmic-text` to v0.17 to fix font ligatures on Linux (#48504)
Closes https://github.com/zed-industries/zed/issues/12176 rebased https://github.com/zed-industries/zed/pull/48161 Release Notes: - Updated text rendering dependency to fix and improve font ligature support
0xADB created
46017f9
Add tab switcher mode similar to vim/helix buffer picker (#47079)
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.
David Baldwin created
74746aa
multi_buffer: Optimize a bunch of things (#48519)
Release Notes: - N/A *or* Added/Fixed/Improved ... --------- Co-authored-by: Cole Miller <cole@zed.dev>
Lukas Wirth and Cole Miller created
7dcff21
anthropic: Update types for adaptive thinking (#48517)
This PR updates the Anthropic types with support for [adaptive thinking](https://platform.claude.com/docs/en/build-with-claude/adaptive-thinking). We're not actually using adaptive thinking yet. Release Notes: - N/A
Marshall Bowers created
65da2c2
Use AgentTool::NAME const instead of name() method and hardcoded strings (#48506)
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
Richard Feldman created