Sync upstream Zed to v1.10.2 - #10
Draft
crichalchemist wants to merge 1308 commits into
Draft
Conversation
…stries#56972) Markdown preview tabs were lost on restart because `MarkdownPreviewView` implements `Item` and `SearchableItem` but never opted into `SerializableItem`, so the workspace serializer silently skipped it. This change adds persistence, modeled on the existing `ImageView` and `Editor` patterns: - Add a `persistence` submodule storing `(workspace_id, item_id, abs_path, mode)` in a `markdown_previews` table. - `serialize` records the active editor's file path and the preview mode. `deserialize` reopens the file as a buffer and constructs a new `MarkdownPreviewView` around it. - Register the item type in `markdown_preview::init`. Untitled markdown buffers and previews whose source file no longer exists are not restored — `serialize` and `deserialize` return `None` and `Err` respectively, mirroring `ImageView`. `csv_preview` and `svg_preview` have the same `SerializableItem` defect; left out of this PR to keep scope focused. Closes zed-industries#38581 Part of zed-industries#7371 Release Notes: - Fixed Markdown preview tabs not being restored when reopening a workspace Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [ ] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable on the no tests bit, consistent with ImageView, ComponentPreview, GitGraph, TerminalView, and every other SerializableItem impl other than Editor. --------- Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Fix `cmd-c` not copying text inside macOS notebook cell editors. Previously, the macOS notebook keymap bound `cmd-c` to `notebook::InterruptKernel` in notebook contexts, including `NotebookEditor > Editor`. This shadowed the normal editor copy shortcut while editing notebook cells. ## Solution Move the macOS notebook interrupt shortcut from `cmd-c` to `ctrl-c`. This keeps the notebook interrupt shortcut available while allowing the normal editor keybindings to handle: - `cmd-c` for copy - `cmd-x` for cut - `cmd-v` for paste inside notebook cell editors. - This change is macOS-specific. Release Notes: - N/A --------- Co-authored-by: dino <dinojoaocosta@gmail.com>
…#59435) Release Notes: - N/A
…dustries#57376) Agents sometimes output status lists with bullets represented by emojis - see zed-industries#57372. These currently get rendered on one line, as opposed to bullet items like `-` or `*`, because single newlines within a paragraph are collapsed into spaces - standard CommonMark soft-break behavior *in prose* contexts (e.g. `README.md`). But in *comment/PR* contexts, GitHub preserves these newlines: ✅ Did A ✅ Did B ✅ Did C Users reasonably expect agent output to be rendered following the comment-style convention. ## What this PR does This PR adds a `soft_break_as_hard_break: bool` field on `MarkdownStyle` and enables it for `MarkdownFont::Agent`, so a single newline within a paragraph *in agent output* renders as a line break instead of a space. The field defaults to `false` to preserves CommonMark behavior everywhere else. In `themed_with_overrides`, sets it to `true` for `MarkdownFont::Agent`. The rendering switch in `MarkdownElement::request_layout` then emits `"\n"` instead of `" "` for `MarkdownEvent::SoftBreak` when the flag is set. This matches GitHub comments and Obsidian default behavior, and prevents emoji + trailing newline content from being collapsed onto a single line in agent responses. Scoped strictly to `MarkdownFont::Agent`. Hover popovers, diagnostics, markdown preview, README rendering, etc. are all untouched. Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [ ] Tests cover the new/changed behavior - visual tests completed: <img width="892" height="632" alt="image" src="https://github.com/user-attachments/assets/1aacb5da-edc8-49fd-bfe9-d37a22ae2d3f" /> - [x] Performance impact has been considered and is acceptable Closes zed-industries#57372 Release Notes: - Improved agent panel markdown rendering: single newlines within agent responses now render as line breaks, matching the convention used by GitHub comments and Obsidian. --------- Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Adds UI for the various scenarios where sandboxing can fail on linux: - no `bwrap` on the path - `bwrap` is setuid - `bwrap` exists but cannot create unprivileged userns --- Release Notes: - N/A or Added/Fixed/Improved ... --------- Co-authored-by: Martin Ye <martin@zed.dev>
# Objective - Describe the objective or issue this PR addresses. - If you're fixing a specific issue, use "Fixes #X" for each issue as [described in the GitHub docs](https://docs.github.com/en/issues/tracking-your-work-with-issues/using-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword). ## Solution - Describe the solution used to achieve the objective above. ## Testing - Did you test these changes? If so, how? - Are there any parts that need more testing? - How can other people (reviewers) test your changes? Is there anything specific they need to know? - If relevant, what platforms did you test these changes on, and are there any important ones you can't test? ## Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable ## Showcase > This section is optional. If this PR does not include a visual change or does not add a new user-facing feature, you can delete this section. - Help others understand the result of this PR by showcasing your awesome work! - If this PR includes a visual change, consider adding a screenshot, GIF, or video - A before/after comparison is very useful for changes to existing features! While a showcase should aim to be brief and digestible, you can use a toggleable section to save space on longer showcases: <details> <summary>Click to view showcase</summary> My super cool demos here </details> --- Release Notes: - N/A or Added/Fixed/Improved ...
Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Closes #ISSUE Release Notes: - N/A or Added/Fixed/Improved ... --------- Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
…stries#59274) # Objective Fixes zed-industries#58736 Pause the debugger on a breakpoint, switch your theme, and the active debug line keeps its old highlight color until you step again or restart Zed. ## Solution The highlight stores a concrete color grabbed from the theme back when `go_to_active_debug_line` ran. A theme switch goes through `theme_changed`, which refreshes brackets, semantic tokens, and outline symbols but never re-applies that highlight, so it stays stale. Re-running `go_to_active_debug_line` from `theme_changed` re-resolves the color against the current theme. ## Testing Added a regression test in `debugger_ui` that stops at a debug line, swaps the theme's `editor.debugger_active_line.background`, and checks the highlight follows. It fails on `main` and passes with the fix. Also tested by hand on Windows: started a debugpy session, paused at a breakpoint, switched themes from the theme selector, and watched the active line recolor live without stepping or restarting. ## Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [ ] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable ## Showcase Paused at a breakpoint, switching themes from the theme selector. | Before | After | | --- | --- | | https://github.com/user-attachments/assets/653a7e1b-3a99-4316-b1c9-b16ed7a7a8ba | https://github.com/user-attachments/assets/22a4c876-30f2-44c5-aad9-0f860639074c | --- Release Notes: - Fixed the active debug line color not updating when switching themes while the debugger is paused ([zed-industries#58736](zed-industries#58736)). --------- Co-authored-by: dino <dinojoaocosta@gmail.com>
Closes AI-403 Recently, we introduced the ability to pick, from the plus icon button in a project's header in the sidebar, which of the currently loaded worktree you'd like to create a new thread on. This PR extends this ability by allowing you to _create_ a new worktree from there as well. Turned out this just felt like a natural move after playing around with the change internally; we had a good amount of internal asks for this. What's exposed in the menu is exactly the same options available in the worktree picker, following the same display rules. <img width="650" alt="Screenshot 2026-06-15 at 12 22@2x" src="https://github.com/user-attachments/assets/ef45d93e-9106-46c6-9a8b-bc099036a7de" /> Release Notes: - Agent: Enabled creating a new worktree from the sidebar's "new thread" icon button.
## Summary - Adds an `agent.terminal_init_command` setting for Terminal Threads. - Runs the configured command automatically when creating a new Terminal Thread, while skipping restored terminal threads. - Documents the setting and exposes it in the AI settings page. Closes zed-industries#58697 Closes AI-337 Release Notes: - Added a setting to automatically run a command when opening a new terminal thread in the agent panel. --------- Co-authored-by: Anant Goel <anant@zed.dev>
Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - No unsafe blocks added. - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - No new UI components; behavior better matches user intent for opened folders. - [x] Tests cover the new/changed behavior - Added sibling-subdirectory project group regression coverage. - Extended subfolder Git-status test to ensure Git still uses the parent repo while project identity stays at the opened folder. - [x] Performance impact has been considered and is acceptable - Change adds one small enum/optional field check when computing worktree paths; no meaningful performance impact expected. Closes zed-industries#57997 Release Notes: - Fixed project grouping for opened subdirectories that share the same parent Git repository. ## Screenshots ### Before <img width="334" height="224" alt="Screenshot 2026-05-28 at 5 29 55 PM" src="https://github.com/user-attachments/assets/ad5b13c5-11a7-4fa4-a074-a519521641da" /> <img width="485" height="201" alt="Screenshot 2026-05-28 at 5 28 36 PM" src="https://github.com/user-attachments/assets/9cd2c138-92f5-4ff2-bf8f-21cdbeff0b79" /> ### After <img width="343" height="253" alt="Screenshot 2026-05-28 at 5 29 40 PM" src="https://github.com/user-attachments/assets/56a4dca7-f0a1-4530-8c89-3c4773b90486" /> <img width="420" height="206" alt="Screenshot 2026-05-28 at 5 29 22 PM" src="https://github.com/user-attachments/assets/d118340a-955e-4483-9888-4b566f59b931" /> --------- Co-authored-by: Anthony Eid <anthony@zed.dev> Co-authored-by: Anthony Eid <56899983+Anthony-Eid@users.noreply.github.com>
Early draft for zed-industries#32051 (multi-cursor editing is very slow, and basically hangs at high cursor counts). Opening it early like @Anthony-Eid suggested so we can agree on direction before I go further. ## Root cause Typing with a cursor on every line is mostly O(N)-per-keystroke work spread across a few places. I profiled it with `sample` and per-phase timers around `handle_input`. At 1000 cursors (~24ms before this PR): the post-edit display-map sync is ~11.8ms, the CRDT edit (`apply_local_edit`) ~3.7ms, resolving all N selections plus the per-cursor input loop ~3.5ms, the post-edit selection round-trip ~2.6ms, and `change_selections` plus transact machinery ~2.4ms. The display sync re-runs per-edit `SumTree` work through every layer even when nothing transforms (the plain-text case), and selections get re-resolved through the full display round-trip several times per keystroke. ## What this does - Display fast paths: `InlayMap::sync` (no inlays) and `WrapMap::interpolate` (no soft-wrap) skip the O(edits) transform-tree rebuild and return the passthrough snapshot, gated so a pending inlay splice or existing wraps still take the slow path. - Selection fast path: when nothing collapses buffer content (`!has_folds() && !has_replacement_blocks()`), resolve `Anchor` to `Point` to `Offset` batched and skip the per-selection display round-trip (the `todo(lw)`). - Render and autoscroll resolve only the first/last/newest selections instead of all N per frame. - A parameterized `Multi-cursor input/cursors/{1000,10000,100000}` benchmark. ## Results - Typing (`handle_input`): ~2.1x faster (24ms to 11.7ms at 1k). - Type plus two word-deletes (criterion): 29% faster (89.9 to 63.8ms) at 1k, 37% (959 to 606ms) at 10k. - Post-edit display sync alone: 11.8 to 3.8ms at 1k, 133 to 45ms at 10k. All `editor` (759), `display_map` (67), `multi_buffer` (58), and `text` (36) tests pass, and `./script/clippy` is clean. ## Direction This is ~2x, and I can get the current architecture to roughly 3.5-4.5x with a few more safe changes (hoisting the per-cursor language/editability checks, cheaper snapshot clones). Genuine VS Code numbers (~1-2us/cursor) aren't reachable while the buffer is a CRDT rope of fragments with anchor selections and a 5-layer transform stack. That would need a plain-offset cursor model and/or decoupling display layout from the edit path, which is a bigger effort I'd want to design with you. One thing I'd need your call on: `set_active_selections` sends an `UpdateSelections` collab op every keystroke (building N anchors); can that be debounced to transaction end, or do presence/follow-mode features rely on per-keystroke cursor broadcast? Release Notes: - editor: Improved multi cursor editing performance --------- Co-authored-by: Anthony Eid <anthony@zed.dev>
…ustries#58658) layout_word_diff_highlights converted each visible word diff to display points via isomorphic_display_point_ranges_for_buffer_range, which walks the inlay/fold/tab/wrap/block trees from the root on every call. With many word diffs on screen this re-walks the same trees repeatedly each frame. Add a DisplayPointConverter that holds a forward-only cursor for each display-map layer (mirroring the cursor reuse already done in BlockMap::sync) so consecutive conversions amortize to near-constant work. New forward cursors BufferOffsetToInlayPointCursor and BlockPointCursor back the inlay and block layers; the fold/tab/wrap layers reuse existing cursors. Each cursor gains a cheap reset() that delegates to the underlying SumTree cursor; the converter resets its cursors if an input range starts before the previous one ended, so it stays correct for overlapping inputs (e.g. the base and buffer word diffs of an inline modified hunk). layout_word_diff_highlights now sorts the visible word diffs and feeds them through a single converter. isomorphic_display_point_ranges_for_buffer_range is reimplemented on top of the converter to keep one code path. Release Notes: - Improved scrolling performance in diff views containing large hunks
…zed-industries#53789) ## Summary Adds two new editor actions: - `editor::SelectInsideDelimiters`: selects the content inside the nearest enclosing delimiters. Works for `()`, `[]`, `{}`, and string literals (`""`, `''`, `` ` ` ``). - `editor::SelectAroundDelimiters`: same as above, but the selection includes the surrounding delimiters themselves. This addresses the request in zed-industries#50042 ## Why not `select_larger_syntax_node`? `SelectLargerSyntaxNode` walks up the AST one level at a time. It's an incremental, history-aware operation: press repeatedly to expand outward by syntax tree level. The number of presses needed to reach a specific delimiter pair depends on the language's AST shape and is unpredictable: sometimes one press, sometimes three, sometimes overshoot. `SelectInsideDelimiters` is delimiter-based and stateless: one invocation jumps directly to the nearest enclosing pair, regardless of AST nodes. It's the equivalent of Vim's `vi(`, `vi{`, `vi"` text objects, available without requiring Vim mode. The two actions solve different problems. ## Implementation Both actions use `MultiBufferSnapshot::innermost_enclosing_bracket_ranges`, which already handles nesting, multi-buffer excerpts, and language-specific bracket definitions, including languages where quotes are declared as bracket pairs (Rust, Python, JavaScript, JSON, etc.). For string-like content where the language does not register quotes as brackets (notably Markdown inline content), `SelectInsideDelimiters` additionally falls back to a `syntax_ancestor` check for tree-sitter node kinds `string_content` and `inline`. This is the same set of node kinds already used in `select_larger_syntax_node`. Multi-cursor support comes from `move_offsets_with`. ## Tests Two new tests in `editor_tests.rs` covering: - Basic delimiter selection (parens, brackets, braces) - Innermost detection with nested pairs - String content selection (TypeScript) - Selection expansion when starting from an existing selection - No-op when cursor is not inside any delimiter ## Notes No default keybindings are provided. Users can bind via their keymap. Can add defaults if reviewers prefer. Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Closes zed-industries#50042 Release Notes: - Added `editor::SelectInsideDelimiters` and `editor::SelectAroundDelimiters` actions for selecting content within the nearest enclosing brackets, braces, parentheses, or quotes. --------- Co-authored-by: dino <dinojoaocosta@gmail.com>
…ies#59472) # Objective Both zed-industries#59005 and zed-industries#53789 introduced actions, at the editor context, which allow to select the content between brackets/delimiters, with the latter also adding an action to include the brackets/delimiters too. Shipping both would mean we end up with three distinct, but similar actions: * `editor: select inside enclosing bracket` * `editor: select inside delimiters` * `editor: select around delimiters` As such, in order to simplify this, the changes in this Pull Request remove the first action, while updating the logic for both `editor: select inside delimiters` and `editor: select around delimiters` in order to support continuous outwards expansion, like `editor: select inside enclosing bracket` supported. ## Solution * Remove `editor::SelectInsideEnclosingBracket` action, it's related method and tests * Updated `editor::selection::Editor::select_delimiters_impl` to use `MultiBufferSnapshot::enclosing_bracket_ranges` instead of `MultiBufferSnapshot::innermost_enclosing_bracket_ranges` so we can traverse all bracket ranges and expand to the next one ## Testing Besides manual testing, a new test case was added specifically for the selection expansion support, namely `editor::editor_tests::test_select_delimiters_expansion`. ## Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable --- Release Notes: - N/A
Follow up to zed-industries#52502 This fixes a severe hang in the markdown preview when searching for text caused by `paint_search_highlights`. We were iterating over all lines for each highlight, and for each highlight we called `layout.line_layout_for_index` which internally would iterate over all the lines of the text layout. With this optimisation we paint all highlights in one pass. We sort the highlight ranges, iterate through the lines and only access `WrappedLineSegments` when we actually have a highlight in that line. E.g. if you copy this text (https://gist.github.com/bennetbo/e313f3023da9fec42e090177a5373152) into the editor, open the markdown preview and search for `codex` Zed Nightly will completely freeze. After this optimisation it is totally smooth even in debug mode. Release Notes: - Improved performance when searching in markdown preview
…ustries#59469) Follow up to zed-industries#58883 This makes sure that we subtract the max output tokens before checking the threshold for auto compaction was reached, we had that logic before zed-industries#58883 but we lost it when introducing the settings. Without this GPT models will run out of tokens before auto-compaction is run Release Notes: - (Preview only) Fixed an issue where auto compaction would not be triggered
Adds a dedicated Sandbox settings page under the AI settings, letting users review and manage the elevated terminal sandbox permissions that are always allowed without prompting. The page exposes: - Network: an "Allow All Domains" toggle and an editable list of allowed domains (exact domains or leading-`*.` subdomain wildcards), with validation. - Filesystem: an "Allow All Filesystem Writes" toggle and an editable list of writable paths. - Sandbox: an "Allow Unsandboxed Terminal Commands" toggle. This replaces the single "Allow Unsandboxed Terminal Commands" setting item with the new page, and updates the agent panel's settings shortcut to open it. "Allow always" sandbox grants now persist to settings only and are no longer also cached as an in-memory thread grant. Closes AI-413 Release Notes: - Added a settings page for managing the agent terminal sandbox permissions (allowed domains, writable paths, and unsandboxed command execution).
Adds a step to the release and run_bundling workflows to build a statically-linked bubblewrap binary and upload it --- Release Notes: - N/A or Added/Fixed/Improved ... --------- Co-authored-by: Tom Houlé <tom@tomhoule.com>
In recent memory leak reports the log was lost (OS killed Zed or forced a reboot) or showed nothing about when memory grew, leaving us unable to correlate growth with LSP/toolchain activity in the log. This should help diagnose: - zed-industries#58987 - zed-industries#58662 - zed-industries#31461 The polling costs one single-PID, memory-only sysinfo refresh (roughly one syscall) every 30s — less than the existing per-language-server polling in `lsp_button.rs`. So the overhead of this shouldn't affect performance of Zed. Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - N/A
…'t support fast mode (zed-industries#59496) `OpenAiCompatibleLanguageModel::stream_completion` (used for custom OpenAI-compatible providers) forwarded `request.speed` straight into `into_open_ai`/`into_open_ai_response`, which translate `Speed::Fast` into OpenAI's `service_tier` field. Custom OpenAI-compatible endpoints don't recognize that field and reject the request. `speed` can end up set even for a provider that doesn't support fast mode: `Thread::inherit_parent_settings` copies `speed` from a parent thread to a subagent without checking whether the subagent's model supports it. Every other provider sharing this conversion code already guards against this (`open_ai.rs`, `anthropic.rs`, `anthropic_compatible.rs`, `language_models_cloud.rs`). This adds the same guard for `OpenAiCompatibleLanguageModel`. Release Notes: - Fixed requests to OpenAI-compatible providers (e.g. Baseten) sometimes including an unsupported `service_tier` parameter
Adds: - aria attributes to most UI elements in settings UI - a new a11y API to GPUI - a fix for a GPUI keyboard focus bug ## Accesible settings UI Settings UI should now be fully accessible to users of assistive technology. **However**, there are some caveats: - accessibility features require zed to be launched with the `ZED_EXPERIMENTAL_A11Y=1` env var to be set - I have not exhaustively checked every control - There are some quite surprising keyboard focus behaviours which predate this code - The main Zed UI is still largely inaccessible, though a handful of shared components will now report themselves, but the experience is suboptimal. For anyone wishing to try out the settings UI: - make sure `ZED_EXPERIMENTAL_A11Y=1` is set - open zed - press `ctrl-,` (or `cmd+,` on a mac) to open settings UI in a separate window ## `aria_active_descendant` This is equivalent to the [`aria-activedescendant`](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-activedescendant) API on the web. It allows a container to maintain focus, while indicating that one of its children should be active. Zed uses this for menus and combo boxes, for example. GPUI will report a div with `.aria_active_descendant()` as long as: - an ancestor is focused - only one descendant of the focused ancestor has `.aria_active_descendant()` Two descendants with this property where the focused node is a common ancestor is an error. ## GPUI keyboard fix GPUI will map a space or enter keypress to a div's `on_click` handler, if it exists. However, the keyboard-driven path was missing some checks that the mouseclick path has. With this PR, for an enter/space keypress to be considered a click, between the "key down" and "key up" events: - there must be no other key events - focus must not move to a different node This fixes an existing bug with combo boxes in zed where: - enter maps to `menu::Confirm` **on key down* - the menu item is selected - focus moves to the combo box - enter then triggers the combo box's `on_click` **on key up**, re-opening the menu --- Release Notes: - N/A or Added/Fixed/Improved ... --------- Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
…es#59446) ## What Adds `step-security/harden-runner` as the first step of the Linux Namespace jobs in `run_tests.yml`, running in audit mode (`egress-policy: audit`). In audit mode it records each job's outbound network connections and blocks nothing — there is no change to what the jobs can do. Pinned to `step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411` (v2.19.4); v2.19.0+ is required for Namespace runners. Each run links to its per-run insights from the job log. ## Scope - **Included:** the 13 Linux Namespace jobs in `run_tests.yml`. - **macOS excluded:** harden-runner's monitoring agent is Linux-only on Namespace runners — it skips install on Namespace macOS, so it adds no coverage there and its cleanup step fails. - **Also not included:** the Windows jobs, the `tests_pass` gate (no checkout, no egress to record), and the `extension_tests` reusable-workflow call. - The shared job builders (`clippy`, `run_platform_tests`, `check_scripts`, `orchestrate`) are reused by other workflows, so they take a flag to add the step only in the `run_tests` context. `release.yml`, `release_nightly.yml`, and `extension_tests.yml` are unchanged. ## How Edits the workflow DSL under `tooling/xtask/src/tasks/workflows/`; the YAML is regenerated with `cargo xtask workflows`. ## Verification - `cargo xtask workflows` is idempotent — the `check_scripts` parity check passes. - `cargo fmt --check` and `actionlint` clean; `zizmor` shows no new findings vs. baseline. Release Notes: - N/A --------- Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
…stries#58881) Moves the crash handler subprocess spawn off the main thread to speed up startup, especially on Windows where process creation is slower. Previously `crashes::init` did part of its work synchronously when it was *called*, including `spawn_crash_handler`, which launches the `zed --crash-handler` child process (a synchronous `CreateProcessW` on Windows). Because `init` is evaluated inline as the argument to `background_executor().spawn(crashes::init(...))` in `main.rs`, that subprocess spawn ran on the main thread during startup rather than on the executor. This PR makes `connect_and_keepalive` a fully `async fn`, so all of that work, including the subprocess spawn, now runs on the background executor instead of blocking the main thread. I don't have a Windows machine to capture before/after numbers, but the crash handler spawn is clearly on the startup critical path. Logs in the Windows slow startup reports show it taking ~100–700ms between `spawning crash handler process` and `connected to crash handler process` (e.g. zed-industries#40621, zed-industries#54856), all of which previously blocked the main thread. Related to zed-industries#49442 Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - Improved startup performance
…s#59483) Follow up to zed-industries#59473 The previous code could actually highlight the wrong match if you passed in unordered ranges. However, i realized that all codepaths are passing in ordered matches already, so I just added some `debug_asserts` to ensure that this is always the case. Release Notes: - N/A
…d-industries#59423) Closes FR-79. Release Notes: - Improved delegate behaviour when dismissing `Open Path` prompt
See zed-industries/alacritty@4c12966. The main change here is making `set_nonblocking` return `Result` rather than panicking. Closes FR-78. Release Notes: - N/A
Summary - Adds Windows agent terminal sandboxing by routing commands through WSL and Bubblewrap. - Supports native Windows and WSL project paths, including elevated write grants for WSL paths. - Shows a confirmation prompt to turn off sandboxing when WSL sandbox setup is unavailable. This builds on the work in the sandbox-linux branch. Closes AI-376 Release Notes: - Added Windows terminal sandboxing for agent commands when sandboxing is enabled. --------- Co-authored-by: cameron <cameron.studdstreet@gmail.com> Co-authored-by: Richard Feldman <oss@rtfeldman.com> Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
…ries#59497) Adds a global `agent.sandbox_permissions.enabled` setting (defaulting to on) that controls whether agent-run terminal commands are wrapped in an OS-level sandbox, and surfaces it as an Enable Sandbox toggle at the top of the sandbox settings page. When the toggle is off, the rest of the sandbox settings UI is hidden, and `sandboxing_enabled` now requires both the existing feature flag and this setting so commands actually run unsandboxed. Because the setting defaults to `true` rather than `false`, the compiled `SandboxPermissions` gets a manual `Default` impl instead of the derived one. Release Notes: - Added a setting to enable or disable the agent terminal sandbox, toggleable from the agent sandbox settings page.
Enable the existing agent sandboxing feature flag for staff by default, so staff builds use sandboxed terminal commands without needing an explicit flag override. Release Notes: - N/A --------- Co-authored-by: Martin Ye <martin@zed.dev>
Large change to sandboxing: - fixes a nasty TOCTOU relating to a symlink swap attack, documented in the `sandboxing/README.md` - Adds UI and restrictions when in an untrusted workspace - Adds tests for (soon to be removed) git support --- Release Notes: - N/A or Added/Fixed/Improved ...
…s#60148) We were signaling this too early, causing the syncing generator to get updated too soon. Release Notes: - N/A
Right now subpages are not searchable. Since we don't have the bandwidth to implement this today, this PR adds support for having aliases users can search for. E.g. if I search for `claude` I will see the LLM provider subpage, whereas previously I would not see anything. https://github.com/user-attachments/assets/25af5c5a-86d2-473b-b0dd-11141b12a089 Release Notes: - N/A
Helix's keymap to `Vertically center the line` (`align_view_center` command) is `zc` ([documentation](https://docs.helix-editor.com/keymap.html#view-mode)). Release Notes: - Added Helix's `z c` keymap to editor, project panel and outline panel to scroll cursor to center
Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Closes zed-industries#54160 Summary: In Helix mode, rename could fail when the cursor was visually positioned on the last character of a symbol. The editor renders some Vim/Helix selections with the visible cursor offset from the selection head, but rename was still using the raw selection head as the LSP prepare-rename position. This updates rename to use the visible cursor position for point lookup when cursor offset rendering is active. It also adds regression coverage for Helix rename and Vim visual rename. Verification: - `cargo check -p editor` - `cargo fmt --check --package editor --package vim` - `git diff --check -- crates\editor\src\editor.rs crates\vim\src\test.rs` - `test::test_rename` - `test::test_helix_rename_uses_visible_cursor_position` - `test::test_visual_rename_uses_visible_cursor_position` Release Notes: - Fixed Helix mode rename when the cursor is visually on the last character of a symbol. --------- Co-authored-by: dino <dinojoaocosta@gmail.com>
…w` (zed-industries#59415) This makes sure that the behaviour of the CLI matches that of the UI. In Zed itself we always open a new window (e.g. when clicking on Open Project in new window in the recent projects picker), but in the CLI we where re-using existing windows even when specifying "cli_default_open_behavior": "new_window". This caused confusion, so this PR ensures that we always open a new window, even if that folder is already open. We still focus the active window in the case where the path is a subpath of a project that is already open. Can be tested with ``` cd crates/cli cargo run -- --zed ../../target/debug/zed somefolder ``` Release Notes: - cli: Ensure `zed somefolder` always opens a new window, even when `cli_default_open_behavior` is set to `new_window` and the project is already open
…ed-industries#59860) Closes AI-159 Closes AI-434 Closes AI-435 Release Notes: - Key agent-related settings now live in the settings editor, close to all other settings available in Zed. This specifically includes the move of LLM providers, external agents, and MCP servers to the settings editor. --------- Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com> Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de>
…d-industries#60154) Closes zed-industries#59038 Release Notes: - agent: Fixed an issue where MCP servers with specific tool names would cause errors when using Anthropic/OpenAI models
…ed-industries#60139) # Objective Zed supports trusting all projects under a given directory. However, when a local Windows client connects to a remote Linux server, the trust scope input rejects valid directories with the error "Enter an absolute folder path", even though the path is correct. <img width="681" height="374" alt="image" src="https://github.com/user-attachments/assets/87f084fb-1213-4594-96cb-3de81f4789aa" /> The root cause is in the `validate_trust_scope` function: https://github.com/zed-industries/zed/blob/53e4d34a71f61f13572919c04335e9da838623e6/crates/workspace/src/security_modal.rs#L497-L519 which uses `Path::is_absolute()` to check whether the entered path is absolute. On Windows, this method only considers paths with a drive letter as absolute, so Unix-style paths like `/home/user` are never recognized. When doing cross-platform remote development, valid trust scopes are incorrectly rejected. ## Solution The `util::paths` crate already provides a helper for this situation: https://github.com/zed-industries/zed/blob/53e4d34a71f61f13572919c04335e9da838623e6/crates/util/src/paths.rs#L575-L586 The fix - Adds a `path_style: PathStyle` parameter to `validate_trust_scope` and uses `util::paths::is_absolute()` in place of `Path::is_absolute()`. - The call site in `edited_trust_scope` retrieves the path style from the worktree store, which already tracks whether a connection is local or remote and the remote host's path convention. The associated unit tests were updated for the new function signature. ## Testing Built and tested locally; `cargo test -p workspace` passed. ## Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [ ] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable --- Release Notes: - Fixed the "Folder to trust" input rejecting valid folder paths when connecting to a remote host that uses a different path style than the local machine.
…industries#60185) Zed don't surface the fact that bookmarks can have labels/names now anywhere except opening the bookmark name editor every time you place one. This keeps the label/name mechanism but makes the default add bookmark action add an unnamed one. Next step is probably to enable holding shift (or some other modifier) to place a named bookmark, or even a setting to switch between default named vs unnamed. Release Notes: - N/A
…ed-industries#59849) ## Summary It is incremental step to solve issue zed-industries#59825. This PR addresses the need for facilitating quick edits for matches obtained by ‘text_finder’. This makes the text finder remember the last query, so you can jump to a match, make a quick edit, and reopen the finder to the same results instead of typing the same query again. ## Problem A common flow is, open the text editor, then jump to first match, edit that file, then reopen the finder to continue for next matches. But on the reopen, the query was seeded from under the cursor. And after editing, the cursor is usually sitting on an unrelated word, and previous search was lost. The root cause is priority, the word under the cursor was seeding the query. ## Solution Reorder query seeding so last query outranks the cursor word, then cursor word can be dropped entirely, since last query is prioritized over the word under cursor, the last query always wins, so checking the cursor word afterwards is dead code. And JetBrains makes the same choice, entirely ignores word on the cursor for seeding query. Explicit selection still outranks the last query, since selecting text is usually a deliberate choice. ### Before 1- Active project search query (if any) 2- Active buffer search query (if any) 3- Selected text or word under the cursor 4- Empty ### After 1- Active project search query (if any) 2- Active buffer search query (if any) 3- Selected text 4- Last query (of this project) 5- Empty With updated order, this friction disappears (the same order is also observed in JetBrains). To make the last query persistent, it is stored per project in the database along with the active filters (case sensitive, whole word, regex), so they also survive reopening the project. ## Testing - Manually verified the seed priority order between the options. - Verified the last query is seeded when project is reopened. - Verified filters are restored regardless of this query order. Release Notes: - Improved the text finder to seed the last query and filters to make quick edits easier. --------- Co-authored-by: ozacod <ozacod@users.noreply.github.com> Co-authored-by: Yara 🏳️⚧️ <git@yara.blue>
This makes it so that we show open the settings UI instead of the modal when adding an MCP server when clicking on `Add server`: <img width="240" height="320" alt="image" src="https://github.com/user-attachments/assets/bc5e9059-1053-45d5-8fd5-acfb7da48a35" /> We still show the modal when installing an extension. Since we're hopefully replacing MCP extensions with MCP registry support soon, we can leave it as is for now. Release Notes: - N/A
Behind a feature flag as we iterate on the RFD Release Notes: - N/A --------- Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de> Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
…ndustries#60195) Release Notes: - N/A --------- Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com> Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [ ] Unsafe blocks (if any) have justifying comments N/A - [x] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [ ] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Remote `HEAD` refs such as `origin/HEAD` and `upstream/HEAD` are symbolic refs that point to a remote's default branch. These refs can appear in the branch picker, but selecting them shows this error prompt:  This happens because the local branch name is directly derived from the selected ref, resulting in an attempted checkout of a local branch named `HEAD`. This change follows up on feedback from zed-industries#57588, which just filtered remote `HEAD` refs out of the branch picker to prevent the error prompt. As mentioned in [this comment](zed-industries#57588 (comment)), I agree that the preferred behaviour should be to instead allow checking them out - useful for repos with multiple remotes such as an upstream. For example, if `refs/remotes/origin/HEAD` points to `refs/remotes/origin/main`, selecting `origin/HEAD` now behaves like selecting `origin/main`, switching to the corresponding local `main` branch instead of trying to create or check out a branch named `HEAD`. This does not fetch or pull from the remote; it uses the locally known remote refs. Release Notes: - Fixed selecting remote HEAD refs from the branch picker --------- Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Removes git sandbox feature The reason is essentially: - write access to a `.git` dir can be trivially escalated to unsandboxed access - therefore, it is misleading to offer git access separate from unsandboxed access - instead, we encourage the model to use `--no-optional-locks` to avoid needing write access to `git status`, etc. Adds sandboxing to fetch tool --- Release Notes: - N/A or Added/Fixed/Improved ... --------- Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
…y-pick to preview) (zed-industries#60283) Cherry-pick of zed-industries#60210 to preview ---- WSL downloads a linux zed binary for the sandbox helper. But the flag is set on the `zed-editor` binary, not the `zed` cli binary. This fixes that --- Release Notes: - N/A or Added/Fixed/Improved ... Co-authored-by: Cameron Mcloughlin <cameron.studdstreet@gmail.com>
…action names (zed-industries#60300) (cherry-pick to preview) (zed-industries#60362) Cherry-pick of zed-industries#60300 to preview ---- # Objective In the keymap editor, bindings whose `keymap.json` entries use a deprecated action alias (e.g. `"editor::CopyRelativePath"` for `workspace::CopyRelativePath`) could not be deleted or edited. Aliases resolve to the canonical action on load, so the row displays normally, but file updates searched for the canonical name and never matched the alias entry. Deleting failed ("Failed to find keybinding to remove"), and editing silently fell back to appending a new binding — leaving the user with duplicate identical-looking rows they couldn't remove. ## Solution - Thread gpui's deprecated-alias map (`App::deprecated_actions_to_preferred_actions`) into `KeymapFile::update_keybinding`, and resolve aliases in file entries when matching bindings. - As a side effect, editing an alias-based binding now rewrites the entry with the canonical action name instead of duplicating it. ## Testing - Unit tests in `settings` for removing and replacing alias-based entries. - End-to-end keymap editor tests (fake fs → keymap load → `KeymapEditor` → delete) covering both the alias case and plain duplicate bindings. ## Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments - [x] The content adheres to Zed's UI standards ([UX/UI](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) and [icon](https://github.com/zed-industries/zed/blob/main/crates/icons/README.md) guidelines) - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable --- Release Notes: - Fixed the keymap editor failing to delete or edit key bindings whose keymap file entries use deprecated action names Co-authored-by: Ben Kunkle <ben@zed.dev>
…w_window"` (zed-industries#60652) (cherry-pick to stable) (zed-industries#60672) Cherry-pick of zed-industries#60652 to stable ---- Closes zed-industries#60325, Follow up to zed-industries#59415 Fixes an issue where launching Zed from the cli (just `zed`, no path) would not restore the previous window when using `cli_default_open_behavior: new_window` Release Notes: - cli: Fixed an issue where the previous workspace would not be restored when using `cli_default_open_behavior: new_window` and no path was provided
…erry-pick to preview) (zed-industries#60636) Cherry-pick of zed-industries#60499 to preview ---- ## Summary - Added `InterpolateFailed` as a distinct edit prediction rejection reason. - Kept `InterpolatedEmpty` for successful interpolation that leaves no edits. - Updated interpolation callers to classify failed interpolation separately from empty edit vectors. Release Notes: - N/A
…able) (zed-industries#60699) Cherry-pick of zed-industries#60697 to stable ---- Co-authored-by: Christopher Biscardi <chris@christopherbiscardi.com> Add new GPT 5.6 models Release Notes: - open_ai: Added support for GPT 5.6 Sol/Terra/Luna --------- Co-authored-by: Christopher Biscardi <chris@christopherbiscardi.com> Co-authored-by: Bennet Bo Fenner <bennet@zed.dev> Co-authored-by: Christopher Biscardi <chris@christopherbiscardi.com>
…#60743) (cherry-pick to stable) (zed-industries#60745) Cherry-pick of zed-industries#60743 to stable ---- Release Notes: - agent: Added GPT 5.6 Sol & Terra for ChatGPT subscription. Note: GPT 5.6 Luna is not available yet, since OpenAI has not unlocked access for third-party clients Co-authored-by: Bennet Bo Fenner <bennet@zed.dev>
Design for the one-time catch-up port (fork is 1,305 commits behind stable tag v1.10.2): conflict-resolution plan, compile-drift strategy, local clippy+smoke done bar (fork CI is org-gated off, CER-1601), and docs revision plan. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9-task plan: merge + 5 conflict resolutions, per-crate compile-fix loop for API drift (Serena navigation, ./script/clippy authoritative), smoke test, docs revision, and PR. Compile-fix tasks are procedural with concrete exit gates since drift depth is not knowable until the compiler talks. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
# Conflicts: # .github/workflows/track_duplicate_bot_effectiveness.yml # Cargo.toml # crates/agent_ui/src/agent_panel.rs # crates/agent_ui/src/agent_ui.rs # crates/agent_ui/src/thread_import.rs
Author
|
Extra drift axis for the porter: the sibling |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Draft — do not merge until the compile/drift port is done and
./script/clippy+ smoke pass in a pinned-toolchain environment.Syncs the fork with upstream Zed v1.10.2 (latest stable tag, cut 2026-07-10), 1,305 commits ahead of our last sync. Follows the design/plan in
docs/superpowers/specs/2026-07-12-upstream-sync-v1.10.2-design.mdanddocs/superpowers/plans/2026-07-12-upstream-sync-v1.10.2.md. Tracks CER-1600.Done in this PR
Merge + 5 conflicts resolved (
git merge v1.10.2):.github/workflows/track_duplicate_bot_effectiveness.ymlCargo.tomlresvg(upstream) andreverie-deepagent(ours)agent_ui.rsimportsProject, added upstream'sprompt_store::{self, …, rules_to_skills_migration}+rope::Pointagent_ui.rsFrom<AgentId>ReverieAgentarmagent_panel.rsExtensionStoresubscription (dropped our inline native-agent registration, superseded byensure_native_agent_connection); kept the "Reverie" menu item alongside upstream's new "Terminal" itemthread_import.rsfor store in storesloop; preserved the Reverie augment-skip by switching its singleserverconstruction toserver_without_augmentcargo metadataconfirms the merged manifest resolves (247 members).sync_agent_servers_from_extensionsis fully removed with no dangling references.Remaining — compile/drift port (TODO for a pinned-1.95.0 environment)
This machine could not certify the build (see Environment below), so the following drift — surfaced by rust-analyzer against the merged tree — is not yet fixed:
reverie_agent— ACP API realignment (src/augment.rs,src/connection.rs,src/observer.rs,src/tests.rs):acp::{ContentBlock, TextContent, StopReason, SessionId, PromptCapabilities}andacp_thread::UserMessageIdto upstream's currentacpsurface (upstream crates use these under new paths/shapes).agent_servers::AgentServertrait no longer declaresdefault_model,set_default_model,favorite_model_ids,toggle_favorite_model— our impl inaugment.rs(lines ~337–394) must drop/relocate these to match the new trait.dream_inspector— check for the same ACP/Zed API drift oncereverie_agentcompiles.ReverieAgentnon-exhaustive matches — add arms in:agent_ui/src/agent_connection_store.rs(1),agent_ui/src/agent_panel.rs(2),agent_ui/src/agent_ui.rs(9). Recover the intended behavior fromorigin/main's versions.Then:
./script/clippygreen, smoke test perdocs/smoke-test-runbook.md, and update the phase docs (2026-05-02-remaining-phase-work.mditem #3 + drifted specs) — Tasks 6–8 in the plan.Environment blocker (why this is a draft)
rustc 1.97.0is on PATH; the repo pins 1.95.0 and there is norustupto switch.ui/gpuicode emitsfloat_literal_f32_fallback(a warn-by-defaultfuture_incompatiblelint)../script/clippyruns-- --deny warnings, turning those upstream warnings into hard errors independent of any drift fix — so the clippy gate is unreachable here.Release Notes: