Skip to content

[pull] main from microsoft:main - #70

Open
pull[bot] wants to merge 10000 commits into
AppInitio:mainfrom
microsoft:main
Open

pull[bot] wants to merge 10000 commits into
AppInitio:mainfrom
microsoft:main

Conversation

@pull

@pull pull Bot commented Aug 11, 2021 •

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot]

Can you help keep this open source service alive? 💖 Please sponsor : )

Christof Marti and others added 28 commits October 24, 2026 09:43
Expose Manage Remote Environments in the Command Palette and Sessions overflow, rename the editor, remove code-action tooltips from the environment menu, and left-align inline actions. Preserve the same modal sizing behavior as Customizations and Language Models.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: keep group rename draft across list rerenders

The inline group name editor was recreated from the saved name on every list refresh, discarding what the user had typed. Share the draft/selection/focus restoration used by session and chat renames with the group renderer.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* sessions: close reopened group rename editor in test teardown

In browser unit tests the focused editor was blurred on disposal and committed into a groups service mock that lacks renameGroup.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Layer a profile-local hidden preference over existing provider availability and expose Show/Hide actions without affecting connections or sessions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Distinguish unavailable hosts from hidden preferences, share picker eligibility checks, and preserve visibility preferences across registration and availability changes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Unhide explicit remote folder selections without overriding availability, keep existing drafts sendable on hidden connected hosts, and fix CI formatting.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Show per-section spinners beside counts until each discovery completes, with cancellation-safe progress and accessible busy state.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Restore original picker availability when remote management is off, retain saved hidden preferences, and gate the command, overflow entry and open editor.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Link the section info action and empty-state guide to the planned vscode-agent-environments redirect.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
… a disk I/O budget (#342357)

agentHost: give the durable workspace transition restart test a disk I/O budget

'restores one durable transition before provider output after service restart' was skipped as flaky (#339669). It opens, closes and reopens a real SQLite database on disk, so most of its time is spent in fsync-bound commits. Where the node.js unit tests run with mocha's 2s default (the ADO Flaky Smoke Tests runs), an occasional file system stall on a loaded Linux agent pushes it past the budget. Its SessionDatabase siblings with the same pattern were fixed the same way in #340024.

Un-skip the test with an explicit 10s timeout.

Fixes #339669

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: polish cloud automations for Universe

Hide unsupported cloud actions, improve repository ownership recovery, and keep grouping and trigger metadata consistent across visual and accessible presentations.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep automation history and restored remote container destinations independent of picker visibility. Surface per-section discovery failures immediately, including missing tunnel authentication.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…I steps (#344036)

Rerun failed tests in isolation and split integration CI steps

Select failed tests and hook suites by title in fresh Electron windows or Node processes, retaining file-level fallback for large failure sets. Keep runner safety checks and per-file pass attribution intact, and report recovered failures as flaky.

Split node and extension-host integration runs so extension-host coverage continues after failures, and enable bounded retries for node integration and Agent Host E2E in pull request CI.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#344051)

Picks up microsoft/vscode-distro#1478, which adds the authIssuers and
languageModelRateLimit API proposals to GitHub.copilot-chat in product.json.
The extension already declares both proposals (#337846, #340100), so without
this the workbench logs that product.json enables fewer API proposals than
the extension wants, and built products do not enable the proposals.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…3998)

The runtime can start a newly offered client tool before the setTools
response reaches the host. Previously routing was only committed after
the response, so such a start had no client contributor and its handler
could wait forever.

Stage routing before replacing tools instead: route the union of applied
and offered client tool names, and prefer offered definitions when
resolving the owning client, while replaceTools is in flight. Commit the
offered set on success and restore the applied routing on rejection.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: add row actions to artifact details lists

Artifact details items can declare actions that run directly through their details lease, like Load More, without the run executor. Lists render them in a floating row action bar that keeps focus and shows per-item progress. The GitHub pull request integration uses this to rerun failed GitHub Actions checks and resolve review comments, hiding resolved threads immediately rather than after the next poll.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* sessions: fix Chats section test broken by concurrent main merges

#343746 removed the QUICK_CHATS_SECTION_ID import and the Chats section under date grouping, while #343744 added a capped Chats section test that used both. Restore the import and run that test for the groupings that still have a Chats section, workspace and repository. This fixes the client type check in Compile & Hygiene.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* sessions: harden artifact row actions after review

Rerun Check now refreshes and requires current core and check results before running, verifies with GitHub that the linked job is that check's run on the current head, and is only offered when the linked job is the check's own run. Only the list's focused row puts its actions in the tab order, and a focused row action follows its item when the list reorders instead of staying with the reused row.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
#344059)

Agent Host changes for lszomoru/agents/investigate-websocketoverduplex-test
* sessions: hide external banner for automations

Keep automation sessions external for ownership and filtering while suppressing the external-session banner.
…344062)

The sessions/artifactDetails/CommentsInformation fixture rendered the same
view as the Attention fixture and only added a click-opened instant hover
on the Comments tab information button. That transient hover was captured
inconsistently, so the Light screenshot changed on unrelated PRs.

Remove the fixture and its now-unused tabInfo scenario. The same hover is
still covered by sessions/artifactIntegrations/PullRequestCommentsInformation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…er (#344047)

* Agent Host changes for lszomoru/agents/test-module-import-failure-fix

* Fix browser test dependencies exposed by import failure checks

Replace Node-only events and Buffer usage in the common WebSocket fixture so its tests run in browsers. Move the CommonJS-dependent TextMate fixture suite to the Electron test lane without dropping coverage. Keep module import errors fatal.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix browser benchmark imports and drain console logs before cleanup

Use the cross-platform environment helper so the opt-in object mutation benchmark can be imported without a Node process global. Wait for pending console listeners before closing the page so error argument serialization does not race browser cleanup and mask the original import failure.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Use browser-supported strict assertions in terminal escaping tests

The browser assertion shim does not export assert.strict. Import strictEqual directly to preserve strict comparisons while allowing the suite to register in browser runs.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Drop WebSocket test changes superseded by upstream Node move

Keep the relocated test identical to origin/main now that #344059 places its Node-only dependencies in the Node test lane. Preserve the browser runner and remaining compatibility fixes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Automations: graduate settings
…onments-visibility

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add inline clear and collapse actions, and offer explicit tunnel permission sign-in instead of a generic discovery error when no usable token exists.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix GitHub Feed plugin activation and installation identity

Persist runtime enablement for direct plugins, activate confirmed catalog installs, and reload live chat contributions. Reconcile Browse rows and uninstall actions using stable installation identity while preserving separate marketplace copies.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Fix formatting in plugin installation UI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Handle plugin activation cancellation and rejected enablement

Await all post-uninstall chat reloads before surfacing errors. Guard runtime enablement against local policy collisions and restore its previous state if the local commit is rejected. Update the MCP test to supply plugin discovery and await the async action, fixing browser and Electron CI.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
vs-code-engineering[bot] and others added 30 commits October 26, 2026 23:03
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Adds a chatPromoWidgetArmed event the first time a promo's status-bar pip is shown, alongside the existing chatPromoWidgetShown and chatPromoWidgetAction events.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Dmitriy Vasyura <dmitriv@microsoft.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…44448)

Add --workers <count> to the browser unit test runner, as for the Electron and Node.js runners. Every worker launches its own browser, whose page claims test files through its worker's test server with the claiming code of parallel.ts; claims are idempotent and retried, because WebKit can lose a synchronous response on a busy machine. Browsers run one at a time with workers, and failures are rerun in a single browser. PR checks use --workers 4.

Also fix three tests that were slow enough in WebKit to time out when run in parallel: tick fake timers synchronously in the paced sender test, whose timeout left the fake clock installed for later tests, compare a 6 MB artifact with VSBuffer.equals, and bisect for the toast fit height instead of laying out every height.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…44139)

<!-- Thank you for submitting a Pull Request. Please:
* Read our Pull Request guidelines:

https://github.com/microsoft/vscode/wiki/How-to-Contribute#pull-requests
* Associate an issue with the Pull Request.
* Ensure that the code is up-to-date with the `main` branch.
* Include a description of the proposed changes and how to test them.
-->

Part of #344310

Today, chat in a regular editor window can only use the local agent
host, cloud sandboxes, and the agent host of the window's own remote.
Agent hosts on other machines are only available in the Agents window.
This PR lets a workspace bring its own remote agent hosts into the
editor window, so you can chat with, and open sessions of, an agent host
on another machine from the workspace that belongs to it.

## What it does

- Adds `chat.workspaceRemoteAgentHosts`, a restricted, window-scoped
setting listing the agent hosts an editor window connects to over
WebSocket while the workspace is open. A host is any server speaking the
agent host protocol, for example one started with `code-insiders agent
host --port 8081 --connection-token <secret>`:

  ```jsonc
  // .vscode/settings.json
  "chat.workspaceRemoteAgentHosts": [
{ "name": "Build machine", "address": "buildbox.example:8081",
"connectionToken": "<secret>" }
  ]
  ```

- Editor windows register the existing WebSocket connection factory
against this setting, *instead of* `chat.remoteAgentHosts`, which stays
the Agents window's list. The existing `chat.remoteAgentHostsEnabled`
and auto-connect settings still apply.
- The remote agent host chat contribution surfaces the hosts' agents,
models and session lists in editor Chat, reusing the session list store
and controller the cloud sandbox integration already uses. The host
chooses the working directory, since local workspace folders don't exist
there.
- Untitled remote agent host sessions can start as drafts, like local
agent host sessions, so a remote agent can be selected in editor Chat
before the first message.
- The session list cache (shared with cloud sandboxes) now refetches
when its connection reconnects, and editors follow chats that move to a
new session, as they already do for local agent host sessions.

The setting is ignored in untrusted workspaces. A trusted workspace can
already run arbitrary code, so connecting to a host it lists adds no new
capability. Connected hosts do receive your GitHub credentials, so only
list hosts you trust, and keep in mind that a `connectionToken` in
`.vscode/settings.json` is easy to commit.

This PR supports WebSocket hosts only. Dev tunnels, SSH and WSL could
later be added to the same setting through a `type` field; the
editor-window chat code here already works with any connection type.

## Demo


https://github.com/user-attachments/assets/3450a4cd-72f0-44dc-8b59-413cf6049cbb

Recorded in Code OSS built from this branch, with a workspace that lists
two agent hosts on other machines (`pc2` and `tablet`): their agents
appear in the session target picker, a new chat runs on `tablet`, and
the session list shows and opens sessions of both hosts.
## How to test

1. Run an agent host that accepts WebSocket connections (see above) and
add it to a workspace's `chat.workspaceRemoteAgentHosts`.
2. Open that workspace in an editor window. The host's sessions appear
in the Chat view's session list, and its agents and models can be picked
for a new chat.
3. Open an existing session of the host, and start a new one.
4. Remove the entry: the window disconnects from the host and its
sessions disappear.

## Validation

- `npm run typecheck-client`: passed.
- `scripts\test.bat --run
src/vs/workbench/contrib/chat/test/browser/agentSessions/agentHostChatContribution.test.ts
--run
src/vs/workbench/contrib/chat/test/browser/remoteAgentHost/remoteAgentHostChatContribution.test.ts`:
852 passing, including a new test that the session list refetches after
its connection reconnects.
- `scripts\test.bat --run
src/vs/platform/agentHost/test/electron-browser/remoteAgentHostService.test.ts
--run
src/vs/workbench/contrib/chat/test/browser/remoteAgentHost/remoteAgentHostChatContribution.test.ts`:
98 passing, including a new test that an editor window connects to
workspace-listed hosts, ignores user-level hosts, and disconnects when
the entry is removed.
- Used daily in Code OSS for three days with two remote agent hosts:
listing, opening and continuing sessions works.

## Known issues

- Rarely, listing a host session fails with "Conflicting backend
identities", after which sending silently does nothing. I couldn't
reproduce it recently; both hosts' full session lists (420 sessions)
contain no duplicate session IDs, so the conflicting registration comes
from another path.
- Remote untitled drafts don't show configuration controls (mode,
permissions and other session settings) yet: the provisional draft
session service only talks to the local agent host. Until a follow-up
makes it work for any connection, remote drafts use the host's defaults.
- Not specific to this PR: when a host connection drops and comes back,
an already open session tab stays read-only until it is reopened.
Show Reset Menu when action visibility differs from its defaults, including visible actions that are hidden by default. Keep Reset hidden when nothing has been customized, and cover the menu-state and toolbar behavior with regression tests.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Gate canvases on preview feature policy

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
* chat: open working set files in regular editors

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* make sure to scroll to first edit;'

* Fix working set editor test stub overload typing

Co-authored-by: justschen <54879025+justschen@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Agent Host changes for agents/fix-terminal-encoding-issue-909c3078
)

Remove the Settings registration, display label, and sandbox settings bridge. Add regression coverage for absent registration and ignored saved values while preserving the agent-host runtime configuration contract.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Fix empty cloud sandbox titles during preparation

Initialize the draft title before provisioning so session lists remain labeled while the cloud environment starts.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…s (fixes flake) (#343074)

* terminal: stop run_in_terminal sending Ctrl+U into PowerShell commands (fixes flake)

When shell integration is not ready in time, run_in_terminal falls back to the
`none` (or `basic`) execute strategy, which sends Ctrl+U to clear pending input
before the command. In PSReadLine's default Windows edit mode Ctrl+U is not
bound, so it is inserted into the command line and `cmd /c rem` runs as
`\x15cmd /c rem` ("The term 'cmd' is not recognized").

- Track pending input from data written to the terminal (`onDidInputData`)
  instead of the shell's output (`onData`), so a fresh terminal printing its
  prompt no longer counts as user input.
- Never send Ctrl+U to PowerShell.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* terminal: interrupt running commands without pending input, keep Ctrl+U for pwsh outside Windows

Review feedback on the run_in_terminal Ctrl+U fix:

- BasicExecuteStrategy only checked for a still-running command when the
  pending-input flag was set. That flag used to be set by any shell output,
  so a process that kept running after the idle fallback was interrupted
  before the next command; now that it only tracks input, the next command
  would be typed into that process. Check for a running command first,
  independently of the flag.
- PSReadLine's Emacs edit mode (the default on macOS and Linux) binds Ctrl+U
  to BackwardKillInput, so only skip Ctrl+U for PowerShell on Windows, where
  the default Windows edit mode inserts it into the command line.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Fix model selection during cloud sandbox preparation

Keep the temporary startup transcript in the draft's model pool and seed it with the selected model instead of a local default.

Fixes #344362

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: vs-code-engineering[bot] <vs-code-engineering[bot]@users.noreply.github.com>
…ariables setting (#344470)

Co-authored-by: vs-code-engineering[bot] <vs-code-engineering[bot]@users.noreply.github.com>
…333550) (#333563)

* fix: guard dynamic-height probe against shrunk model in ListView probeDynamicHeights (fixes #333550)

* fix: address review on listView.ts:1774 — re-check item count in probe loop

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: address review on listView.ts:1774 — condense probe-loop comment to one line

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: address review on listView.ts:1768 — shorten inline comment to one line

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: add regression test for reentrant shrink leaving later probe indices out of bounds

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: address review on listView.test.ts:476 — shrink two rows so index 2 stays pending during reentrant splice

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: address review on listView.test.ts:497 — condense inline comment to one line

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: address review on listView.test.ts:504 - keep later probe indices pending

Force the triggering render range to include all remaining items so the reentrant shrink occurs before the final probe iteration. Reuse the existing getRenderRange override pattern and remove ineffective second-row height changes.

Validation: TypeScript syntax and git diff --check passed. The focused browser test could not start because glob is missing; npm ci failed with DEPTH_ZERO_SELF_SIGNED_CERT.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: vs-code-engineering[bot] <122617954+vs-code-engineering[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(chat): keep system notifications out of user steering requests

Queued steering requests were joined into one request that counted as
user-sent whenever any part came from the user, so a background terminal
notification was shown as the user's own message. Only batch steering
requests that share an initiator, and ask the dispatched request to yield
when steering from the other initiator is still queued.

Fixes #344268

* fix(chat): apply yield requests that arrive before a participant starts

The extension host ignored yield requests for chat requests it had not
registered yet. A steering batch dispatched while other steering is still
queued asks to yield before the participant starts, so the queued user
message waited for the whole notification turn. Keep those yield requests
until $invokeAgent registers the request, and only re-arm the yield after
dispatching a steering batch so Send Now keeps its previous behavior.

* fix(chat): clear yield requests forwarded for requests that end

A yield request that reached the extension host before the request was
registered there stayed buffered when the request never reached the
extension host, for example after Stop during startup, or when the yield
arrived after the request had finished. Forward false when a request
that was asked to yield ends, and consume the buffered entry when the
extension host registers the request.
* sessions: keep cloud creation context for New Session

Let an existing-session backend provide its logical creation target and repository, while retaining availability checks and ordinary harness fallback behavior.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* sessions: preserve explicit source harness overrides

Only query provider-owned creation context when the original session resource is available.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* sessions: preserve Cloud creation targets in group actions

Resolve the provider-owned creation target for group New Session buttons and environment menu actions instead of reusing sandbox execution folders and backends. Preserve availability checks, workspace selection provenance, and focus.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…empts (#344439)

* agentHost: fail refused artifact merges instead of blocking later attempts

A pull request merge that GitHub refused (for example 405 "Base branch was modified") was recorded as an unknown outcome, so every later Merge request was blocked until reconciliation, which could never succeed while the pull request stayed open.

Code actions can now throw ArtifactActionRejectedError for a definitive refusal, which fails the run with a known outcome. GitHub 4xx responses to merge, merge queue and mark ready mutations use it. Reconciling an uncertain direct merge reports it as not executed when the pull request is still open at the same head and not queued.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* agentHost: keep uncertain merge outcomes uncertain during reconciliation

A merge or enqueue whose response was lost now reports its original ambiguous failure when the reconciliation read fails, so a refused read is not mistaken for a refused mutation. Only the mutation's own 4xx response is classified as a refusal, before authentication recovery rewraps it.

The merge action records whether it dispatches a direct merge or a merge queue entry before the mutation. Reconciliation rules out an effect only for a recorded direct merge; queue entries and older checkpoints stay uncertain.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…344512)

Agent Host changes for lszomoru/agents/investigate-hardened-entitlements-failure
…344517)

Agent Host changes for lszomoru/agents/azure-pipelines-pr-check-validation
…44527)

Agent Host changes for lszomoru/agents/investigate-github-action-failure
…4399)

Fixes #344300

In the experimental Markdown editor, Mermaid diagrams looked different
from the same diagram in the Markdown preview. They used Mermaid's
default purple theme, which is hard to read in dark themes (also
reported in #330433). Small
diagrams were stretched to the full column width, and
`markdown-mermaid.maxHeight` was ignored. The editor had its own Mermaid
renderer in `markdown-language-features`, separate from the preview's in
`mermaid-markdown-features`.

This PR moves the editor's Mermaid code block editor into
`mermaid-markdown-features`. It is contributed through
`markdown.codeBlockEditorProviders` (export API), so editor and preview
share one renderer, theme mapping, and set of settings.

Demo, recorded in Code OSS from this branch. Markdown editor on the
left, Markdown preview on the right:
- light, dark, and high-contrast themes
- a live edit
- `markdown-mermaid.maxHeight: "300px"` capping the initial height
- dragging the height grip past the cap


https://github.com/user-attachments/assets/5ba9589a-0932-4ba2-a331-16e01789f621

## What changes for users

- **Theme:** diagrams use the preview's VS Code theme mapping and render
again when the color theme changes.
- **Size:** diagrams render at their natural size, at most the column
width and centered, like in the preview. The embedded editor's frame
follows that height (`reportSize`) without scrollbars.
- **`markdown-mermaid.maxHeight`:**
- It still defaults to empty, meaning no cap, in both the preview and
the editor.
- When set to a pixel value, the editor uses it as `maxAutomaticHeight`:
it caps the initial height, and users can still drag the grip beyond it.
- Other CSS lengths, such as `80vh`, still apply in the preview but
leave the editor uncapped.
- **`markdown-mermaid.resizable`:** controls the editor's height grip.
- Setting changes apply to open Markdown editors right away.

## Changes

**mermaid-markdown-features**
- New `MermaidCodeBlockEditorProvider` (`src/markdownEditor/`). It
resolves the editor page with the current `markdown-mermaid` settings,
which are injected the same way as in the preview. It returns
`presentation: { resizable, fullWidth, fullView, maxAutomaticHeight }`
and fires `onDidChange` when settings change.
- New guest `preview-src/markdownEditor/index.ts`, built to
`markdown-editor-out/`. It connects via `WebEditorClient` and reuses the
preview's `loadExtensionConfig`, `VsCodeMermaidThemeTracker`, and render
helpers.
- The Markdown editor injects the theme as CSS variables plus
`color-scheme`, without VS Code's body classes. The guest derives
`vscode-dark`/`vscode-light` from `color-scheme` and re-renders when the
injected theme changes.
- It reports the height the diagram has at the frame's full width.
Measuring the rendered height instead let a scrollbar narrow the diagram
and then keep itself.
- New dependency `@vscode/web-editors`.
- `scripts/markdownEditor.browser.test.mts` replaces the old Mermaid
browser test. It hosts the guest with a real `WebEditorHost` and checks
rendering, natural size, theme switching, live edits, and error
recovery.

**markdown-language-features**
- Export-API code block editor providers can expose an optional
`onDidChange` event. When it fires, open Markdown editors resolve that
provider's blocks again.
- `maxAutomaticHeight` is accepted in the code block editor presentation
(contribution schema, descriptor validation, merge).
- The Markdown editor document now uses the theme's `color-scheme`.
Before, embedded frames had `color-scheme: dark` in dark themes while
the editor document was `normal`, so Chromium painted an opaque backdrop
behind every embedded editor. That showed as a dark box behind Mermaid
diagrams and other embedded editors.
- Removed the built-in Mermaid renderer
(`markdown-editor-src/mermaid/`), its build plugin and test, and the
`mermaid` dependency.
- Updated `@vscode/markdown-editor` from 0.0.2-136 to 0.0.2-147. This
brings the embedded editor chrome from
microsoft/vscode-packages#392 (hover outline,
toolbar, snapping grips, `maxAutomaticHeight`) and the presentation
protocol from microsoft/vscode-packages#396.

## Validation

- `npm run test-extension -- -l markdown-language-features`: 192
passing. This includes new tests for `maxAutomaticHeight` validation and
presentation merging.
- `node --test scripts/markdownEditor.browser.test.mts` in
`mermaid-markdown-features` passes.
- Typecheck of both extensions (including `tsconfig.markdownEditor.json`
and `preview-src`), ESLint, hygiene, and
`check-markdown-editor-package-json` all pass.
- Manual check in Code OSS with the published 0.0.2-147 package,
comparing the editor and preview side by side:
  - Light Modern, Dark Modern, and Default High Contrast.
  - Live theme switching.
  - Setting `maxHeight` while the editor is open.
  - Resizing past the cap.
  - Frame heights equal the diagram heights, with no stray scrollbars.

Pan and zoom in the editor, as toolbar actions, are a later step.
Avoid background Git checks and repeated checkout warnings for closed or merged PR artifacts. Clear cached workspaces and ignore late checkout results so reopening requires fresh verification.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Compare maxAutomaticHeight in codeBlockEditorPresentationEqual, so a
  contribution change that only changes the height cap reaches open editors.
- Update the presentation schema/merge test expectations for
  maxAutomaticHeight (the existing scripts/codeBlockEditorPresentation.test.mts
  failed after the field was added).
- Announce Mermaid rendering errors to screen readers again (role="alert").
- Reset the editor page's body margin, so the layout matches the height the
  guest reports even without the host's injected base styles.
- Document that contributed code block editors, including Mermaid, are not
  loaded in Restricted Mode.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* win32: fix installer context menu COM surrogate kill command

* Approve engineering system changes for #344505

---------

Co-authored-by: deepak1556 <hop2deep@gmail.com>
Replace the ubuntu-latest, macos-latest and windows-latest labels used by the chat-lib checks with the versions they currently resolve to (ubuntu-24.04, macos-26, windows-2025), so the checks don't move to a new OS image unexpectedly when GitHub migrates a -latest label.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Fixes #344532

Addresses the code review comments on
#344399, which moved the
Markdown editor's Mermaid block into `mermaid-markdown-features`.

- **Height cap changes reach open editors:**
`codeBlockEditorPresentationEqual` now compares `maxAutomaticHeight`.
Before, a contribution change that only changed the cap compared equal,
so the refresh was skipped. A new test checks that two contributions
differing only in their cap are not equal.
- **Fixed failing test:** `scripts/codeBlockEditorPresentation.test.mts`
now expects `maxAutomaticHeight` in merge results, and covers it in the
schema's accept and reject cases. It failed after #344399.
- **Errors are announced again:** Mermaid rendering errors (including
the startup fallback) get `role="alert"`, as with the previous guest.
The browser test locates the error by role again.
- **Margin reset:** the Mermaid editor page resets `body` margin and
padding itself, so its layout matches the reported height even without
the Markdown editor's injected base styles.
- **Restricted Mode stays as is:** contributed code block editors,
Mermaid included, are not loaded there, and Mermaid blocks show as code.
CONTRIBUTING now says so.

## Validation

- `npm run test-extension -- -l markdown-language-features`: 193
passing.
- `node --test scripts/codeBlockEditorPresentation.test.mts`
(markdown-language-features): 4/4 pass. On `main`, 2 failed.
- `node --test scripts/markdownEditor.browser.test.mts`
(mermaid-markdown-features) passes.
- Typecheck of both extensions, ESLint, and hygiene pass.
- Code OSS: a live syntax error renders as a `role="alert"` element, and
the page's body margin is 0.
… rebuilt (#344524)

* Build chat changes summary file lists lazily from a shared pool

Every agent turn's changes summary built its changed-file list eagerly,
even while collapsed, and each list came from a new single-use pool with
its own ResourceLabels. Every list therefore subscribed to about nine
global events (IModelService.onModelAdded, ILanguageService.onDidChange,
...). A long chat in the Chat view or the Agents window (hundreds of
turns) created hundreds of lists and thousands of global listeners, and
logged listener-leak warnings from ResourceLabels.registerListeners.

- Add ChangesSummaryFileListPool: one ResourceLabels shared by all
  lists, at most two idle lists kept, and each list released back to the
  pool when its summary is disposed.
- Build the list only when the disclosure is first expanded. A collapsed
  summary renders just its header.
- The chat list renderer owns one pool, clears it with its other pools,
  and passes it to both the agent turn changes summary
  (ChatTurnPillsContentPart) and the checkpoint file changes summary
  (ChatCheckpointFileChangesSummaryContentPart), which had the same
  eager per-turn list.
- The session working set keeps its own pool through
  renderChangesSummaryFileList.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Keep a chat turn's changes summary expanded when it is rebuilt

When a new turn arrives, the previous turn's changes summary is rebuilt
because it is no longer the last turn, and it came back collapsed. The
chat list renderer now keeps each turn's disclosure state, like the
request disclosures, and the rebuilt summary starts from it. An expanded
summary builds its file list right away instead of on the next toggle.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.