Skip to content

[pull] main from microsoft:main#1177

Merged
pull[bot] merged 79 commits intocode:mainfrom
microsoft:main
Apr 23, 2026
Merged

[pull] main from microsoft:main#1177
pull[bot] merged 79 commits intocode:mainfrom
microsoft:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented Apr 23, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

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

mjbvz and others added 30 commits April 20, 2026 22:46
- Moves copilot eslint config into top level eslint config
- Adopts some standard rules
- Suppress a few new shared rules
Co-authored-by: Copilot <copilot@github.com>
These lint checks should already be handled by the full pr lint checks
- Unrelated: fix local agent host being broken on main following
  some overnight cleanups
- Register a JSON schema for agent session settings (only when they're
  open since it has a perf cost)
- When there are multiple custom approval buttons, show them in a
  dropdown similar to other tool calls.
In advance of host-level settings, replaces our ad-hoc setting handling
with a IAgentConfigurationService. This handles inheritance correctly.
We also have a 'schema builder' now that allows for better type safety
as we produce and consume schema.

- New `IAgentConfigurationService` with `getEffectiveValue`,
  `getEffectiveWorkingDirectory`, and `updateSessionConfig`. Owns the
  inheritance chain so every consumer composes layers identically.
- New schema builder (`schemaProperty<T>` / `createSchema`) with phantom
  TypeScript types + derived runtime validators. `assertValid` throws a
  `ProtocolError(InvalidParams)` annotated with the offending dotted
  path (e.g. `permissions.allow[2]`); `validate` is the boolean form;
  `values()` validates at write sites; `validateOrDefault()` sanitizes
  untrusted input at protocol boundaries.
- `platformSessionSchema` centralizes the `autoApprove` + `permissions`
  property descriptors that `copilotAgent.resolveSessionConfig`
  previously duplicated; agents compose via `...platformSessionSchema
  .definition`.
- `getEffectiveValue` validates each layer against a caller-supplied
  schema and falls through when a layer's value is malformed, logging
  the path-annotated reason.
- Wire DI through `AgentService` (local `InstantiationService` scope) so
  `AgentSideEffects` and `SessionPermissionManager` resolve `ILogService`
  and `IAgentConfigurationService` via DI rather than plain-class plumbing.
- `copilotAgent.resolveSessionConfig` collapses to a single schema
  construction + `validateOrDefault` call; duplicated schema literals
  removed.
- Tests: 33 new unit tests covering schema validation, path-annotated
  errors, `validateOrDefault`, and the full precedence chain in
  `AgentConfigurationService`
…oard accessibility and focus handling

Co-authored-by: Copilot <copilot@github.com>
… item handling

Co-authored-by: Copilot <copilot@github.com>
…ndling

Co-authored-by: Copilot <copilot@github.com>
…consistency

Co-authored-by: Copilot <copilot@github.com>
…r improved clarity and consistency

Co-authored-by: Copilot <copilot@github.com>
…ved tooltip handling

Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
…dget for cleaner implementation

Co-authored-by: Copilot <copilot@github.com>
…and correct localization key for the label

Co-authored-by: Copilot <copilot@github.com>
connor4312 and others added 27 commits April 23, 2026 18:56
…gin name (#312196)

When a plugin's skill name matches the plugin name, the canonical command
ID was producing a redundant format like `plugin-name:plugin-name`. This
change collapses that to just `plugin-name` so users can invoke
`/plugin-name` instead of `/plugin-name:plugin-name`.

- Adds a check in getCanonicalPluginCommandId to return just the prefix
  when it equals the normalized command name

(Commit message generated by Copilot)
The import was declared but never used in the file, causing a TS6133 compilation error.
Co-authored-by: Copilot <copilot@github.com>
…12197)

* fix(config): enable session controller by default in CLI settings

* eol
sessions: fix missing remote toggle for local agent host, duplicate permissions setting
* fix: prevent endless rAF loop in layout when widget is hidden

The layout methods in mcpListWidget, pluginListWidget, and
aiCustomizationListWidget would defer to requestAnimationFrame when
searchAndButtonContainer.offsetHeight was 0, assuming the browser
hadn't reflowed yet. When the widget is created while permanently
hidden (e.g. in component explorer or when the view isn't visible),
offsetHeight stays 0 forever, causing an infinite rAF loop.

Add a _layoutDeferred flag so the deferral happens at most once. If
offsetHeight is still 0 after the retry, proceed with zero heights
instead of  the next real layout call when the widgetlooping
becomes visible will compute correct dimensions.

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

* fix: keep layout retry guard across deferred layout

Keep _layoutDeferred set while the deferred layout call runs so
a second offsetHeight === 0 measurement cannot schedule another
requestAnimationFrame. This makes the retry truly one-shot in all
three AI customization list widgets.

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

---------

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

* sessions: improve connection stability and terminal reconnection

- WebSocketClientTransport: fail-fast on send to dead socket with
  force-close and _closeFired guard to prevent double onClose events
- AgentHostPty: add reconnect() method with 10s hydration timeout
  and buffer clear before snapshot replay
- AgentHostTerminalService: add reconnectTerminals() scoped by
  oldClientId, track active ptys with dispose cleanup
- RemoteAgentHostContribution: trigger terminal reconnection on
  clientId change during reconnect
- Telemetry: add socket/close, socket/sendDropped,
  socket/visibilityResumed, terminal/recovery events
- Fix isMeasurement on boolean fields in existing telemetry

* Update src/vs/sessions/common/sessionsTelemetry.ts

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

* address review: gate terminal reconnect on clientId change, add reconnect tests

---------

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

This is using the old search endpoint. We'll start switching over the new one once it's ready

Co-authored-by: Copilot <copilot@github.com>
Use main eslint config for copilot extension too
…2176)

* use CustomizationHarnessService to get and resolve slash command

* Update src/vs/workbench/contrib/chat/browser/widget/input/editor/chatInputEditorContrib.ts

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

* Update src/vs/workbench/contrib/chat/test/common/customizationHarnessService.test.ts

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

* Update src/vs/workbench/contrib/chat/common/customizationHarnessService.ts

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

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Improve hover rendering

* Fix comment
* Refactor browser creation flow, add ownership model

Co-authored-by: Copilot <copilot@github.com>

* Opening in background

Co-authored-by: Copilot <copilot@github.com>

* feedback

Co-authored-by: Copilot <copilot@github.com>

* simplify

Co-authored-by: Copilot <copilot@github.com>

* fix

Co-authored-by: Copilot <copilot@github.com>

---------

Co-authored-by: Copilot <copilot@github.com>
and make sure that git stuff is gated behind workspace trust.

Co-authored-by: Copilot <copilot@github.com>
* Get task buttons working for Claude

By hard coding it along with CLI...

* feedback
…312234)

* mcp: add .mcp.json workspace discovery and server collision handling

Adds support for discovering MCP servers from .mcp.json files at
workspace folder roots using the Claude-style format, and introduces
collision-aware enablement logic for servers with duplicate names.

- Adds WorkspaceDotMcpDiscovery to discover servers from .mcp.json
  files in workspace folder roots, with file watching and throttled
  updates.
- Adds McpCollisionEnablementModel that disables lower-priority
  servers when multiple servers share the same label, controlled by
  a new chat.mcp.collisionBehavior setting (disable or suffix).
- Promotes collection 'order' from presentation.order to a required
  top-level field on McpCollectionDefinition for clearer priority
  semantics.
- Adds ITransaction support to EnablementModel.setEnabled for
  atomic multi-server enablement changes.
- Adds an 'Enable Server' action in the server options quick pick
  and a 'Disabled' codelens for disabled servers in config files.
- Adds language features (codelens, diagnostics, inlay hints) for
  .mcp.json files.
- Adds comprehensive tests for the collision enablement model.

(Commit message generated by Copilot)

* address copilot review feedback

* restore suffix collision behavior option
…312219)

* sessions: fix spinner animation restart and respect reduced motion

Fix the session list spinner (loading icon) animation restarting on
every tree re-render. The tree calls renderElement on all visible rows
whenever the list is spliced, which clears elementDisposables and
recreates the icon autorun. The icon CSS selector tracking was stored in
a local variable that reset to undefined each time, causing the spinner
DOM to be rebuilt and the CSS animation to restart.

Move the icon selector tracking onto the template object so it persists
across renderSession calls for the same row. The spinner element now
stays alive and its animation continues smoothly.

Also add reduced motion support: when the user has reduced motion enabled
(via workbench.reduceMotion or system preference), show the static
session-in-progress codicon instead of the animated loading spinner. The
icon reactively updates when the preference changes.

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

* address PR feedback: hoist motion signal, fix stale icon color

- Hoist observableSignalFromEvent to a renderer-level field so it's
  shared across all rows instead of recreated on every renderSession.
- Always update iconSpan.style.color even when the selector hasn't
  changed, fixing stale color when the same codicon is used with
  different theme colors (e.g. circleFilled for both NeedsInput and
  unread states).

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@pull pull Bot locked and limited conversation to collaborators Apr 23, 2026
@pull pull Bot added the ⤵️ pull label Apr 23, 2026
@pull pull Bot merged commit f46e6eb into code:main Apr 23, 2026
1 of 3 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.