Skip to content

[pull] main from microsoft:main - #1664

Merged
pull[bot] merged 48 commits into
code:mainfrom
microsoft:main
Sep 3, 2026
Merged

[pull] main from microsoft:main#1664
pull[bot] merged 48 commits into
code:mainfrom
microsoft:main

Conversation

@pull

@pull pull Bot commented Sep 3, 2026

Copy link
Copy Markdown

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 : )

mrleemurray and others added 30 commits September 3, 2026 17:15
Match the session header's default and compact heights and separator gutter to the chat tab strip while preserving its content alignment.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use native headings for shared Sessions and Browser empty states while preserving their visual spacing. Exercise the production Browser renderer in the styling regression test.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use the contrast border for the single-chat header in high-contrast themes and cover it alongside the current header geometry.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* voice: preserve mode when creating agent sessions

Route voice-requested new sessions through the active host so the Agents window can create a provider-backed draft without disconnecting Voice Mode. Preserve the existing local Chat fallback and report host preparation failures honestly.\n\nFixes #334059\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* voice: send new agent session requests directly

Avoid racing the newly mounted composer after creating a provider-backed session. Create and send through the sessions service as one awaited operation, and report preparation failures without falling back to another session.

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

* voice: use the new-session send lifecycle

Send the first voice request through the draft-session API so the provider creates and graduates the session before routing subsequent requests.\n\nFixes #334059\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* voice: preserve active controls after session creation

Keep the segmented Voice Mode controls bound to a pinned session target when the new-session composer is replaced and focus is temporarily cleared.

Fixes #334059

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

* voice: harden new session preparation

Restore prior routing when host preparation fails, distinguish voice-initiated composer transitions from draft ownership, and prevent registered host failures from falling back to local Chat.

Fixes #334059

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

* voice: refresh controls when sessions materialize

Observe Chat widget view-model changes so Voice Mode controls recompute when a draft becomes the pinned provider session.

Fixes #334059

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

---------

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

The Agents Window sometimes showed an empty changeset for the last turn.
Agent Merge posts status notices ("Agent Merge is enabled for `x`") as
complete, hidden turns via `_writeAgentMergeNotice`. These never reach the
provider and never capture a checkpoint, but both last-turn resolvers took
`turns.at(-1)`, so the notice became "the last turn" and its empty changeset
replaced the real one. Because the notice's request row is hidden, the
transcript still ended on the user's turn, so the UI looked correct.

The same notice also displaced the session changeset's git fast path:
`_latestTurnIdAcrossChats` found no checkpoint for it and fell back to the
edit tracker, which cannot see terminal-tool edits.

Add `isHostNoticeTurn` / `lastAttributableTurnId` and use them in both
resolvers. Visible system notifications (background-agent completions, Agent
Merge repair prompts) are real turns and are deliberately not matched.

Also make empty per-turn changesets diagnosable: every path in
`_computeSingleFolderTurnDiffs` that can return an empty list now logs why,
and `showBlob` logs the real git failure instead of discarding it, so a
timeout or pruned ref no longer surfaces only as "git blob not found". Its
budget goes to 15s, since a timeout there drops a diff's original side.

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

sessions: align single-chat header with tab strip
fix: refine CSS selectors for chat agent merge components

Co-authored-by: mrleemurray <mrleemurray@users.noreply.github.com>
Do not reject a parent turn when restored subagent history is temporarily unavailable during duplicate turn-id validation. Keep the child resolver retryable and preserve strict validation for other peer-chat failures.\n\nAdd unit and whole-host E2E coverage for the recovery path, plus a gated test for the Copilot runtime custom-agent displayName contract mismatch.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep the fixed application menu viewport-positioned while centering the floating activity rail, and align its control geometry and states with neighboring activity targets. Add regression coverage for fixed overlays escaping the rail.

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

Copilot-Session: 2c456dcf-e2d8-4cbe-9678-c0c0f25e3ccb
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2c456dcf-e2d8-4cbe-9678-c0c0f25e3ccb
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2c456dcf-e2d8-4cbe-9678-c0c0f25e3ccb
…4311)

`errorResult('')` left `toolResultError` falsy, so `toolResultToProtocol`
serialized the call as `success: true` while the completed row still read
"Browser action failed". Both `new Error()` and `throw ''` reach it as an
empty string, from `playwrightInvoke` and two other call sites.

Fall back to the failure label for the error and the content part, as the
conversion above already does for `result.error`.

Also corrects the comment on `failedMessage`. These tools do not all declare
only an `invocationMessage`; the screenshot tool prepares a past-tense one,
and that prepared label is what survives when a result carries no
`toolResultMessage`.
* Add node paths to the region for telemetry purpose

* Address CCRs
…334322)

* feat(layout): add layout density options for modern UI

* layout: add icons for default and compact layout density options

---------

Co-authored-by: mrleemurray <mrleemurray@users.noreply.github.com>
Include the leading inset in the menubar's measured height, use the standard codicon size, and cover shared focus/open styles in normal and high-contrast themes.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ce266339-31ab-4cfb-a049-5b65fea0c7c8
* Agent Host changes for agents/editor-chat-panel-pills-enhancement

* chat: scope pill resize observer to host window

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

Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3

* chat: collapse status pills only on overflow

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

Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3

* chat: address pill review feedback

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

Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3

* chat: include subagent browsers in status pills

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

Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3

* chat: keep session input pills Agent Host-only

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

Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3

* agentHost: share session resolution policy

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

Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3

* chat: unify session input pills

Route Agents Window and Agent Host editor/panel pills through one shared controller and canonical source builder. Remove the obsolete SessionHeaderMeta pill implementation, preserve live GitHub state through shared presentation models, and stabilize dropdown, focus, compact-layout, and changeset lifecycles to avoid flicker.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3

* chat: fix session pill fixture services

Allow production chat widget fixtures to register feature-specific services, and reuse one session-pill service bundle for isolated and full-chat fixtures. This restores the strict Component Explorer renders without duplicating mocks.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3

* bring back rich pill hovers

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: BeniBenj <besimmonds@microsoft.com>
Copilot-Session: 44dd6d62-f5b5-4039-8c99-7cd70e43d9a3
…le-empty-state-headings

sessions: add accessible empty-state headings
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* test: stabilize empty Agent Host changesets

Wait for the expected empty changeset notification instead of accepting an earlier transient recompute. This prevents the conformance test from observing a file between its restore write and the final checkpoint-backed refresh.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* test: fence empty changeset refreshes

Subscribe to empty branch changesets only after the local turn completes. The resulting refresh is queued after stale setup recomputes, so the test observes a filesystem state that is causally after the restore.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…responsive-activity-bar-icon

workbench: Fix compact activity menu in Modern UI
* Run provider shutdown alongside auth replay

(Written by Copilot)

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

* Fix stale provider references after merge

(Written by Copilot)

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

* Finalize providers after auth replay

(Written by Copilot)

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

---------

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

Fix remote host empty state fixture width
make consolidated remote workspaces experimental

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Encode launched session titles for command safety

Pass the originating session title as URL-safe Base64 so chat-derived cmd metacharacters never cross the Windows launcher shell boundary as raw text. Decode the value only inside the native workbench environment.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* Terminate Node option parsing for session titles

Prevent dash-prefixed session titles from being interpreted as Node options by the launch-time Base64URL encoder.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
meganrogge and others added 18 commits September 3, 2026 19:34
Use consistent body text, base icon sizing, and tokenized spacing across new-session pills and their dropdowns. Fixes #333887.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Dispose the intentionally unloaded archived session directly after verifying persistence. This prevents generic cleanup from cold-restoring it under the five-second subscribe deadline.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…334338)

* agent host: stop chat queues from wedging on a non-settling SDK RPC

All chat operations for one chat serialize on a single per-chat sequencer. A control-plane RPC in that
queue had no timeout, so an RPC that never settled kept the queue head forever. Every later send,
model change, and abort stayed queued and never ran. The client showed a turn that stayed active with
no response and no error. Abort shared the same queue, so Cancel could not recover the chat.

- Bounds the short SDK control-plane RPCs at 30 seconds through a new `_awaitControlPlaneRpc` helper.
  This covers `session.setModel`, `rpc.agent.select`, `rpc.agent.deselect`, and `rpc.history.truncate`.
  A timeout now rejects the operation and lets the queue continue. Turn delivery through `session.send`
  stays unbounded, because a turn can correctly run for a long time.
- Removes abort from the per-chat queue. Abort must interrupt a blocked queue, so it cannot wait behind
  the task it must cancel.
- Adds an operation name to each `_queueChat` call and logs a warning if a queue task runs for more than
  60 seconds. The warning names the operation that holds the queue.
- Adds regression tests for the timeout, for a queued send that continues after a timeout, and for an
  abort that completes while a queue task is blocked.

Fixes #334159

(Commit message generated by Copilot)

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

* agent host: address review feedback on the chat queue wedge fix

Three follow-ups from review of the queue-wedge fix:

Taking abort off the chat queue meant an abort arriving while a chat was
still materializing found no target and silently succeeded, so a Cancel
during that window was lost and the queued send still dispatched. Aborts
with no live session now record a pending intent (only while work is
actually queued for that chat), and the send honours and clears it before
dispatching.

Timing out a control-plane RPC abandons the await but cannot cancel the
in-flight request, so the SDK's model/agent/history state may no longer
match what the session believes it applied. A timed-out session is now
marked for resync and the next send discards and resumes it, so a
late-settling request cannot mutate state a later operation depends on.

The stall warning wrapped the whole sendMessage task, including the
intentionally unbounded provider call, so any turn over 60s was reported
as a stalled queue. Tasks now cancel the warning when they reach a
legitimately unbounded phase, leaving it to cover only bounded setup and
control-plane work.

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

---------

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

* Agent Host changes for sbatten/agents/subagent-default-auto-setting

* Fix subagent Auto model selection

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

* Add subagent model selection telemetry

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

* Change subAgentInvocationId check to undefined

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

---------

Co-authored-by: bhavyaus <bhavyau@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* policy: disable custom terminal tool under managed settings

Force the Agent Host custom terminal tool setting off whenever any Copilot managed-settings channel is active, while preserving the user setting for ungoverned accounts. Export the policy catalog and cover the shared policy callback.

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

* policy: enforce terminal override for raw managed settings

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: remove redundant picker tab stop

Keep picker action wrappers out of the tab order and delegate toolbar focus to the first real control inside the picker. Add regression coverage for the wrapper and inner-control focus behavior.\n\nFixes #333924\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* agentHost: complete picker focus delegation

Restore the BaseActionViewItem setFocusable signature, clear focused descendants on blur, and exercise nested focus traversal in the regression test.

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

* test: update agent input screenshot hashes

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

* agentHost: keep async picker wrapper out of tab order

Keep the composite action wrapper non-focusable when its controls render after the toolbar initializes, and cover the delayed-render sequence.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: cf6761b4-5164-41c7-8123-5da286a9798a
* Initial plan

* Fix BAT comment spacing

Co-authored-by: aeschli <6461412+aeschli@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: aeschli <6461412+aeschli@users.noreply.github.com>
* sessions: Add no-workspace option to new session picker

Offer a workspace-less quick chat from the Agents Window workspace picker when consolidated remote workspaces are enabled, while preserving the existing picker presentation and safely cancelling pending workspace drafts.\n\nFixes #334345\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* sessions: Gate no-workspace option on quick chat support

Keep the option available for an existing workspace-less draft, but do not offer it when no provider can create quick chats.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* sessions: Fix no-workspace test on web

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

* sessions: Scope picker visibility to no-workspace choice

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chat: Select primary dictation cleanup models

Resolve the configured Luna and Nano cleanup choices directly through their Copilot model IDs instead of utility aliases. Log model selection and successful application so the cleanup path can be verified without recording transcript content.

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

* chat: Remove unavailable Nano cleanup option

Keep the experimental cleanup model setting limited to the available Luna primary model and the utility fallback.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add experimental tabbed model picker

Redesigns the chat model picker behind `chat.experimentalModelPicker`
(off by default) so the new and old designs can be compared side by side.

The separate model, context, and thinking effort pickers become one
surface: a tabbed list with a detail card that shows thinking effort,
context, and pricing that updates as those change. Destinations are
capped at two, built-in and user-provided, since almost no one has more
than one BYOK provider. Sections are Pinned, a short suggested list, and
the rest folded away.

Also adds a shared Switch widget and a segmented control, both reused by
the picker and the customizations UI, and support in the action list for
tab bar actions, icon-only tabs, footers, welcome bodies, and in-place
item updates.

Includes an unrelated fix for the DOM sanitizer, which now replaces its
Trusted Types policy when the realm that created it goes away.

* Fix some small issues with the new model picker

* Model picker

* Review feedback

* Fix Monaco editor build for the sanitizer policy replacement

The stale-policy replacement was cast to the global `TrustedTypePolicy`,
but dompurify's config types that property with the `TrustedTypePolicy`
imported from `trusted-types/lib/index.js`. The two normally unify, so the
regular build accepts it. The editor tree shaker compiles against a synthetic
root where `trusted-types` resolves through both a relative and an absolute
path, leaving two declarations whose private `brand` makes them nominally
incompatible, and `editor-distro` failed to compile.

Name the property's own type instead, so only one declaration is involved
however `trusted-types` resolves.

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

* Address feedback and fix tests

* Fix provider icons

* Fix ResizeObserver loop in the model picker chip

`_renderLabel` runs from a resize-driven autorun. Measuring the chip there
cleared `minWidth`, read `scrollWidth`, then wrote `minWidth` again, so every
ResizeObserver pass dirtied layout twice and never settled. The
NewSessionCompactAutoModel fixture failed to render with "ResizeObserver loop
completed with undelivered notifications".

Take the fixed widths from main instead, including the narrower floor for the
Auto label that #334128 added alongside that fixture. This resolves the merge
conflict in this hunk the other way; the measured floor read better in the
abstract, but it cannot be computed from inside the resize callback.

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

* Restore MCP server switch styling

The plugin list moved to the shared `Switch` widget and the hand-rolled
`.plugin-enable-switch` CSS was deleted with it, but the MCP server list still
built that markup by hand. With no rules left to match, its switches rendered
as bare unstyled buttons: the McpServersTab fixture lost the filled pill and
its thumb entirely.

Move the MCP list onto `Switch` too, so both lists share one control. This is
what the screenshot diff on this PR was reporting; accepting those hashes would
have pinned the unstyled rendering as the baseline.

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

---------

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

* Agent Host: stop the reconnecting banner nagging on a flapping transport

A tunnel relay that drops and restores the transport every few seconds made the
banner appear on a session that worked fine throughout. Two causes.

The outage start time lived in a cached derived. While the host is connected
nothing reads the reconnecting state, so that derived lost its observers while
its cache survived them; the next outage on the same session inherited the
previous outage's start time and showed the banner immediately. It is now an
explicit value maintained by an autorun, which runs whether or not anything is
rendering the reconnecting state.

The delay before the banner appears was also shorter than a routine self-healed
reconnect. Such a reconnect preserves session state and the user would not
otherwise notice it, so the threshold now outlasts one.

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

* Keep the outage-start derived alive instead of hand-maintaining it

recomputeInitiallyAndOnChange keeps the cached derived observed, so it
recomputes when the host reconnects rather than retaining a start time
nothing was left to invalidate. Restores the session keying and drops the
autorun that replaced it.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Initial implementation of the operation

* Fix condition to check session state and draft usage

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

* Refactor operation key and lane handling

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

---------

Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
@pull pull Bot locked and limited conversation to collaborators Sep 3, 2026
@pull pull Bot added the ⤵️ pull label Sep 3, 2026
@pull
pull Bot merged commit 68a1501 into code:main Sep 3, 2026
1 check 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.