Commit log

b0facda Fix tests: render log frame grouping tests + blink test update

Click to expand commit body
- All 6 render_log tests pass as plain #[test] (pure data logic)
- Fixed example_tests to use ExampleInputState (matching new API)
- Fixed blink test for focus-driven blink (test via typing, not init)
- Fixed test command in doc comment
- All 12 tests pass with: cargo test --example view_example -p gpui --features test-support

Mikayla Maki created

0d93ff0 Render log: frame grouping with counters, collapse identical consecutive frames

Click to expand commit body
Rewrote RenderLog to group render() calls by frame:
- begin_frame() called at start of root render, finalizes previous frame
- log() records component name in current frame
- Consecutive frames with identical component sets collapse into one
  entry with a ×N counter (e.g. animation re-rendering Input+Editor
  30 times shows as one line with ×30)
- Display shows component names, repeat count, and timestamp

Added 6 unit tests for the frame grouping logic:
- Groups by frame, consecutive collapse, different frames don't collapse,
  collapse resumes after interruption, empty frames ignored, dedup
  within frame

Note: tests are plain #[test] (not gpui::test) since RenderLog logic
is pure data manipulation. The pre-existing example_tests.rs compilation
issue (TestAppContext not available in examples) prevents running them
via cargo test currently.

Mikayla Maki created

c103131 Add focus-driven blink and render log

Click to expand commit body
Blink fix:
- ExampleEditor no longer starts a blink task unconditionally
- Registers on_focus/on_blur listeners in constructor (now takes Window)
- start_blink() spawns the timer, stop_blink() drops it
- Unfocused editors produce zero re-renders

Render log:
- New RenderLog entity + RenderLogPanel ComponentView
- Each component logs its render() call: ExampleInput, EditorInfo,
  ExampleTextArea, and ExampleEditor
- Panel displays last 20 entries with timestamps, dark terminal style
- No cx.notify() in log() — avoids infinite invalidation loop;
  panel updates passively when parent re-renders
- Replaces the static help text at the bottom of the example

Mikayla Maki created

4af9073 Add EditorInfo: zero-wiring View over shared editor entity

Click to expand commit body
EditorInfo is a View that reads from the same ExampleEditor entity as
ExampleInput, demonstrating two completely different renderings of one
entity with automatic caching and no manual wiring:

- Returns the editor from entity() — that's the entire reactive hookup
- Reads editor.content, cursor, focus_handle in render()
- Caches automatically: typing updates it, but pressing Enter (flash
  border on input) leaves it cached since the editor didn't change
- 46 lines total, no observers, no subscriptions, no cx.notify()

The parent shares the editor handle by reading it from ExampleInputState:
  let input_editor = input_state.read(cx).editor.clone();
  EditorInfo::new(input_editor)

Mikayla Maki created

f079aee Refine View example: ExampleInput as View with own state, ExampleTextArea as ComponentView

Click to expand commit body
ExampleInput is now a proper View backed by ExampleInputState, which:
- Creates and owns its editor entity internally (cx.new in state constructor)
- Tracks focus via on_focus/on_blur listeners on its own state entity
- Never reads the editor entity during render — only reads its own state
- Gets an independent caching boundary from both parent and child editor

ExampleTextArea is now a ComponentView (stateless wrapper) where the inner
EntityView does the caching. This demonstrates the cheaper pattern for
components that don't need their own reactive boundary.

The parent (ViewExample) allocates ExampleInputState via use_state, which
internally chains to cx.new() for the editor. ExampleInput::new() is a
pure constructor taking just the state handle.

Design analysis documented in plan.md:
- use_state observer is necessary (non-view entities aren't in dispatch tree)
- View vs ComponentView vs EntityView taxonomy with clear use cases
- Entity reactivity taxonomy (view, component-local, shared-universal, shared-selective)
- V2 use_global API concept for theme/settings auto-reactivity

Mikayla Maki created

305b9db Add EntityView trait, tighten view.rs docs

Click to expand commit body
- EntityView: View-based replacement for Render on entity state types.
  Entity<T: EntityView> gets a blanket View impl with reactive boundary.
- Use ViewElement::new(entity) at call sites for IntoElement.
- Add #[inline] on ComponentView and EntityView bridge methods.
- Tighten all public docs in view.rs to be short and consistent.
- Update ExampleEditor to use EntityView, remove ExampleEditorView wrapper.
- ExampleEditorText reads text_color from inherited text style.

Mikayla Maki created

63db56f Enhance example with Render and RenderOnce replacements.

Mikayla Maki created

3835291 Import Styled for StyleRefinement::size_full() in View default

Mikayla Maki created

e2069ee Add View, ComponentView traits and ViewElement for unified component model

Click to expand commit body
Introduce View trait with Option<Entity> for stateful/stateless branching,
ComponentView trait with blanket View impl for RenderOnce-style components,
and ViewElement that handles both cached (reactive boundary) and uncached
(type-name isolation) paths.

Rename text_views example to view_example with ExampleEditor/Input/TextArea.

Mikayla Maki created

7d7be31 Add View::style(), #[derive(IntoViewElement)], and EditorView

Mikayla Maki created

c8d8cef Use the new view system to implement powerful input state and component examples.

Mikayla Maki created

ed78873 Introduce the View trait and ViewElement, a synthesis of the Entity and Component models.

Mikayla Maki created

cbc3966 Remove std::fs::read_link in fs (#50974)

Click to expand commit body
Closes #46307

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
- [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:

- Improved compatibility with mounted VHDs on Windows.

---------

Co-authored-by: John Tur <john-tur@outlook.com>

Alex Mihaiuc and John Tur created

8a7daea ep: Ensure prompt is always within token limit (#51529)

Click to expand commit body
Release Notes:

- N/A *or* Added/Fixed/Improved ...

Ben Kunkle created

e482301 http_client: Fix GitHub downloads failing if the destination path exists (#51548)

Click to expand commit body
cc
https://github.com/zed-industries/zed/pull/45428#issuecomment-4060334728

Release Notes:

- N/A *or* Added/Fixed/Improved ...

Lukas Wirth created

e79429b agent_ui: Add more UI refinements to sidebar (#51545)

Click to expand commit body
- Move archive button to the header for simplicity
- Hook up the delete button in the archive view
- Improve how titles are displayed before summary is generated
- Hook up keybinding for deleting threads in both the sidebar and
archive view

Release Notes:

- N/A

Danilo Leal created

80acfff which-key: Removed some keys from the filter list that were wrongly filtered (#51543)

Click to expand commit body
Closes #49845

Follow up on #50992

Really simple, just removing some vim commands from the filter list that
are useful enough to justify not being filtered out.

tested to make sure the changes work:
<img width="944" height="1123" alt="Screenshot 2026-03-13 at 11 23
52 PM"
src="https://github.com/user-attachments/assets/23b2db73-d0e7-413b-aef7-efe62e84b542"
/>

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:

- which-key: fixed filter list for some vim commands

Finn Eitreim created

da8a7e8 markdown: Fix block quote continuation highlighting (#51465)

Click to expand commit body
There is no highlight for block quotes continued on multiple lines

Currently, the ">" on lines 2 and 3 are not highlighted in the same way
as line 1
<img width="291" height="73" alt="image"
src="https://github.com/user-attachments/assets/7a2f2e25-6ee1-40a6-8833-f06ca7ee6ba9"
/>

After this PR,
<img width="249" height="75" alt="image"
src="https://github.com/user-attachments/assets/34a2971f-8061-4d92-ac45-a8043d5d0566"
/>


for this input
```md
> abcd
>
> abcd
```

tree-sitter produces this 
```
(document [0, 0] - [3, 0]
  (section [0, 0] - [3, 0]
    (block_quote [0, 0] - [3, 0]
      (block_quote_marker [0, 0] - [0, 2])
      (paragraph [0, 2] - [1, 1]
        (inline [0, 2] - [0, 6])
        (block_continuation [1, 0] - [1, 1]))
      (block_continuation [2, 0] - [2, 2])
      (paragraph [2, 2] - [3, 0]
        (inline [2, 2] - [2, 6])))))
```

the screenshots in #43043 also show this issue

Release Notes:

- Fixed highlighting of block quotes continued over multiple lines in
markdown files

Kurian Jojo created

2b39fba agent_ui: Mask API key input in Add LLM provider modal (#50379)

Click to expand commit body
Release Notes:

- Added Mask API key input in Add LLM provider modal


<img width="427" height="430" alt="截屏2026-02-28 17 35 22"
src="https://github.com/user-attachments/assets/ae628815-f7df-4ea0-90ea-a23bbd703521"
/>

---------

Signed-off-by: Xiaobo Liu <cppcoffee@gmail.com>
Co-authored-by: Danilo Leal <daniloleal09@gmail.com>

Xiaobo Liu and Danilo Leal created

a39201a acp_thread: Stream in agent text in a more continous manner (#51499)

Click to expand commit body
Release Notes:

- N/A *or* Added/Fixed/Improved ...

Lukas Wirth created

28fa947 agent_ui: Enable deleting a thread from the sidebar (#51532)

Click to expand commit body
Currently only available for native threads.

Release Notes:

- N/A

Danilo Leal created

b7266ba Fix panic in crease folding (#51531)

Click to expand commit body
Fixes ZED-5BZ

Release Notes:

- N/A

Conrad Irwin created

ee8ecfa language_models: Make subscription text exhaustive (#51524)

Click to expand commit body
Closes CLO-493.

Release Notes:

- N/A

Neel created

8fc880e ep: Ensure predictions are not refreshed while following (#51489)

Click to expand commit body
Release Notes:

- N/A

Ben Kunkle created

0ccdd9b agent_ui: Auto-expand and then collapse thinking blocks (#51525)

Click to expand commit body
With these newer models that come with different thinking levels, it's
become more frequent to want to see what the thinking is outputting.
Thus far in Zed, the thinking block would show up automatically
collapsed and every time you wanted to see it, you had to expand it
manually. This PR changes that by making the thinking block
automatically _expanded_ instead, but as soon as it's done, it collapses
again.

Release Notes:

- Agent: Improved visibility of thinking blocks by making them
auto-expanded while in progress.

Danilo Leal created

b63a2ab agent_ui: Fix new thread in location setting renderer and flag (#51527)

Click to expand commit body
Follow up to https://github.com/zed-industries/zed/pull/51384

This PR fixes the settings UI rendering of this setting by adding a
default value and also wraps it in the feature flag (only the settings
UI rendering), given it's not widely available just yet.

Release Notes:

- N/A

Danilo Leal created

165c033 seo: Expand /docs/ai/tools examples + cross-link from external-agents (#49758)

Click to expand commit body
Two changes to support pushing `/docs/ai/tools` into the top 10 for
"agent tools" (8,900 monthly volume, currently position 11).

**`docs/src/ai/tools.md`** — adds a concrete usage example to 7 tools:
`diagnostics`, `grep`, `fetch`, `edit_file`, `terminal`, `web_search`,
and `subagent`. Each example shows a realistic scenario rather than
restating the description.

**`docs/src/ai/external-agents.md`** — adds a single sentence
cross-linking to `tools.md` after the supported-agents intro paragraph,
for users who land on that page looking for what the built-in agent can
do.

Katie Geer created

db362f5 extension_ci: Use proper PR description for main repository (#51519)

Click to expand commit body
Release Notes:

- N/A (https://tenor.com/view/ironic-star-wars-chode-gif-5274592)

Finn Evers created

55c9498 docs: Add callouts about student plan for usage and spend limits (#51506)

Click to expand commit body
Add details about how student plan differs in token usage and spend
limits

Release Notes:

- N/A *or* Added/Fixed/Improved ...

Katie Geer created

08abc48 glsl: Bump to v0.2.1 (#51517)

Click to expand commit body
This PR bumps the version of the GLSL extension to v0.2.1.

Release Notes:

- N/A

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

zed-zippy[bot] and zed-zippy[bot] created

fe7fa37 gpui_macos: Skip IME for Cmd+key events on non-QWERTY layouts (#51394)

Click to expand commit body
Closes #51297

On non-QWERTY layouts, all Cmd+key events are routed through the macOS
IME because `key_char` is always `None` when Cmd is held. For certain
characters (dead keys like backtick, and non-dead keys like ç), the IME
calls `insertText:` instead of `doCommandBySelector:`, consuming the
event before it reaches GPUI's keybinding system or macOS system
shortcuts.

This adds `!platform` to the IME-path condition in `handle_key_event` so
Cmd+key events bypass the IME (except when composing). GPUI handles them
if a binding matches, otherwise `performKeyEquivalent:` returns `NO` and
macOS handles them.

**This won't fully fix Cmd+backtick window cycling by itself** because
Zed's key_equivalents system maps default keybindings onto the physical
backtick key on various layouts. For example, `cmd-'`
(ToggleSelectedDiffHunks) maps to the backtick key on Spanish, `cmd-=`
(IncreaseBufferFontSize) on Scandinavian layouts, `cmd-"`
(ExpandAllDiffHunks) on German/Portuguese/Swiss, and `cmd-}`
(ActivateNextItem) on Spanish-ISO. These Zed bindings shadow the
backtick key and consume the event before macOS can cycle windows. I'd
appreciate guidance on the preferred approach to resolve these
keybinding conflicts -- IMO, Zed's default shortcuts should not be
interfering with Cmd+backtick for any layout.

Release Notes:

- Fixed Cmd+key shortcuts being consumed by the IME on non-QWERTY
keyboard layouts, preventing Zed keybindings and macOS system shortcuts
from working with special characters.

jamarju created

b531c40 glsl/html: Clean up some things (#51516)

Click to expand commit body
Release Notes:

- N/A

Finn Evers created

d820b07 extension_ci: Fix main repository version bumps (#51515)

Click to expand commit body
Release Notes:

- N/A

Finn Evers created

933923c docs: Add roles page under Account & Privacy section (#51413)

Click to expand commit body
Add new page detailing the roles available for users in their
organizations.

Release Notes:

- N/A *or* Added/Fixed/Improved ...

Katie Geer created

231b0cc glsl: Add `task` and `mesh` path suffixes (#50605)

Click to expand commit body
The GLSL language extension was missing the "task" and "mesh" path
suffixes for task and mesh shaders.
"task" and "mesh" are the official suffixes used in glslang.

Release Notes:

- N/A

Co-authored-by: MrSubidubi <finn@zed.dev>

rcmz and MrSubidubi created

bb6a6e0 ci: Fix jq command (#51510)

Click to expand commit body
Sigh.. The missing flag caused the wrong output to be used, resulting in
an error in the process.

Release Notes:

- N/A

Finn Evers created

ccb2674 extension_ci: Add infrastructure for this repository (#51493)

Click to expand commit body
This will allow us to also use the workflows for this repository, which
will especially come in handy once we revisit provider extensions.

Not perfect, as we will trigger some failed workflows for extensions
that were just added

Release Notes:

- N/A

Finn Evers created

4e8937b ui: Refactor the `Button` component icon methods (#51496)

Click to expand commit body
Previously, if you wanted to have a button that contains icons on both
edges, you'd need to use a `ButtonLike` component, which takes any
children. Meanwhile, the `Button` would only take one icon, where you
could control its position through the `IconPosition` enum. This has
always felt unnecessarily limiting. So, this PR removes this limitation
by adding two new methods to the button: `start_icon` and `end_icon`.

In the meantime, I have also been bothered by the unnecessary
indirection in the `IconButton` due to the existence of the `ButtonIcon`
component. So I figured I could also completely eliminate that by adding
some of its methods directly to the `IconButton` and in the Button, just
using a regular `Icon` component.

---
## Before
```rust
Button::new("id", "Label")
    .icon(IconName::Plus)
    .icon_position(IconPosition::Start)
    .icon_size(IconSize::Small)
    .icon_color(Color::Muted)
```

## After
```rust
Button::new("id", "Label")
    .start_icon(Icon::new(IconName::Check))
    .end_icon(Icon::new(IconName::ChevronDown).size(IconSize::XSmall))
```

This should have no visual impact to the UI.

Release Notes:

- N/A

Danilo Leal created

a623dc3 agent_ui: Insert branch diff crease when clicking on menu item (#51509)

Click to expand commit body
Follow up to https://github.com/zed-industries/zed/pull/51487

The PR above added the item to the menu, and this one makes the menu
item actually insert a mention crease with the branch diff. That was
missing in the previous one.

Release Notes:

- N/A

Danilo Leal created

f04b4e0 file_finder: Put collab channel inclusion behind a setting (#51505)

Click to expand commit body
Release Notes:

- N/A *or* Added/Fixed/Improved ...

Lukas Wirth created

e29206b Do not overly eagerly invalidate the runnables (#51500)

Click to expand commit body
Follow-up of https://github.com/zed-industries/zed/pull/51299

Release Notes:

- N/A

Kirill Bulatov created

e6f571c gpui: Fix busyloop on X disconnect (#41986)

Click to expand commit body
When the connection to X is broken zed will go into an infinite loop and
eat up 100% (of one core) of CPU; this change causes it to exit with an
error instead.

I encountered this behavior while running zed in
[Xephyr](https://freedesktop.org/wiki/Software/Xephyr/) for testing,
though I do sometimes terminate my X server as a way to log out or
attempt to recover from a (very) broken state, and I appreciate a
graceful exit in those situations!

Exiting in case of X server disconnect is common practice in my
observations, likely as the difficulty of recreating state stored
server-side outweighs the potential utility in attempting to recover (if
"reconnecting" to an X server is ever desired in regular usage,
[Xpra](https://xpra.org/index.html) might be able to help!).


Release Notes:

- N/A

kitt created

2c0d6c0 project_panel: Add horizontal scroll setting (#51143)

Click to expand commit body
This PR introduces the `project_panel.scrollbar.horizontal_scroll`
setting to allow users to toggle the horizontal scroll bar in the
project panel. This was Zed's design before PR #18513, and the default
behavior of VSCode (`workbench.list.horizontalScrolling`).


https://github.com/user-attachments/assets/f633f4e4-a585-4494-8f48-df77c6aca418

## Rationale

Zed's design used to be the same as the default behavior of VSCode.
I.e., no horizontal scrolling, and the view is always snapped to the
left, with long file names clipped of. If you want to see the content
that is out-of-frame, you'll need to drag the handle and expand the
project panel. This could be problematic, especially for large repos
with multiple levels of nested directories, as pointed out by issues
#5550 and #7001.

<img width="1398" height="992" alt="image"
src="https://github.com/user-attachments/assets/d86563f2-0f06-4e9e-818c-155ac45f0f56"
/>\
*VSCode's default setup, for reference.*

Then came PR #18513, which added horizontal scroll and addressed this
pain point, but users didn't have a choice. They're stuck with
horizontal scrolling always turned on. I, for instance, personally
prefer the old, VSCode-default behavior, for most projects I open are
small and don't need horizontal scrolling in the project panel. With
horizontal scrolling always turned on, I find it annoying to have my
project panel view accidentally scrolled to the middle, and I'll have to
grab my mouse and scroll it back. It's also visually redundant.

Thus, why not add an option like VSCode's
`workbench.list.horizontalScrolling` and let users choose? I'd love to
be able to, say, set a per-project override for the projects that need
horizontal scrolling, while having it disabled by default.

## Extra Notes

- I was originally thinking about using `ScrollbarAxes` from
`src/editor_settings.rs` and make the option
`project_panel.scrollbar.axes.horizontal` similar to the global editor
scrollbar settings, but this option is specific to the project panel and
it doesn't quite make sense to allow disabling vertical scrolling on the
project panel, so I added a standalone option for it instead, similar to
VSCode's `workbench.list.horizontalScrolling`.

- I went the conservative route and set horizontal scrolling to enabled
(current behavior) by default. Imo it might make more sense to disable
it by default instead, similar to VSCode, but I'll leave this for the
Zed team to decide.

- I named it `horizontal_scroll` instead of `horizontal_scrolling` to be
consistent with the adjacent setting `sticky_scroll`.

- As for tests, I don't see tests for the scrollbar, so I didn't add
any.

I'd be glad to update the PR if anything is not inline with the
project's requirements or conventions.

---

Release Notes:

- Added `project_panel.scrollbar.horizontal_scroll` setting to allow
toggling horizontal scrolling in the project panel

Signed-off-by: k4yt3x <i@k4yt3x.com>

K4YT3X created

bde0834 git: Log some more information when opening a git repository and when `git show` fails (#51495)

Click to expand commit body
Release Notes:

- N/A

Cole Miller created

697e5be git: Fix commit message generation in untrusted projects and block external diff (#51323)

Click to expand commit body
When on a untrusted project, if one was to try and use the commit
generation functionality, the command would fail because of the `-c
diff.external` configuration provided in `GitBinary::build_command`, as
git would interpret this as `""` and try to run that command.

This `-c diff.external` is a good safeguard to have on untrusted
repositories because it prevents random commands, configured in
`.git/config` from being run. For example, if one uses `git config
diff.external "touch bananas.txt"` and then run `git diff`, a new
`bananas.txt` file would be created.

However, it was still possible to bypass this safeguard using the
following strategy:

1. Specify a custom diff for a specific file format. For example, for
markdown files, with `printf '*.md diff=pwned\n' > .gitattributes`
2. Update the command run by the `pwned` diff, for example, `git config
diff.pwned.command "touch bananas.txt"`
3. Open Zed and attempt to generate a commit message in an untrusted
repository and check that a new `bananas.txt` file was created

This is only prevented by using the `--no-ext-diff` flag on the `diff`
command, so a new `GitBinary::build_diff_command` has been introduced
which simply wraps `GitBinary::build_command` and adds the
`--no-ext-diff` flag, if necessary.

As a side-effect, this also makes it so that generating a commit message
in an untrusted repository works again, which was accidentally broken on
https://github.com/zed-industries/zed/pull/50649 .

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 commit message generation in untrusted repositories

Dino created

3e7f2e3 agent_ui: Add branch diff menu item to context menu (#51487)

Click to expand commit body
This PR adds the recently introduced "branch diff" mention option to the
"Add Context" menu in the message editor:

<img width="450" height="582" alt="Screenshot 2026-03-13 at 9  58@2x"
src="https://github.com/user-attachments/assets/1f5102e7-9018-4a5b-992d-43befa55dcbe"
/>

Release Notes:

- N/A

Danilo Leal created

b0cc006 ep: Error indication when Mercury free tier limit reached (#51447)

Click to expand commit body
Release Notes:

- Added an error indicator in the edit prediction menu with an error
message when the free tier limit is exceeded

Ben Kunkle created

7d566e0 extension_ci: Add initial support for extensions in a subdirectory (#51173)

Click to expand commit body
This wil help with releases for extensions living this repository, which
will become more relevant once agent provider extensions are back on the
table.

Release Notes:

- N/A

Finn Evers created

46f16c7 docs: Introduce fresh documentation for snippets in extensions (#50874)

Click to expand commit body
Add documentation for snippets in extensions.

Feel free to change the wording or add more content. 

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

---------

Co-authored-by: Finn Evers <finn.evers@outlook.de>

LBF38 and Finn Evers created

0674324 agent: Fix session close capability check (#51479)

Click to expand commit body
Release Notes:

- agent: Fixed an issue where external agents would return an error
because unsupported ACP method was called

Bennet Bo Fenner created