finished the work? - #1
Open
o1x3 wants to merge 423 commits into
Open
Conversation
Context This PR makes the Zed docs easier for AI tools, search crawlers, and users to consume without changing the visible docs content. The current production docs are primarily optimized for browser navigation. They do not expose first-class Markdown URLs, an `llms.txt` index, page-level copy affordances, or machine-readable freshness metadata that let users and agents grab clean, current page content. Changes - Generate Markdown copies for docs pages during the mdBook postprocess step, including `/docs/index.md` as an alias for Getting Started. - Generate `/docs/llms.txt` from the mdBook chapter list, grouped by `SUMMARY.md` sections and annotated with page frontmatter descriptions. - Generate `/docs/sitemap.xml` with `<lastmod>` values for every docs page. - Emit machine-readable freshness metadata in HTML via `last-modified` and `article:modified_time` meta tags. - Generate Cloudflare Pages `_redirects` for `.html`, extensionless, and `.md` redirect variants, with channel-aware docs destinations. - Add discovery hints for agents and crawlers: `rel="llms.txt"`, `rel="alternate" type="text/markdown"`, and a short generated `llms.txt` directive in copied Markdown pages. - Update the docs proxy so `Accept: text/markdown`, `/docs.md`, and direct `.md` requests can resolve to the generated Markdown artifacts. - Move primary docs content earlier in the HTML source while preserving the visible layout, so crawlers and agent scorers encounter the article before sidebar chrome. - Move the existing copy-as-Markdown control from the top navigation into the page-title row, using the generated Markdown alternate link as the source of truth. - Split AI-discovery artifact generation out of `docs_preprocessor/src/main.rs` into a focused module. Best Practices Adopted - Use `llms.txt` as a concise navigation index, not a dump of full page content. - Link to absolute, canonical Markdown URLs from `llms.txt`. - Preserve the docs hierarchy in `llms.txt` instead of emitting a flat sitemap-like list. - Include short per-link descriptions from existing metadata rather than inventing summaries. - Keep `llms.txt`, Markdown copies, sitemap data, redirects, and freshness metadata generated from the same mdBook source to avoid drift. - Advertise Markdown alternates with standard HTML metadata and same-origin URLs. - Support both explicit Markdown URLs and content negotiation for clients that prefer Markdown. - Keep browser copy behavior pointed at generated Markdown alternate links instead of duplicating route inference in JavaScript. - Keep the copy-as-Markdown affordance in the page title row without duplicating header chrome controls. Validation - `cargo check -p docs_preprocessor` - `cargo test -p docs_preprocessor` - `./script/clippy -p docs_preprocessor` - `mdbook build ./docs --dest-dir=../target/deploy/docs/` - `node --check docs/theme/plugins.js` - `pnpm dlx prettier@3.5.0 docs/theme/plugins.js --check` - `git diff --check` - Local artifact checks confirmed generated Markdown pages, `llms.txt`, `sitemap.xml` lastmod values, HTML freshness metadata, Markdown alternate links, redirect targets, and preprocessed action/keybinding tags resolve as expected. - Worker URL rewrite mock covered `/docs/`, `/docs.md`, `/docs/index.md`, extensionless docs routes, `.html` routes, `/docs/llms.txt`, and `/docs/sitemap.xml`. - High-effort adversarial subagent review found blockers around channel-aware redirects, shallow-checkout date fallback, file size, duplicated Markdown path inference, and process spawning. Those were addressed. Remaining Notes - Local `python -m http.server` does not emulate Cloudflare Pages pretty URLs, `_redirects`, or the docs-proxy Worker, so full local `afdocs` still cannot prove content negotiation end to end. - Existing production remains unchanged until this PR is deployed through the docs workflow. - Production baseline `npx afdocs check https://zed.dev/docs/ --fixes --verbose` still reports the original failures before this PR is deployed: 12 passed, 8 failed, 3 skipped. Release Notes: - Improved docs AI-readiness by adding machine-readable discovery, Markdown access, and freshness metadata. --------- Co-authored-by: Katie Geer <katie@zed.dev> Co-authored-by: Ben Kunkle <ben@zed.dev>
…adding (zed-industries#60482) `PolychromeSprite` in `crates/gpui/src/scene.rs` is `#[repr(C)]` and had a `grayscale: bool` field followed by 3 compiler-inserted padding bytes that were never written. The wgpu renderer's `instance_bytes` reinterprets `&[PolychromeSprite]` as `&[u8]` via `slice::from_raw_parts` and passes it to `queue.write_buffer`, so those uninitialized padding bytes were exposed behind a shared `&[u8]` on every frame that draws an image or emoji, which is undefined behavior. Rather than widening the field to a raw `u32` (which would suggest values other than 0 and 1 are meaningful), this introduces `PaddedBool32`: a `#[repr(transparent)]` wrapper around `u32` whose only public constructor is `From<bool>`, so the 0-or-1 invariant is enforced by the type while the layout has no padding. `Underline.wavy`, which was already a raw `u32` for the same reason, is converted too. cbindgen emits the wrapper as `typedef uint32_t PaddedBool32;`, so the generated Metal header and shaders are unchanged. The WGSL and HLSL shaders already declared these fields as `u32`/`uint`; their `& 0xFFu` masks, which existed to ignore the garbage padding bytes, are now simplified to plain comparisons. Release Notes: - N/A
…s#58353) Jump the caret straight to the next/previous block of prose comments — like paragraph motion, but for comments. The motivating workflow: reflowing a file's comments with `editor: rewrap`. Today that means reaching for the mouse to click into each comment block scattered through the file, or using other cursor motions and undershooting or overshooting the target. With these two actions you can step from one comment paragraph to the next, `rewrap`, and repeat — reflowing every comment in a file without ever touching the mouse. It's also handy for skimming a heavily-documented file: hop from doc comment to doc comment without manually scrolling past the code in between. Adds two editor actions: - `editor::MoveToNextCommentParagraph` - `editor::MoveToPreviousCommentParagraph` Both move the caret to the first non-whitespace character of the next/previous *comment paragraph*. They have no default keybinding and are available from the command palette ("editor: move to next/previous comment paragraph"). ### What counts as a comment paragraph A comment paragraph is a run of consecutive comment lines. A line is a comment line when its **first non-whitespace character is in a `comment` syntax scope** and the line contains prose (at least one alphanumeric character). This is determined from the syntax tree (`language_scope_at(...).override_name()`), the same mechanism `rewrap` and comment folding already use, so it behaves correctly without per-language string matching: - **End-of-line comments preceded by code are ignored** — on `let x = 1; // note` the first non-whitespace character is code, not a comment, so the line is not a paragraph line. - **`//` inside a string literal is ignored** — its scope is `string`, not `comment`. - **Blank/divider comment lines separate paragraphs** — a bare `//` or `// -----` (no prose) acts as a separator, so you can hop between paragraphs *within* one comment block as well as across blocks. Both directions always move to a paragraph *other* than the one the caret is in: when the caret is inside a paragraph, the whole current paragraph is skipped, so `Prev` lands on the previous paragraph's start rather than the current paragraph's own start. ### On the autoscroll These two actions scroll the destination near the top of the viewport (`Autoscroll::top_relative`) rather than using the default `Fit` strategy that sibling motions use. This is deliberate and specific to the feature: you are jumping to the **start** of a comment paragraph that extends *downward*, so biasing the destination toward the top keeps the whole paragraph visible after the jump. This matters for the rewrap workflow above — you want to see the full comment you are about to reflow, and the reflow itself changes the paragraph's line count. With the default `Fit`, repeated forward jumps creep the caret to the bottom edge and leave long paragraphs cut off below the fold — the opposite of what this motion is for. Happy to revisit the exact strategy/offset if you'd prefer consistency with the other motions. ### Tests Two tests in `editor_tests.rs` (using a real grammar + comment override query): - `test_move_to_next_and_previous_comment_paragraph` — full forward/backward round trip, covering blank comment-line separators, code separators, trailing comments, and the no-more-paragraphs stop. - `test_move_to_previous_comment_paragraph_skips_current_paragraph` — `Prev` from mid-paragraph skips to the previous paragraph, and stays put when there is no previous paragraph. --- Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [x] Unsafe blocks (if any) have justifying comments — N/A, no unsafe - [x] The content is consistent with the UI/UX checklist - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - Added `editor::MoveToNextCommentParagraph` and `editor::MoveToPreviousCommentParagraph` actions to move the caret between comment paragraphs
…zed-industries#60640) # Objective Hi! This PR updates the Ruby doc to mention 2 language servers `kanayago` and `fuzzy-ruby-server`. ## Testing N/A ## 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 N/A --- Release Notes: - N/A
…w_window"` (zed-industries#60652) 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
…es#60443) Fixes a panic when multibuffer paths change under a cursor hover Fixes ZED-9W1 Closes FR-112 Release Notes: - N/A or Added/Fixed/Improved ...
…t EOF (zed-industries#60445) BlockMap::sync unwrapped the transform cursor for every edit, assuming each edit's old.start lands strictly inside the old transform tree. The companion (split-diff) branch of sync can compose an edit anchored at the trailing boundary of the old transforms, leaving the cursor past the end of the tree and aborting the process on the None unwrap. Only bind the transform when there are rows preceding the edit. Fixes ZED-9V4. Closes FR-113 Release Notes: - N/A or Added/Fixed/Improved ...
…ed-industries#60657) Closes zed-industries#59083 Closes zed-industries#42958 Closes zed-industries#59612 This PR improve selection copy of Agent Panel and Markdown Preview such that copied text is always valid markdown, following how VSCode handles it. The partial selection of styled text would not copy broken syntax like `bold**` or ```inline code` ``` like before. Now we follow simple rule: > Selecting any part, no matter from where, copies it as its markdown. Except when the selection sits entirely inside a single inline code span, in which case we copy plain text, for terminal and code use cases. Examples: This is **bold** text, this is *italic* text, and this is `code` all `in one` sentence. - selecting only bold → `**bold**` - selecting normal text and partial bold → `is is **bo**` - selecting a single code span completely → `code` - selecting partial code → `od` - selecting partial text and code → `` his is `cod` `` - selecting multiple code spans partially → `` `ode` all `in o` `` - selecting multiple code spans end to end → `` `code` all `in one` `` Nested spans, like **bold with `code` inside**: - partial text in bold → `**ld wi**` - partial code in bold → ``**`od`**`` - full code in bold → ``**`code`**`` - the whole sentence → ``**bold with `code` inside**`` Links, like [Visit Rust's website](https://rust.org): - partial link text → `[bsite](https://rust.org)` - full link text → `[Visit Rust's website](https://rust.org)` How it works: Selection boundaries that land inside delimiter syntax (`**`, backticks, etc.) first snap out so no delimiter is left half-selected. Then any spans the selection cuts through get their delimiters re-added, outermost first, so nested styling stays balanced. Only the root blocks containing the two selection boundaries are inspected, everything in between is copied right as is, which also keeps this cheap on large documents. Release Notes: - Improved copying selected text in Agent Panel and Markdown Preview. Partial selections of styled text now copy as well-formed markdown, and selections within a single inline code span copy as plain text.
…tries#60625) Release Notes: - N/A
Release Notes: - N/A
…ustries#60638) # Objective Allow zed's language model stack to express OpenAI Responses API custom tools (freeform text-input tools with an optional lark/regex grammar), so downstream consumers can offer tools like a freeform `apply_patch` to GPT models. ## Solution - `LanguageModelRequestTool` now carries a Function-vs-Custom input variant; `LanguageModelCustomToolFormat` models text/grammar formats. - `LanguageModelToolUse.input` becomes a typed `LanguageModelToolUseInput::{Json, Text}`. Serialization is tagged so persisted Text inputs round-trip losslessly; legacy plain JSON values still deserialize as `Json`. - `open_ai` gains the custom tool wire types (tool definition, `custom_tool_call`/`custom_tool_call_output` input items with string-or-content-part outputs, output item, and `custom_tool_call_input` delta/done stream events). The Responses event mapper accumulates raw text deltas into `ToolUse` events, and history replay derives custom-vs-function tool results from the matching `ToolUse` by id. - All non-OpenAI providers and the Chat Completions path error explicitly when a request contains custom tools — no silent drops or empty-schema coercions. Release Notes: - N/A
# Objective - Report V4 edit prediction patch apply failures as cloud rejection events. - Closes EP-210 ## Solution - Added `PatchApplyFailed` as an edit prediction rejection reason. - Converted `prediction_edits_for_single_file_diff` errors into rejected prediction results so the existing rejection pipeline posts them to `/predict_edits/reject`. - Kept interpolation failures reported as `InterpolateFailed`. ## Testing - Ran `cargo fmt --check && cargo check -p edit_prediction`. ## 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: - N/A
…ies#55755) Reordering worktree roots by drag-and-drop had silently broken: a worktree-root filter added to `disjoint_entries` for delete-safety stripped roots before the drop handler could see them, so root-to-root drops never reached the existing `move_worktree` reorder path. This PR is the minimal regression fix: - Move the worktree-root filter out of `disjoint_entries` and into `disjoint_effective_entries` (used by cut/copy/delete), so drag-and-drop keeps seeing roots and single-root reorder works again via the existing `move_worktree` path. - Filter worktree roots out of `drag_onto`'s copy branch, so holding the copy modifier over a drag that contains a root no longer returns `None` from `create_paste_path` and silently cancels the whole copy. - Add `test_drag_worktree_root_reorders_worktrees` exercising the drag-onto reorder flow end to end. The larger feature work (multi-root group reordering, blank-area "send to end", copy-mode drag feedback, and syncing worktree order to collaborators) has been split into a separate follow-up PR so this fix can land quickly. Note that worktree order was intentionally not synced during collaboration, so that change is discussed separately. Closes zed-industries#46699 Release Notes: - Fixed drag and drop to reorder worktrees --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
…ooldown (zed-industries#60662) GlobalWatcher::add returns Ok(None) while the native watch-limit cooldown is active, and FsWatcher::add_existing_path treated that as success: the path was never watched, with no retry and no error. A long-lived watch (like a repository's git directory) that happened to register during a cooldown window silently never received events. Route the skipped registration through the existing pending-path machinery, which already polls until registration succeeds and emits a rescan event for the path so that changes missed in the interim are picked up. --- Release Notes: - N/A or Added/Fixed/Improved ...
…ed-industries#60664) update_git_repositories mapped a changed .git path to a repository with find_map, so when several repositories share a git directory - a main checkout plus one of its linked worktrees in the same project worktree - a ref update under the shared common dir only bumped git_dir_scan_id on whichever repository iterated first, leaving the others stale until an unrelated event happened to refresh them. Collect every matching repository and bump each one. --- Release Notes: - N/A or Added/Fixed/Improved ...
What looks like a single event of applying a few labels is actually multiple events, and the raciness is racy as we've recently experienced. One solution would've been adding a “first responders notified” label for enforcing consistency but issues already have enough labels (and we could take it off by mistake), so a bot reaction will instead serve as a marker for any later runs. So if we're applying multiple labels or changing our mind about, say, an area label after the notification has already been sent, this should work fine now, without duplicate notifications. Release Notes: - N/A
…0470) This makes them more consistent with regards to limiting the label size. These two tabs are similar because they frequently house a label that's pretty big, and the agent diff tab didn't truncate it in any way. Release Notes: - N/A
Closes zed-industries#57144 Release Notes: - agent: Allow expanding in-progress MCP tool calls Co-authored-by: Christopher Biscardi <chris@christopherbiscardi.com>
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>
…s#57959) This PR fixes a few History tab edge cases in the Git Panel. For a fresh repo with no commits, the History tab now finishes loading and shows No commits yet instead of sitting on Loading… indefinitely or falling into a misleading empty/error state. It also fixes detached HEAD history loading. In that case, the Git Panel asks the backend to load history from the current commit SHA. The local git backend was accidentally treating the raw object ID bytes as a string instead of formatting them as a normal hex SHA, so git log could fail before returning any commits. The backend now passes the SHA in the format git expects. **Repro for empty repo:** mkdir /tmp/zed-empty-history cd /tmp/zed-empty-history git init zed . Open Git Panel → History. Before: History could stay stuck on Loading…. After: History shows No commits yet. **Repro for detached HEAD:** mkdir /tmp/zed-detached-history cd /tmp/zed-detached-history git init echo hi > file git add file git commit -m initial git checkout --detach HEAD zed . Open Git Panel → History. Before: History could fail to load commits. After: History shows the commit history normally. 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 Release Notes: - Fixed Git history tab states for empty repositories and detached HEAD history. Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
Dropping a scheduled runnable cancels its task and makes the next poll of any awaiter panic with "Task polled after completion." The only paths where we drop these runnables seem to be during shutdown or extreme resource exhaustion, so, let's leak the runnables instead of crashing. On Windows, we also moved to calling the Win32 thread pool API directly, because 1) WinRT thread pool API is just a wrapper that adds overhead we don't need, and 2) the closure we pass to the `WorkItemHandler` object takes ownership of the runnable object, so if the WinRT thread pool releases the delegate, it can free the runnable without our control. Release Notes: - N/A
# Objective Fixes zed-industries#60709 by removing the duplicate menu section for "MCP Servers". ## Solution Update `agent_ui::agent_panel::AgentPanel::render_panel_options_menu` to ensure the "MCP Servers" section is only rendered once, if not using a Terminal Thread. ## Testing Tested manually, comparing against the stable release, as this bug is present in Preview. Screenshot is shown in the "Showcase" section. ## Self-Review Checklist: - [x] I've reviewed my own diff for quality, security, and reliability - [ ] 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) - [ ] Tests cover the new/changed behavior - [ ] Performance impact has been considered and is acceptable ## Showcase <details> <summary>Before</summary> <img width="2736" height="1586" alt="CleanShot 2026-07-09 at 23 14 34@2x" src="https://github.com/user-attachments/assets/ce2014db-bd72-46fb-bfa1-247cd5471daf" /> </details> <details> <summary>After</summary> <img width="2736" height="1586" alt="CleanShot 2026-07-09 at 23 15 13@2x" src="https://github.com/user-attachments/assets/bbba9965-3f6a-4137-94e5-17704efd2cce" /> </details> --- Release Notes: - N/A
…es#60717) Release Notes: - Fixed a panic when running “Show in Git Graph” while the Git Graph was already open.
…#60743) 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
### Closes zed-industries#51951 ## 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 - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable #### Note : Reopens previous work from closed PR zed-industries#52161 (fork was deleted) ## Video [Screencast from 2026-03-22 23-26-06.webm](https://github.com/user-attachments/assets/ab68e47a-7e74-4f1e-991d-8ca4fed7952c) ## Release Notes: - Fixed MCP servers from `.zed/settings.json` not being discovered when multiple project folders are open in a workspace. --------- Co-authored-by: Bennet Bo Fenner <bennetbo@gmx.de> Co-authored-by: Christopher Biscardi <chris@christopherbiscardi.com> Co-authored-by: Bennet Bo Fenner <bennet@zed.dev>
…d-industries#59586) # Objective - Fixes zed-industries#58097. - Opening a new project and clicking `+` in the agent panel to start a terminal thread creates two terminals instead of one. I am able to replicate the issue on version 1.8.0 on macOS 27 ## Solution The new-thread action creates the terminal and then focuses the agent panel. Focusing re-activates the panel (`Panel::set_active` then `ensure_thread_initialized`) before the terminal, which is spawned asynchronously, has registered. The panel still looks uninitialized at that moment, so it spawns its own "initial" terminal too, and that is the duplicate. `spawn_terminal` now marks the spawn as in-flight (`pending_terminal_spawn`) the moment it starts, the same way the restore and initial-terminal paths already do, so the existing guard in `ensure_thread_initialized` skips the redundant terminal. This only affected new (unrestored) projects, since existing ones restore their previous entry instead of auto-creating one. The auto-init behavior was introduced in zed-industries#57150. ## Testing - Verified in a local dev build on macOS: opening a fresh project and clicking `+` now creates one terminal, and clicking `+` again creates a second, as expected. Reopening an existing project still restores a single terminal. - Added `test_explicit_terminal_blocks_redundant_auto_init`, which fails without the fix. - The change is platform-agnostic (no platform-specific code); I wasn't able to test on Linux/Windows. ## 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 a duplicate terminal being created when starting an agent terminal thread in a new project
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#57174 Release Notes: - Open non-writeable files in Capability::Read mode Co-authored-by: Lukas Wirth <lukas@zed.dev>
Removes the feature flag. The RFD is in Preview and I am confident it will be stable without major changes by the time this hits Zed Stable. Release Notes: - acp: Allow ACP agents to use Elicitation capturing structure user input.
zed-industries#58879) ## Context On Linux, `ctrl-q` is globally bound to `zed::Quit`. When a `TerminalView` is focused, pressing `ctrl-q` quit the application instead of forwarding the keycode to the shell, breaking programs like `ftp`, `tig`, and any app that uses XON/XOFF flow control. Windows already had the fix: its `Terminal` keymap context overrides `ctrl-q` with `["terminal::SendKeystroke", "ctrl-q"]`. The Linux keymap was simply missing that override. Closes zed-industries#58809 Manual test after fix below : [Screencast from 2026-06-09 00-46-37.webm](https://github.com/user-attachments/assets/3d103b2a-bff1-4559-af1d-2a52d57a6b18) ## How to Review - **`assets/keymaps/default-linux.json`** : One-line addition in the `Terminal` context under the "Overrides for conflicting keybindings" comment, mirroring the existing Windows entry. - **`crates/terminal_view/src/terminal_view.rs`** : Regression test `ctrl_q_is_forwarded_to_terminal_not_quit` (Linux-only, `#[cfg(target_os = "linux")]`): loads the default keymap, focuses a display-only terminal, simulates `ctrl-q`, and asserts the PTY receives byte `0x11` instead of the quit action firing. ## Self-Review Checklist - [x] I've reviewed my own diff for quality, security, and reliability - [ ] Unsafe blocks (if any) have justifying comments - [x] The content is consistent with the UI/UX checklist - [x] Tests cover the new/changed behavior - [x] Performance impact has been considered and is acceptable Release Notes: - Fixed `ctrl-q` quitting Zed instead of being forwarded to the shell when a terminal is focused on Linux
Turns out I only tested it with all tabs closed, the keybinding would only work when all tabs were closed and you focused the agent panel. If a file was opened in the center pane, cmd-f would open a search in that file instead of searching in the agent panel, even if the thread view as focused. Closes zed-industries#60686 Release Notes: - agent: Fixed an issue where cmd-f would not work if file is open in center pane
…-industries#61272) The diff already has a constant-time accessor to get the counts of added/removed rows, use that instead of iterating hunks on the foreground. Release Notes: - Improved performance in agent threads with many file changes.
…EYS` (zed-industries#61347) ## Objective The doc comment links for `Settings::PRESERVED_KEYS` point to `[FileContent](Self::FileContent)` but that associated type was removed by the settings refactor in zed-industries#38367. `Settings::from_settings` now takes `&SettingsContent` directly. The dead link causes `rustdoc::broken_intra_doc_links` warnings when building docs for the `settings` crate: ``` warning: unresolved link to `Self::FileContent` --> crates/settings/src/settings_store.rs:61:53 | 61 | /// The name of the keys in the [`FileContent`](Self::FileContent) that should | ^^^^^^^^^^^^^^^^^ the trait `Settings` has no associated item named `FileContent` ``` Fixes zed-industries#57310 ## Solution Replaced both `[FileContent](Self::FileContent)` occurrences in `crates/settings/src/settings_store.rs` with `[SettingsContent]`, which is already in scope via the existing `use` at the top of the file and resolves correctly. Docs-only change, no runtime behavior change. ## Testing - Verified with `cargo doc -p settings --no-deps`, which now completes without any `broken_intra_doc_links` warnings (previously emitted two). - No runtime code touched — doc comments only, so no other testing applies. ## 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
…stries#61201)" (zed-industries#61351) This reverts commit 690c7fa. # Objective language detection is firing very often in channel notes, often picking YAML instead of markdown, causing some language-detection flickering. cc/ @amtoaer (author of the original PR)
…tries#60780) # Objective Docker Compose devcontainers currently resume only the primary container when an existing environment is stopped. Supporting services listed in `runServices`, such as databases and caches, remain stopped. Fixes zed-industries#60779 ## Solution Reuse the Docker Compose startup path when resuming an existing Compose-based devcontainer. The resume path now: - Runs `docker compose up -d --no-recreate`. - Targets the services configured in `runServices`. - Uses the original Compose files and project name. - Avoids recreating the existing devcontainer. - Preserves the existing `docker start` behavior for non-Compose devcontainers. A regression test verifies that the requested services are resumed, unrelated services are excluded, and the existing container is not recreated. ## Testing Tested on macOS with: - `cargo fmt --all --check` - `cargo test -p dev_container` - `cargo clippy -p dev_container --tests -- -D warnings` All 112 `dev_container` tests pass. Also tested against a multi-service Docker Compose devcontainer containing a workspace, web server, PostgreSQL, Redis, and Celery. All configured services resumed while the workspace container retained the same container ID. ## 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 Docker Compose dev containers not starting all configured services when resuming an existing environment. --------- Co-authored-by: dino <dinojoaocosta@gmail.com>
…#60552) Fixes an issue where toggling an MCP server on/off in Settings → AI → MCP Servers does not update the toggle state in the UI immediately. ## Root Cause There were two issues: 1. `ContextServerStore::update_server_state()` and `remove_server()` emitted `ServerStatusChangedEvent` but did not call `cx.notify()`, so Settings UI observers were not informed to re-render. 2. `render_toggle_switch()` was bound to `is_running` (runtime status) instead of `is_enabled` (settings state). ## Solution - Add `cx.notify()` in both methods after emitting the status event. - Change toggle to read `settings.enabled()` and rename parameter from `is_running` to `is_enabled`. ## Testing - `cargo check -p settings_ui -p project` passes. - `cargo fmt --check` passes. - Manual verification: open Settings → AI → MCP Servers, toggle a server, observe immediate UI update. --- Release Notes: - Fixed MCP server toggle not updating immediately in Settings UI. --------- Co-authored-by: dino <dinojoaocosta@gmail.com>
Resolved 22 conflicted files keeping upstream refactors (focus-region a11y, pane maximize, tab-icon extraction, MCP settings UI) layered under fork features (sidebar, multi-workspace cards, PaneKind, SwitchSize, thread switcher). Dropped fork-obsolete bottom-dock code paths and their upstream tests, adapted ContentMask corner_radii (fork) against upstream call sites, and re-pinned Cargo.lock. cargo build --workspace green.
Add a "Rename Organization…" entry in the title bar user menu with a modal, wired through CloudApiClient::rename_organization (PATCH /client/organizations/:id) into UserStore state. Names are validated (empty, too long, unchanged, case-insensitive collision) and failures surface as workspace notifications rather than being dropped. Tests cover the happy path (request method/path/body, trimmed name, organizations and current_organization updated, single OrganizationRenamed event) and invalid/duplicate/unknown-id rejection with no state change and no HTTP request.
…tests - Add pub fn uncommitted_changed_lines() in project_diff.rs: sums BufferDiff::changed_row_counts over every uncommitted-changed buffer (modified, untracked, deleted), the same per-buffer quantity the Uncommitted Diff view's multibuffer sums, so external consumers such as a sidebar per-project diffstat agree with the diff tab's toolbar counts by construction. - Add test_uncommitted_diff_tab_reflects_working_tree_edits: editor tab and Uncommitted Diff tab coexist; a working-tree edit plus save refreshes the open diff view via the status event chain. - Add test_calculate_changed_lines_matches_uncommitted_diffstat: modified + untracked + deleted fixture; view counts and the helper agree exactly. - Fix post-merge git_panel test expectation (search highlights 1 -> 2): upstream diff editor snapshots now include expanded-hunk deleted rows. - Fix clippy::eq_op in theme fallback (100./100. -> 1.0) that blocked clippy for all dependents.
…ycling keys and tests - Document the N-workspaces-per-project-group model on MultiWorkspace and ProjectGroupState: workspaces are grouped (not deduped) by ProjectGroupKey (main-worktree PathList + optional remote host); same paths on different hosts are distinct groups. Covers group lifecycle (lazy creation, rekey on WorktreePathsChanged, groups outliving workspaces) and the persistence split (MultiWorkspaceState in KVP vs per-workspace SQLite). - Add default keybindings for sidebar::NextProject/PreviousProject and sidebar::NextThread/PreviousThread (macOS ctrl-cmd-[/] variants, Linux ctrl-alt-[/] variants). - Add tests: project-group cycling order and wrap-around, cycling action delegation to the sidebar, MultiWorkspaceState KVP round trip, and remote-vs-local group distinctness via RemoteClient::connect_mock. - Fix pre-existing breakage in touched files: sidebar.starts_open default flip in 4 tests, clippy --all-targets errors in persistence.rs (cfg'd Mock arm exhaustiveness, bind_instead_of_map) and redundant clones. - Add release_channel and semver dev-dependencies (needed by connect_mock).
…ess tests
- ThreadRunState { Running, ParkedOnHuman(ToolCallConfirmation|Elicitation), Idle }
computed in one place and mapped to AgentThreadStatus; parked-on-human is now
explicit state covering tool-call auth and elicitations
- process liveness: AgentConnection::server_alive + AcpThread::server_exit_status
wired from the child-exit path; dead server surfaces as Error status
- chat header meta line (harness version, model, cwd) and conversation footer
(model, cwd, branch)
- generating indicator verified across transitions; tab lifecycle +
serialization tests; custom agent server settings round-trip + env override
unit tests
… panics Terminal threads: deterministic created_at ordering for terminal-thread metadata, stale shell-title re-persistence, and a debounced trailing cwd recheck so restore reopens the final working directory, with store and panel round-trip/restore/delete tests. Test doubles: all unimplemented!() sites in conversation_view/connection/ language_model_selector replaced with truthful non-panicking behavior; the thread-metadata migration TODO resolved as a dated keep decision; the legacy external-session entry deleted — share-link and clipboard imports now mint a ThreadId, seed metadata, and route through create_agent_thread_with_server.
Workspaces panel: branch name and +N/-N diffstats on project rows via ProjectGitInfo with tolerant repo-to-root mapping; a header "+" add-project button reusing the recent-projects popover; distinct active-row highlight; active_workspace_id persistence; deterministic project/thread cycling with selection and reveal. Chats panel: agent label and relative age on thread rows and switcher entries; funnel filter over agent, status, and project group; live thread switcher propagation via ThreadSwitcher::sync_entries. Post-merge in-crate repairs: restored search/filter input pipeline, draft-row handling, live thread info merge from AgentPanel conversations, and test-infra fixes (ActiveCall global init, deterministic sidebar open state, call/title_bar test-support dev-deps). New tests: project header branch/diffstats, tolerant repo mapping, row activation and active highlight, active workspace id persistence, chats recency ordering, agent label, relative age, thread filters, deterministic cycling, switcher sync.
… dock remap Docks render again but only when holding a non-hosted panel (production panels are hosted as pane items, so the UI is unchanged); GPUI focus can now stick for dock-only panels, fixing 9 workspace and 2 terminal_view test failures. Bottom-requesting panels consistently map to the right dock at both remap sites, and the pane_group axis split result is checked instead of discarded.
…l sidebar diffstats - initialize agent panel drafts on first user focus instead of programmatic activation, restoring archive/unarchive and property-test invariants - AgentPanel::is_visible accounts for panel-pane hosted items - restore AgentPanel bootstrap when unarchiving into a fresh workspace - never demote promoted thread-metadata rows or clobber stored titles - sidebar project rows now consume git_ui::uncommitted_changed_lines (canonical buffer-row counts) with status diff_stat fallback for remote projects; agreement pinned by test (sidebar == diff view == (5,4)) - agent_ui 413/413, sidebar 152/152 under nextest
…ck rate Per-network-chunk EntryUpdated emission (999 events per 1000 chunks) caused full agent_ui subscriber fanout at unbounded chunk rate; events now fire from the 16ms reveal tick and flush only when visible content changes (75 events per 1000 chunks, 13.3x fewer; -23% dispatch wall time), and update_text_in_place no longer copies the full markdown source per snapshot. Adds coalescing benchmark/regression tests and docs/src/development/agent-performance.md with ranked follow-ups. Includes rustfmt pass on remaining agent_ui files.
- project_panel: pin hide_root=false in test init (fork default flipped); adapt reveal-fallback test to hosted panel panes - editor: pin fork-changed defaults in geometry-sensitive tests (indent guides, runnables gutter, scrollbar/gutter widths, line height, breadcrumb symbols); fix latent race in hover-link and autoindent tests - call/workspace: port window-activation location sync and follower active-view reset that lived in the removed TitleBar (fixes following and channel-guest integration tests) - workspace: force_remove_pane prefers tabbed panes; keep last tabbed pane alive so nav history survives closing the final item - outline_panel: don't clear tracked editor when a hosted panel item becomes active - auto_update: drive poll directly (Superzed hardcodes poll_for_updates off so it never self-replaces with upstream Zed); add db test-support - debugger_ui/settings_profile_selector/zed: adapt tests to fork layout (sidebar open, panes as cards, hosted panel items) - collab db tests run against local postgres (docker superzed-test-pg)
Release on version update pushed to superzed/main: build unsigned macOS (aarch64), Linux (x86_64), and Windows (x86_64) bundles on GitHub-hosted runners and publish them as GitHub release v<version>. Fix bundle-linux and bundle-windows.ps1 for the renamed superzed binary, locate Visual Studio via vswhere (hosted runners ship Enterprise, not Community), fall back to the newest installed Windows SDK for makeAppx, and tolerate missing .pdb files when debuginfo is disabled.
… v7, download v8)
glibc 2.38+ headers on ubuntu-24.04 emit __isoc23_* symbol references into C objects (aws-lc-sys), which fail to link into the static musl remote_server. Ubuntu 22.04 (glibc 2.35) predates those symbols and also lowers the glibc floor of the shipped tarball. Its stock clang 14 is too old for webrtc-sys, so install clang-18 from apt.llvm.org.
Classifies Claude Code and Codex CLIs running in terminals as working, blocked, or idle by matching rules against narrow screen regions (prompt box body, text after the last horizontal rule, codex prompt marker) and the OSC title, so scrollback and spinner frames don't cause false positives. A StatusTracker debounces Working->Idle flapping between spinner frames.
Terminal wakeups now feed a debounced screen scrape through agent_detect: the foreground process identifies the agent, the screen tail and OSC title classify it as working, blocked, or idle, and confirmed transitions surface through the existing terminal notification path (badge + sound) when the terminal isn't visible. Pending idle holds reschedule their own scrape since a finished agent stops producing output.
Terminal thread rows now show the scraped agent state through the same status indicator ACP threads use, label the row with the agent name and age (claude · 3m), count toward the project header's running/waiting indicators, and participate in status filters. Rows without a detected agent keep the previous behavior of hiding under any active filter.
The new-thread menu gains entries that spawn a terminal thread and launch the chosen agent CLI in the project's working directory, after the configured terminal init command. Launch argv is quoted per-argument so future arguments (session ids, paths) reach the program as literal data.
Terminal threads remember which agent CLI they ran and which session it wrote. Sessions are discovered read-only on disk — Claude Code's newest project transcript modified since the agent started, Codex's rollout whose metadata matches the working directory — and persisted alongside the terminal metadata (new agent/agent_session columns). Restoring a terminal relaunches claude --resume <session> or codex resume <session>, falling back to claude --continue / a fresh codex when no session was captured. Remote projects skip discovery since their session files live on the other host.
Sidebar rows for terminal chats show the detected agent's icon (Claude spark / OpenAI mark) instead of the generic terminal glyph, and the agent panel renders a muted one-line footer under an agent terminal with agent · working directory · branch, mirroring the ACP chat header.
Findings from an adversarial review pass: - Clear a terminal's captured session when the detected agent changes, so a claude session id is never replayed through codex resume (and vice versa). - Persist the agent label on first detection even when a status transition lands in the same scrape; previously an idle-only claude terminal could restore as a plain shell. - Match codex rollout cwds against the exact JSON-quoted value so /repo/app no longer captures /repo/app2's session, and prefer a terminal's actively-written current session over the globally newest one when two agents share a working directory. - Guard the codex filename uuid slice against multibyte stems (byte indexing could panic mid-codepoint). - Classify Claude Code's folder-trust startup dialog as blocked and detect generation from the esc-to-interrupt status line when the OSC title isn't forwarded. - Show persisted agent icon and label on sidebar rows whose terminal isn't live, and give the new-terminal menu entries their agents' icons.
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.
This PR merges branch
superzedfrom o1x3/superzed into main. The list below shows all the work.Upstream sync
Features
Fixes
CI/CD
.github/workflows/superzed_release.yml.superzedandmainbranches.crates/zed/Cargo.tomlwith the version before the push. If the version changed and no release exists for it, the workflow builds the release.v<version>.workflow_dispatchrun does not do the version comparison. Use it to try a failed release again.ZED_UPDATE_EXPLANATIONat compile time. Thus the auto-updater is off, and a fork build cannot replace itself with an upstream Zed release.script/bundle-linuxandscript/bundle-windows.ps1for the binary namesuperzed.Release Notes: