Skip to content

finished the work? - #1

Open
o1x3 wants to merge 423 commits into
maxktz:mainfrom
o1x3:superzed
Open

finished the work?#1
o1x3 wants to merge 423 commits into
maxktz:mainfrom
o1x3:superzed

Conversation

@o1x3

@o1x3 o1x3 commented Jul 21, 2026

Copy link
Copy Markdown

This PR merges branch superzed from o1x3/superzed into main. The list below shows all the work.

Upstream sync

  • We merged 398 commits from zed-industries/zed main into the fork.
  • We repaired the workspace test suite after the sync. All tests pass.
  • We applied rustfmt to all crates except agent_ui.

Features

  • client: A user can rename the personal organization.
  • git_ui: We added a helper that counts the uncommitted changed lines. This helper is the one source for diffstat data. We added tests for the diff tab.
  • workspace: We wrote documentation for the multi-workspace model. We added keys that cycle through projects and threads. We added tests.
  • agent_ui: A thread now has one of three run states: Running, ParkedOnHuman, or Idle. The panel header shows the state and the agent process liveness. We added harness tests.
  • agent_ui: The terminal restore state persists across restarts. We removed the placeholder panics.
  • sidebar: The workspaces panel shows the git branch and the uncommitted +/- counts for each project group. The chats panel shows the agent label and the age of each thread, and it has filters.

Fixes

  • workspace: Dock-only panels render, thus focus stays on them. The Bottom dock position maps to the Right dock in all code paths.
  • agent_ui: The panel drafts initialize on the first user focus. This prevents a fault in the sidebar archive functions. Panel-pane visibility is correct.
  • acp_thread: The streamed EntryUpdated events coalesce to the reveal-tick rate. This decreases the UI load during streaming.
  • workspace/persistence: The code compiles with all feature combinations.

CI/CD

  • We added the workflow .github/workflows/superzed_release.yml.
  • The workflow starts on each push to the superzed and main branches.
  • The workflow compares the version in crates/zed/Cargo.toml with the version before the push. If the version changed and no release exists for it, the workflow builds the release.
  • The workflow builds unsigned bundles for macOS (aarch64), Linux (x86_64), and Windows (x86_64) on GitHub-hosted runners.
  • The workflow then publishes the bundles as GitHub release v<version>.
  • A manual workflow_dispatch run does not do the version comparison. Use it to try a failed release again.
  • The builds set the release channel to stable. The builds set ZED_UPDATE_EXPLANATION at compile time. Thus the auto-updater is off, and a fork build cannot replace itself with an upstream Zed release.
  • We repaired script/bundle-linux and script/bundle-windows.ps1 for the binary name superzed.
  • The Windows script now finds Visual Studio with vswhere. It also finds the newest installed Windows SDK for makeAppx. It does not stop when there are no .pdb files.
  • We pinned the actions to the latest major versions: checkout v7, setup-node v7, upload-artifact v7, download-artifact v8.
  • We set the version to 1.13.1. The push started the workflow. The workflow published release v1.13.1 with all six assets.

Release Notes:

  • Added sidebar git and chat-filter panels, first-class agent thread run states, and an automated cross-platform release pipeline.

morgankrey and others added 30 commits July 8, 2026 20:54
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.
…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
cole-miller and others added 30 commits July 20, 2026 16:17
…-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.
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.