Commit Graph
1881 Commits
Author SHA1 Message Date
Rob LourensandGitHub 08fe2b7a97 build: harden validation script contracts (#328584)
* build: harden targeted validation scripts

Reject validation commands that would otherwise succeed without checking files, support multiple stylelint targets, and report validation scope and elapsed time. Document how to avoid redundant typechecking before compilation.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* build: count files entering hygiene checks

Track requested files only when they reach an actual hygiene checker, deduplicate across checker branches, and cover non-checkable assets.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-01 23:36:31 +00:00
Rob LourensandGitHub 9934512cd0 build: support targeted ESLint files (#328531)
* build: support targeted ESLint files

Use positional arguments as the lint targets while preserving the existing full-repository behavior when none are provided. This avoids expensive repository-wide traversal for targeted agent validation.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* build: reject unmatched ESLint targets

Fail targeted invocations when a supplied file or glob matches nothing while preserving the legacy full-lint behavior.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-08-01 00:50:39 +00:00
Justin ChenGitHubcopilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
91663e918c plan widget + commenting service (#328293)
* plan widget + commenting service

* address comments

* fix component fixtures and bug

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-08-01 00:00:05 +00:00
d5eb7d2ed5 chat: Enforce per-marketplace plugin auto-updates (#327844)
* chat: Enforce per-marketplace plugin auto-updates

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

* chat: Address plugin auto-update review feedback

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

* policy: Regenerate marketplace policy data

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-31 23:58:02 +00:00
Anthony KimandGitHub 0f9178ba63 build: exclude Copilot Computer Use from Agent Host packaging (#328497)
* Exclude computer use under new plugin directory

* build: drop stale Computer Use packaging paths

Computer Use now only ships under plugins/computer-use/**. Remove the
old prebuilds/* excludes and Win32 stamp globs that no longer match.
2026-07-31 15:30:29 -07:00
Josh SpicerandGitHub 8b81ebe51e fix https://github.com/microsoft/vscode-internalbacklog/issues/8650 (#328514) 2026-07-31 22:28:04 +00:00
30c696ae70 policy: keep exported policy data synchronized (#328490)
* policy: keep exported policy data synchronized

Export policy catalogs from both the Workbench and Agents window in isolated profiles, then merge them with explicit conflict validation. Restore the blocking integration check so policy source changes cannot drift from the generated catalog.

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

* policy: regenerate catalog after main merge

Regenerate the catalog with the canonical dual-entrypoint exporter after resolving the main merge. This restores ChatAllowManagedMcpServersOnly and keeps newly merged policies in generated order.

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

* policy: isolate export environment

Ignore portable and app-data overrides when launching policy export windows, and honor the configured temporary directory with compact paths that remain under macOS IPC limits.

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

* policy: sort exported catalog by key

Sort merged policy entries by configuration key before serialization so identical sources always produce the same catalog regardless of registration order.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-31 14:54:40 -07:00
Elijah KingandGitHub ae4238a330 Merge pull request #328484 from microsoft/eli/agents/dictation-voice-rim-uniformity
chat: paint the dictation mic glow with Voice Mode's listening color
2026-07-31 13:59:52 -07:00
Hawk TicehurstandGitHub 6696ff4969 Fix Agents window tab spacing with left-aligned actions (#328492) 2026-07-31 20:56:25 +00:00
Elijah KingandCopilot abf0f2a59c chat: give the dictation microphone the real Voice Mode rim
The previous commit only made dictation agree on colour. The treatment
was still the old one: a single inset box-shadow that brightens and dims
as a whole, so the microphone pulsed where the chat input breathes.

Mount the actual rim on the microphone instead. The rim's blob sizes are
absolute, so that they keep a constant physical softness across inputs of
different widths; on a 20px button a single blob would swamp the whole
element. Add `--vg-size`, which scales the blobs, the inner fade, the
bloom blur and the corner catches together, and derive it from the host's
height against the input box the sizes were authored for.

`createVoiceRimLight` mounts that for hosts that light one element rather
than cross-fading between voice states. The rim lives in its own
absolutely-positioned slot, so hosts that rebuild their button contents
don't tear it out, and it is mounted only while the microphone is open
rather than left on every idle mic in the workbench.

High contrast now needs no special casing here: the rim already collapses
`voice-glow-rim-cool` to a solid line. The old flat glow stays as a
fallback for hosts that mount without a theme service, suppressed
whenever the real rim is present so the two never stack.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-31 13:16:14 -07:00
Elijah KingandCopilot 42a4ea04f6 chat: paint the dictation mic glow with Voice Mode's listening color
The Voice Mode rim redesign left dictation behind. Dictation picked up
the shared accent token, so it agreed on hue, but it painted that accent
raw while the rim paints a tuned version of it: hue nudged off the
accent, saturation bounded, lightness pinned per theme. An open
microphone therefore looked different depending on which feature opened
it, and dictation didn't respond to the theme's lightness at all.

Move that tuning into voiceGlow.ts as `resolveVoiceRimAccent` and have
both features resolve through it. The controller keeps its behaviour and
loses its private copies of the constants; dictation publishes the
resolved color as `--dictation-mic-accent`, falling back to the raw token
for hosts that pass no theme service.

For #58A6FF on a dark theme that moves dictation from #58a6ff to
hsl(202 96% 56%), the exact color the listening rim paints.

Also aligns the high-contrast treatment: dictation drew its solid line in
contrastActiveBorder, while the rim uses charts-blue for listening.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-31 13:03:43 -07:00
7c840591be chat: redesign the Voice Mode ambient glow as a border + rim light (#328455)
* chat: redesign the Voice Mode ambient glow as a border + rim light

Voice Mode's ambient glow was a hardcoded blue/purple border plus box-shadow,
applied identically on every surface. It reads as a focus ring rather than as a
microphone being open, it can't follow the theme, and connected-idle voice mode
shows nothing at all — so there is no signal that voice is live between turns.

Replace it with a single ambient light that changes character per state:

- listening / speaking render an audio-reactive interior rim, cool while the
  user talks and warm while the agent talks, so who holds the floor is legible
  at a glance,
- processing renders a travelling border light, desaturated so it reads as a
  calm "thinking" loop that composes with the working comet rather than racing
  it,
- connected-idle renders a slow, near-white rim breath, so a live session is
  visible without shouting,
- error renders nothing, as before.

State changes cross-fade between two buffered slots, so listening -> speaking
dissolves cool -> warm instead of snapping. The breathing motion is driven from
the surface's existing animation frame rather than a dozen CSS animations, and
reduced motion pins a representative still frame.

Colors are derived from the theme accent: `chat.voiceGlowBaseColor` (defaulting
to `focusBorder`) is hue-shifted per state, and themes can pin any single state
through `chat.voiceListeningGlow` / `chat.voiceProcessingGlow` /
`chat.voiceSpeakingGlow`. Dictation's microphone glow now defaults to the same
base accent, and the voice pill, the waveform and the mic glyph all read the
resolved accent, so every voice affordance agrees and adapts to the theme.

Applied to the panel chat input, the Agents window chat inputs and the agents
voice widget. This is a purely visual change: the input keeps its full toolbar
(attachments, model picker, and the rest) while voice is active.

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

* chat: rework the Voice Mode thinking state and fix the glow covering the toolbar

Follow-ups from testing the glow in a live build:

**Thinking is a transition, not a pause.** It rendered as a desaturated gray ring
on the border, which read as dead air and collided with the in-flight "working"
comet that travels the same ring. It's now a faint light sweeping between the
listening and speaking hues — the state between the two now looks like the state
between the two — and it rotates strictly INSIDE the border, so the comet keeps
the ring to itself and the pair compose instead of racing.

Processing's accent is correspondingly redefined: rather than its own hue-shift
off the base, it's the midpoint of the listening and speaking hues. Themes can
still pin it through `chat.voiceProcessingGlow`, which now sets the middle of the
sweep. Because the sweep is a real color again, it needed no gray, so the
white-vs-gray question falls away.

**The glow no longer covers the input's own controls.** It paints above the
(opaque) transcript overlay, which also put it above the toolbar — and the send
button sits right in the band the rim's inner wash bleeds into, so it washed out.
The toolbars are lifted back on top; their background is transparent, so the glow
still reads through them.

**Loud peaks read denser.** The rim's response gains a super-linear term on top
of the linear one, and the bloom thickens with it, so quiet speech stays calm but
a loud moment genuinely blooms instead of the whole range sitting in a narrow
band.

**The cross-fade no longer scales.** Light dissolves; it doesn't zoom. Scaling the
layers pulled the eye to a size change that wasn't happening.

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

* chat: collapse Voice Mode's thinking state into the calm rim, opt high contrast out

Thinking and connected-idle both mean "voice is live, nobody is talking", so they
now render the same calm near-white rim instead of thinking having a treatment of
its own. That drops the rotating swirl added in the previous commit along with
everything that existed only to serve it: the second layer kind, the conic
gradient and its keyframe, the hue-blend helpers, and the `chat.voiceProcessingGlow`
token, which no longer had anything to color.

The rim is now keyed on a "mood" (cool / warm / calm) rather than on the voice
state, so moving between thinking and idle doesn't re-mount or cross-fade — they
are one state visually, and now one state mechanically. State classes still track
the real state, so surface CSS can still tell them apart.

High contrast opts out of the soft-light language entirely. A blurred,
semi-transparent gradient can't carry a guaranteed contrast ratio and reads as a
smudge, so the talking states collapse to a solid line — blue for the user,
purple for the agent — and the calm state renders nothing at all, since "live but
quiet" isn't worth spending contrast on. The rim's mood is published as a class
so the stylesheet can make that distinction, and the fixtures gained
high-contrast variants so it stays covered.

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

* chat: make the calm voice rim a thin band that follows the input's corners

The calm rim (thinking / connected-idle) inherited the talking states' treatment,
which didn't suit it. It reads brighter than they do — near-white on dark — so at
their width it looked heavier than the state it's meant to recede behind. And its
soft wash is masked with a pair of linear gradients, which can't follow a rounded
corner: the light sat visibly inside the corner instead of curving with it.

The calm rim now drops the wash and the corner catches and keeps a single thin
band, cut with the padding-box mask so it follows `border-radius` exactly, inset
inside the input's own border so the two don't double up. It also carries a
fraction of the talking states' opacity, since being the lightest of the three
means brightness alone won't make it recede.

The listening and speaking rims are untouched.

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

* chat: drop the hairline ring from the listening and speaking voice rims

A crisp colored line sitting immediately next to the input's own border reads as
a doubled, slightly-misaligned edge, and it competes with the soft light instead
of defining it. The talking states now hide the ring and let the wash and the
bloom carry the glow on their own.

The calm rim keeps the ring — it *is* its thin band.

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

* chat: render the Voice Mode glow only while someone is talking

Thinking and connected-idle no longer render anything. The glow now means
"someone is talking" rather than "voice is on", which is the distinction worth
spending a visual signal on — voice being connected is already carried by the
voice pill.

That removes the whole calm-rim treatment and everything that existed only to
serve it: its color and weight constants, the third rim mood and its CSS block,
the `isIdleGlowVoiceState` predicate, the synthetic `breathingIntensity` curve
(the two remaining states always have live audio to react to), and the
high-contrast rule that hid it. The animation loops go back to running only for
the talking states.

`chat.voiceProcessingGlow` went with it in an earlier commit; the remaining
tokens are the base accent plus the listening and speaking overrides.

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

* chat: strengthen the voice rim and trim incidental churn

Nudge the listening/speaking rim up so it reads a little more present:
base strength 0.86 -> 1.02, and let the audio level push it further via
audioGain 0.7 -> 0.8 / peakGain 0.85 -> 0.95.

Also drop diff noise now that the glow only covers the talking states —
the `isGlowingVoiceState` swaps in the agents widget are equivalent to
the inline checks they replaced, and two comments had drifted away from
what the code does. Reverting them keeps the PR to the parts that
actually change behaviour.

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

* chat: address review feedback on the Voice Mode glow

Let CSS own the glow's corner radius. The slot is a child of the box it
lights, so `border-radius: inherit` keeps the two in step — no
`getComputedStyle` on every mood change, and percentage radii now work
instead of being parsed as pixels. The per-child `clip-path` went with
it: the slot already sets `overflow: hidden`, so it was clipping twice.
Verified pixel-identical across all six fixtures bar ~22 subpixels of
corner anti-aliasing.

Honour reduced motion in the cross-fade. Pinning the layer variables
left the 600ms opacity transition running, so `workbench.reduceMotion`
still animated state changes and a fixture could be captured mid-fade.
Also carry the flag into `refreshTheme`, which re-mounts the layer.

Tear a layer down once it has faded out rather than only on `clear()`,
so an outgoing slot stops driving CSS variables, and drop the idle
branch from the agents widget's glow gate now that idle never lights.

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

* chat: credit the voice rim design inspiration

Also drop a stale mention of the processing glow from the
`chat.voiceGlowBaseColor` description, which no longer exists.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-31 19:56:07 +00:00
fc931f57ec chat: enforce managed customization lockdown (#327843)
* chat: enforce managed customization lockdown

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

* chat: address customization lockdown review feedback

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

* chat: align lockdown controls with boolean schema

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

* build: keep policy catalog changes focused

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

* chat: include instructions in plugin-only lockdown

Block standalone instruction and agent-instruction files when strict plugin-only customization is enforced, while preserving plugin instructions.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-31 18:55:23 +00:00
Hawk TicehurstandGitHub 82705b922d Modern UI tabs redesign and bug bash (#328111)
* Redesign modern UI tabs

* Address PR feedback

* Many more updates

* Tweaks and bug fixes

* More changes
2026-07-31 16:23:46 +00:00
Benjamin Christopher SimmondsandGitHub 1644afe6d5 Merge pull request #328219 from microsoft/benibenj/marginal-centipede
Support custom views inside the agents window workbench
2026-07-31 00:16:26 +02:00
31308e8dce bump github/copilot 1.0.76 + SDK 1.0.9-preview.0 (#328161)
* Try bump github/copilot 1.0.76 + SDK 1.0.9-preview.0

* Exclude Copilot mediaremote-adapter from product packaging

CLI 1.0.76 ships a nested macOS MediaRemote helper under
prebuilds/*/mediaremote-adapter that broke darwin universal merge.
Strip it from app/runtime packaging and built-in extension
materialization; voice media-pause detection degrades without it.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 255220ee-f851-47ce-a71d-45db46de336d

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 255220ee-f851-47ce-a71d-45db46de336d
2026-07-30 20:32:44 +00:00
PaulandGitHub 4f5ed4db9d Ensure independent Copilot packages for EH (#327842) 2026-07-30 10:07:50 -07:00
BeniBenj 18c7959c4e fixes 2026-07-30 18:33:49 +02:00
dde569a9f6 Speed up valid-layers-check by ~11x (#328087)
The check took ~257s and would sometimes run out of memory. Two separate
bottlenecks were responsible.

layersChecker.ts built a full in-process ts.Program (15s, 2GB) and then
asked the type checker for a symbol at every property access in the
program, ~2.5M identifiers. Each lookup materialized symbol and type
objects, pushing the heap past 3.6GB, and the alias/containment chain was
then walked per symbol.

It now runs on the TS7 native API that the repo already vendors for
build/lib/tsgo.ts:

- updateSnapshot replaces createProgram, so the program lives in the
  compiler rather than the V8 heap
- the disallowed types are resolved to symbols once up front, turning the
  per-reference check into a local id lookup
- symbol lookups are batched instead of issued one node at a time
- property accesses are prefiltered by member name, so only those that
  could name a member of a disallowed type are resolved at all

That brings it from 48.6s and 3.8GB peak to 11.7s and 0.8GB peak.

The six tsconfig.<layer>.json projects were type checked serially with
TS6, which accounted for the remaining ~208s. They move to the native
compiler and run in parallel in the new layersTypeCheck.ts, taking ~11s.
Concurrency is derived from free memory (the largest project peaks at
~3.5GB) so a memory-constrained machine falls back towards serial
execution rather than swapping.

Verified to report byte-identical violations, including line and column,
against a seeded set covering direct references, import aliases,
inherited members, nested member access and ipcMain.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-29 20:24:47 +00:00
5d5b8096fc Optimize layer checker memory use (#327953)
* build: optimize layer checker

(Written by Copilot)

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

* build: fix layer checker test lint

(Written by Copilot)

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

* build: address layer checker review feedback

(Written by Copilot)

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-29 18:58:32 +00:00
b89d0ac849 chat: bring the sticky prompt header to the regular window (#327889)
* chat: bring the sticky prompt header to the regular window

The prompt timeline's sticky header — the band that pins the prompt you
have scrolled past to the top of the transcript, with previous/next
navigation — only existed in the Agents window, because it lived in
vs/sessions and only that layer loaded it.

Move the feature to vs/workbench/contrib/chat and register it from
chat.shared.contribution, which both windows import, so the chat view and
chat editor get the same header from one implementation. The rail (ruler
and dock) stays Agents-window only: its layout and content reservation are
built for the centered session view, so it is now gated on
IWorkbenchEnvironmentService.isSessionsWindow.

Replace sessions.promptTimeline.stickyHeader with
chat.promptTimeline.stickyHeader, defaulting to on outside stable, and
migrate an existing opt-in over. Mount the header only on widgets that
render their input below the transcript (new IChatWidget.rendersInputOnTop),
which excludes quick chat and the new-session composer.

The band now composites the request-bubble tint over the widget's own list
background so it stays opaque over scrolling rows in either host, with the
Agents window's box model kept as an override. Also document the header in
the chat accessibility help, and stop scanning the whole transcript on every
scroll now that the header is on by default.

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

* chat: only describe the sticky prompt header where it is mounted

The accessibility help derived the sticky-header text from the setting alone,
with a 'not quick chat' proxy for the host check. The new-session composer
(agentSessionsWelcome) is a ChatAgentLocation.Chat widget with
renderInputOnTop, and AgentChatAccessibilityHelp's when clause does not
exclude it, so its help could announce a header and Previous/Next buttons
that are not there.

Export the contribution's own predicate as isStickyPromptHeaderShown and use
it for the help text, so the two cannot drift. Cover the predicate and the
help branch with tests.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-29 01:34:39 +00:00
Elijah KingandGitHub 249d798dcf voice: introduce Voice Mode with a first-run card above the chat input (#327853) 2026-07-28 15:41:06 -07:00
055d662ca6 chat: make the dictation mic glow an ambient inner rim light (#327713)
Refines the dictation mic glow added in #327684.

The glow currently spreads outward from the button as a focus-colored halo,
and steps through four discrete intensity levels driven directly by each
analyser frame. The stepping is visible as the level crosses a threshold, and
tracking the waveform frame-for-frame reads as a level meter rather than as a
microphone that is simply on.

Move the light inside the button and smooth its response:

- Light now gathers along the button's inner edge over a faint bloom, with the
  middle left clear so the glyph is never clouded.
- Replace the four level classes with a continuous `--dictation-mic-level`,
  eased asymmetrically (fast attack, slow release) so the glow swells into
  speech and drifts back out of it. The level is also shaped to lift quiet
  speech and clamp loud speech, keeping opacity in a narrow band.
- Add a `chat.dictationActiveMicGlow` theme color, defaulting to the blue Voice
  Mode's listening glow uses so the two features read as one family.
- Suppress the glow while the model is preparing, so it doesn't compete with
  the download ring, and wind it down while the final transcript lands rather
  than cutting out the moment recording stops.

The `setupDictationMicGlow` signature and its three call sites are unchanged,
as is the high-contrast outline fallback and the reduced-motion behavior (the
glow still shows, held at a steady level).

Refs microsoft/vscode-internalbacklog#8607

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-28 15:52:25 +00:00
432a7e8606 sessions: Fix dock rail dots, flyout placement and hover flicker (#327705)
* sessions: Fix dock rail dots, flyout placement and hover flicker

The dock variant of the prompt timeline had four issues:

- The resting dots never reflected scroll position. The rail already
  received the active prompt on every scroll, but only the flyout rows
  were styled; the dot for the current prompt now takes the accent.
- Dots were capped at the first 50 prompts, so in longer sessions the
  current prompt often had no dot at all. They are now evenly sampled
  across the session, so every dot maps to a real prompt.
- The flyout was placed on top of the dots, which forced the handle to
  fade out on reveal. It now opens to the right of the dots, so they
  stay visible and interactive while it is open.
- Approaching the handle from the left flickered: hover nudged it 1px
  out from under the pointer, the handle then went pointer-transparent
  while the panel slid right across it, and the collapse was instant.
  The nudge and the slide are gone and the collapse is debounced.

Hovering an individual dot now previews its prompt, highlighting the
row and scrolling it into view within the flyout.

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

* sessions: Address review feedback on the dock rail

- Reduced motion now keys off the workbench-managed .monaco-reduce-motion
  class instead of the prefers-reduced-motion media query. The query only
  reflects the OS preference, so it diverged from the effective
  workbench.reduceMotion setting in both directions when that setting was
  forced on or off. Converted every block in the file, not just the new
  one, so the stylesheet uses a single mechanism.

- Dropped the 150ms collapse debounce. It was masking a gap that placing
  the flyout at the handle's right edge had already closed, and it made
  collapse timing-dependent. The handle and flyout are now laid out flush
  via shared vars, so they are one contiguous hover region and a leave
  detected from relatedTarget is always a real leave.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-27 21:50:31 +00:00
Elijah KingandGitHub 1e53f489f9 Merge pull request #327703 from microsoft/eli/agents/dictation-voice-mode-updates
Dictation/Voice Mode: hover descriptions, pill sizing, compact glyphs
2026-07-27 14:40:28 -07:00
3825df523e build: prevent root-anchored :has() selectors (#327690)
* Avoid :has() selectors that trigger workbench-wide style invalidation

A :has() whose anchor exists in the live DOM makes Blink re-evaluate it on
DOM mutations anywhere in the document - including the inline style writes
the editor performs on every layout. With a populated chat working set,
every forced style recalc traversed the whole visible workbench (~218ms
per Recalculate Style in a large workspace; sash drag nearly frozen).
Same issue class as #324985.

Per-rule profiling showed the chat editing session scrollbar rule alone
accounted for 77% of the per-recalc cost; the root-anchored rules in
floatingPanels.css and sessionsPolicyBlocked.css are the same hazard.

- chat.css: key the scrollbar padding off an 'overflowing' class toggled
  in chatInputPart.ts, which already computes the condition. The padding
  now applies whenever the list overflows instead of only while the
  auto-hide scrollbar is faded in.
- floatingPanels.css: use 'activitybar-compact' (mirrored by
  activitybarPart.ts) and 'noactivitybar' (toggled by layout.ts like the
  other part visibility classes).
- sessionsPolicyBlocked.css: toggle a class for the overlay's lifetime.
- build/stylelint.ts: error on root-anchored :has() (body/html/:root/
  .monaco-workbench), with a has-anchor-checker disable escape.

* Match root-anchored :has() as complete tokens at any compound position

Addresses Copilot review feedback: the previous regex missed root tokens
that are not first in the compound (.style-override.monaco-workbench:has())
and matched incomplete tokens (.monaco-workbench-test, bodyguard). Extracted
into build/lib/stylelint/validateHasSelectors.ts with focused tests.

* Use layoutService.mainContainer for the policy-blocked root class

Review feedback: inject IWorkbenchLayoutService instead of walking the DOM
with container.closest(). The caller already passes mainContainer as the
overlay container. Stub the layout service in the component fixture.

* small tweaks

* Drop build/ changes; lint rule moves to a separate PR

* build: prevent root-anchored :has() selectors

Add a stylelint check for root-level :has() selectors that cause workbench-wide style invalidation, together with focused parser tests. This is split from #327052 and should merge after it.

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

---------

Co-authored-by: zmr233 <zmr_233@outlook.com>
Co-authored-by: zmr-233 <132034425+zmr-233@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-27 21:22:58 +00:00
Elijah KingandCopilot 24869752ae Dictation/Voice Mode: hover descriptions, pill sizing, compact glyphs
Three related polish fixes to the dictation and Voice Mode entry points in
the chat input.

Hover descriptions (microsoft/vscode-internalbacklog#8600). It wasn't clear
that dictation and Voice Mode are unrelated features, or that only dictation
honors `dictation.model`. Both affordances now show a bold title plus one
concise sentence, with the dictation copy naming the configured model
(on-device Nemotron vs. MAI cloud). Descriptions live in `getHoverContents()`
only, so `aria-label` stays the short title plus keybinding.

Control tier. The segmented voice pill was 24px tall with an 8px radius while
the send button beside it is 22px with the control radius, so the two
disagreed. The pill is now 22px and fully rounded, and the standalone
dictation / Voice Mode buttons get the same 22x22 control surface as Send.
The housing radius is exposed as a tunable custom property on the generic
segmented-icon-toggle chrome rather than hardcoding voice-specific values
into shared code.

Icon ramp. The mic / Voice Mode glyphs rendered at the base 16px codicon size
while the neighbouring agent and model pickers use the compact 12px token.
Every dictation and Voice Mode glyph is now compact, using the `*Compact`
variants where they exist (`voiceMode`, `personVoice`, `personVoiceFilled`,
`loading`, `debugDisconnect`); `mic` and `micFilled` have no compact variant
and keep the regular glyph at the compact size. The waveform bars drop from
1.5px to 1px to match the codicon stroke weight, and the download ring
shrinks from 22px to 16px to hug the smaller glyph.

Two related fixes fell out of this:

- The listening/speaking glow forced `border-radius: 50%`, so the standalone
  Voice Mode button morphed from a rounded square into a circle mid-session.
  It now keeps its resting shape; only color and the pulse change between
  states.
- The send button lost its corner radius while disabled, because the radius
  was declared inside a `:not(.disabled)` rule. Moved so the shape is
  state-independent and only the filled background is conditional.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-27 13:45:12 -07:00
Megan RoggeGitHubcopilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>meganrogge
6201f0a052 Make dictation enterprise managed (#327340)
* Make dictation enterprise managed

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

Copilot-Session: 18f58fa9-d1dc-472f-8b3c-a59f64d8ba2a

* Add DictationEnabled to policyData.jsonc

Co-authored-by: meganrogge <29464607+meganrogge@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: meganrogge <29464607+meganrogge@users.noreply.github.com>
Copilot-Session: 18f58fa9-d1dc-472f-8b3c-a59f64d8ba2a
2026-07-24 19:40:22 +00:00
Connor PeetandCopilot 885d08ef56 sessions: register side chat translations
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-24 10:51:58 -07:00
Josh SpicerandGitHub 95307914be Improve managed settings policy diagnostics (#327332)
* Improve managed settings diagnostics

* Fix local managed settings diagnostics routing
2026-07-24 10:44:12 -07:00
Giuseppe CianciandGitHub 687caa0a3a agentHost: support OpenAI subscriptions in Codex (#327290)
* Codex: support OpenAI subscription account switching

Add shared account selection UI and agent-host protocol support for switching Codex between GitHub Copilot and OpenAI authentication. Restart connections safely on source changes, preserve account state across views, and override persisted model providers when resuming sessions after a switch.

* Codex: harden subscription account switching

Reuse existing ChatGPT credentials before starting OAuth, preload optional Copilot auth for source changes, and serve the Codex model catalog probe through the CAPI proxy. Add regression coverage for account activation, protected resources, and proxy startup.

* Codex: add harness settings editor

Add shared Codex account and global configuration management, and expose account, personality, auto-review, and config controls through a modal editor in both Agents and editor windows.

* Codex: move harness settings into customizations

Expose account selection, personality, auto-review policy, and config access through a shared Codex Settings section in Agent Customizations for both editor and Agents windows.

* Codex: wait for account login cancellation

Keep the account controls disabled until the App Server has cancelled login and refreshed account state, then allow another sign-in attempt.

* drop auth and sign in flow, only wire up through agent host setting, make customization settings widget more generic

* Reuse Agent Host root config for harness settings

Remove the custom account and global configuration protocol extensions. Publish provider-backed Codex settings through RootState.config and namespaced root metadata, route edits through root/configChanged, keep config.toml values out of agent-host persistence, and reuse the shared settings widget for local and remote hosts.

* Codex: reset threads when switching providers

Refresh provider-backed configuration after authentication becomes available and preserve those values during root config replacement. Recreate Codex threads when moving between Copilot and OpenAI because persisted rollout content is provider-bound.

* Codex: remove unrelated test changes

* Codex: address settings integration review feedback

Seed Codex provider configuration before the initial root snapshot, move the shared settings widget into the workbench layer, and harden provider switching and configuration writes against races and connection loss.

* Codex: initialize contributed sections in editor test

* Codex: update exported policy description
2026-07-24 16:39:06 +00:00
Elijah KingandGitHub 050e15b1f4 chat: segmented voice/dictation toggle with hold-to-talk and listen-button styles (#327072) 2026-07-23 16:01:14 -07:00
07745f1d76 Style overrides: Consolidate CSS selectors and unify surface color tokens (#326948)
* perf: consolidate style-override CSS selectors

Merge the duplicate .tab.sticky-compact geometry blocks in tabs.css and collapse the focus selector lists in keyboardFocusOnly.css with :is() (specificity preserved) to reduce the number of matched selector entries.

* style: update surface color tokens and unify font weights across components

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

---------

Co-authored-by: mrleemurray <mrleemurray@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
2026-07-22 15:26:28 +00:00
Martin AeschlimannandGitHub 3fa380ff09 Revert 326678 and 326718 (#326769)
* Revert "Chat dictation: always use Nemotron model, remove model setting (#326718)"

This reverts commit 6d02468e2c.

* Revert "Dictation: migrate on-device runtime to Foundry Local streaming ASR (#326678)"

This reverts commit 6b3ff3c7f0.
2026-07-21 08:52:50 +00:00
648d169d92 Bump github/copilot 1.0.72 (#326704)
* Bump github/copilot 1.0.72

* need to exclude webview

* Try skipping notification/tools/list_changed

* Capture tool list changes in agent host e2e snapshot

* Filter machine-dependent tools/list_changed notification from AHP snapshots

* Add glob patterns for Copilot Win32 built-in plugins in gulpfile tasks

* Update glob patterns for Copilot Win32 built-in plugins in gulpfile tasks

---------

Co-authored-by: Don Jayamanne <don.jayamanne@outlook.com>
2026-07-21 17:36:26 +10:00
Megan RoggeandGitHub 6b3ff3c7f0 Dictation: migrate on-device runtime to Foundry Local streaming ASR (#326678) 2026-07-20 18:29:05 +00:00
03c4db773e Check Agent Host dynamic dependencies (#326084)
Include statically named dynamic imports in the remote Agent Host dependency graph while excluding exact dev-only and test-only imports.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-18 23:38:51 +00:00
277c4d29e6 sessions: align floating panel sashes (#326407)
* sessions: align floating panel sashes

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

* sessions: explain floating sash styling

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-18 02:19:29 +00:00
Vijay UpadyaandGitHub e1b183798f Add enterprise allowedMcpServers / deniedMcpServers governance policies for MCP servers (#326226)
* Add enterprise allowedMcpServers / deniedMcpServers governance policies for MCP servers

* Feedback updates

* add tests
2026-07-17 02:48:18 +00:00
789a0c793d Add open/close animations to standard button menus + fix menu positioning (#326050)
* Agent Host changes for agents/sidebar-menu-motion-implementation

* Address PR feedback

* Fix some stuff

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-16 14:46:49 -04:00
b7d0a0bb1c Fix remote Agent Host dependency packaging (#326019)
* Fix remote Agent Host dependencies

Include fs-copyfile in REH packages and verify that startup imports are declared in the remote manifest.

(Written by Copilot)

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

* Smoke test packaged remote Agent Host

Launch the packaged Agent Host with its bundled Node after native REH builds and require it to bind a WebSocket listener.

(Written by Copilot)

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-15 23:08:06 +00:00
Christof MartiandGitHub ca2e4407da Use @vscode/os-proxy-resolver for additional info (#325916) 2026-07-15 21:42:31 +00:00
a077843f88 Add focus outline color to suggest widget for improved accessibility (#326005)
Co-authored-by: mrleemurray <mrleemurray@users.noreply.github.com>
Co-authored-by: Copilot <copilot@github.com>
2026-07-15 17:15:03 +00:00
Zhichao Li dbc333bef4 Regenerate policy data with otel referencedSettings 2026-07-14 15:21:11 -07:00
Dirk BäumerandGitHub 7e4e91cab4 Adapt to TypeScript 7 (#325757)
* Adapt TypeScript 7

* Ensure that we always call TS7 from spawnTsgo

* Fix package lock file

* tsc - tsc6

* More tsc -> tsc6

* More TSGO conversion

* More moves from tsgo -> tsc

* Fix tsgo resolving in extension folder

* Call TS7 compiler directly

* Update package-lock.json

* Remove tsc:version again
2026-07-14 12:34:04 +02:00
4e6997ae07 build: support platform-specific built-in extensions from GitHub releases (#324206)
* Support platform-specific built-in extensions from GitHub releases

Adds support for downloading platform-specific built-in extension VSIXs
from GitHub releases, keyed by marketplace target platform. Also downloads
the latest pre-release assets for insiders builds, ignoring the pinned
version and checksum.

- extensionTarget.ts: resolve build target + release asset name
- builtInExtensions.ts: platformSpecific checksum map + insiders detection
- extensions.ts/fetch.ts: fromGithub asset selection + prerelease support
- CI: platform-aware cache key and target env plumbing

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

* Insiders downloads the latest release instead of latest pre-release

Insiders builds should always be on the newest published release, so the
GitHub download now resolves the most recently published release (including
pre-releases) rather than filtering to pre-releases only.

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

* Address code review feedback for platform-specific extensions

- Sort latest releases by published_at instead of created_at
- Log a warning when skipping checksum validation in latest mode
- Document that platform-specific extensions always download from GitHub
- Skip gracefully on unsupported platforms; keep a clear error for a
  known target missing from the platformSpecific map

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

* Address CCR feedback: restrict targets and harden helpers

- Restrict getExtensionTarget to the supported marketplace targets, returning
  undefined for unsupported OS/arch (e.g. win32-ia32, linux-riscv64) so callers
  skip gracefully instead of failing with a missing-asset error
- Remove the bogus ia32 -> x86 mapping (no win32-x86 target exists)
- Validate the target format in getPlatformSpecificAssetName and throw a clear
  error for malformed targets
- Guard the latest-release sort against NaN timestamps (missing published_at
  sorts to the end deterministically)
- Update tests accordingly

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

* Align asset naming with VS Code convention and support product.overrides.json

The platform-specific extension this feature targets (typescript-go's
TypeScriptTeam.native-preview) publishes VSIX assets named
<name>-<target>.vsix using the raw marketplace target platform, not the
node-vsce-sign osx/win/arm aliasing. Update getPlatformSpecificAssetName to
the standard <name>-<target>.vsix convention and validate against the
supported target set.

- fetch.ts: in latest mode, select the newest published release that actually
  contains the requested asset, so releases shipping only other artifacts
  (e.g. tarballs) without a matching VSIX are skipped
- builtInExtensions.ts: merge product.overrides.json (gitignored, local) so
  overridden built-in extensions are downloaded, mirroring bootstrap-meta
- Update tests for the new naming convention

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

* Detect extensions project by path segment, not substring

ESBuildTranspiler decided CJS vs ESM output via configFilePath.includes('extensions').
When the repo is checked out (e.g. as a git worktree) into a folder whose name
merely contains the substring 'extensions', the 'src' project was wrongly treated
as an extension and transpiled to CJS, breaking top-level await in src/cli.ts,
src/server-cli.ts and src/server-main.ts. Match an 'extensions' path segment instead.

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

* Remove product.overrides.json support from built-in extensions download

Revert the download script to read product.json directly, per review feedback.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-14 10:26:58 +00:00
Megan RoggeandGitHub 6ba8d81120 Bring voice mode to the Agents (Sessions) window (#325138) 2026-07-09 21:56:22 +00:00
078671da10 Prompt timeline: reduce scroll jitter and polish the rail (selection, spacing, performance) (#325041)
* Prompt timeline: reduce ruler scroll jitter with adaptive height estimate

The ruler positioned marks from the chat list's height model, where every
un-rendered row is guessed at a flat 200px default. Real turns vary widely
(short prompts, tall/variable responses), so as rows render and get measured
the list's tops snap around and the marks visibly drift while scrolling a
fresh session.

Compute the marks' positions from our own per-item height model instead:
measured rows use their real currentRenderedHeight; un-measured rows use a
running average of measured heights of the same kind (prompt vs response,
seeded with priors). Marks land near their final position immediately and
barely move, converging exactly with the list once every row is measured.

Keep the viewport thumb in the list's own scrollTop/scrollHeight space so it
stays aligned with the native scrollbar (the marks' estimated space would
separate from it while heights settle and look like a second scrollbar). Add
a short 'glide' transition, enabled one frame after each structural rebuild,
so any residual drift animates smoothly without new marks sliding in from the
top; disabled under prefers-reduced-motion.

Also improve the keyboard focus indicator: grow the focused mark to a rounded
pill hugged by the focus ring instead of a bare outline on the 2px bar.

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

* Prompt timeline: polish rail selection, spacing, and scroll performance

Builds on the scroll-jitter work with a round of UX and performance fixes:

- Selection: replace the glowy box-shadow/backing-lane with a crisp border on
  the pill, and give keyboard focus a distinct dashed ring so a focused mark is
  never mistaken for a second selection. There is only ever one selected mark
  (it follows the viewport and click-reveal).
- No !important: the workbench outlines any focused [tabindex=0] button, which
  boxed the mark; suppress it by qualifying our rule through the marks container
  to win on specificity instead.
- Scrollbar: reserve a gutter (derived from the real scrollbar width) so the
  marks sit left of the native scrollbar and it stays grabbable.
- Spacing: reserve room on the transcript's right edge so message content keeps
  a guaranteed minimum gap from the marks, derived from the rail width via CSS
  variables rather than a magic number.
- De-cluster marks: prompts that sit close in content space could let the 24px
  hit targets overlap; space adjacent mark centres apart (new pure
  promptTimelineLayout.ts, unit-tested).
- Performance: the rail relayout read clientHeight on every scroll event (a
  forced reflow -> ~19% of active CPU while scrolling). Cache the height
  (refreshed only on resize) and coalesce scroll relayouts to one per animation
  frame; a re-profile shows relayout self-time drop from ~968ms to ~2ms.

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

* Prompt timeline: define the scrollbar gutter in CSS instead of JS

Review feedback: the gutter was set from JS (DEFAULT_SCROLLBAR_SIZE + gap), but the
list scrollbar is a stable 10px and the rail's other geometry already lives as CSS
variables on .prompt-timeline-host. Move it there as --prompt-timeline-scrollbar-gutter
and drop the runtime setProperty, the constant, and the base import. Not related to the
focus-outline specificity fix.

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

* Prompt timeline: simplify spaceMarkCenters even-distribution branch

Review feedback: the even-distribution branch is only reached when
(n - 1) * minGap > hi - lo, and hi > lo is already guaranteed, so n >= 2 there.
The n === 1 guards were dead code; remove them. Single-mark inputs go through the
forward/backward clamp pass, which the unit tests still cover.

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

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-08 23:09:12 +00:00
RoboandGitHub 913d5cccc1 feat: restore asar for node_modules (#324897) 2026-07-08 13:10:17 +00:00
RoboandGitHub 926982696e Revert "feat: restore asar for node_modules" (#324875)
* Revert "fix: builtin resolution of electron modules via asar hook (#324861)"

This reverts commit 5928613aa1.

* Revert "fix: restrict asar esm hook resolution to app resources (#324851)"

This reverts commit 89bc3825bd.

* Revert "feat: restore asar for node_modules (#324084)"

This reverts commit c9dda3b36a.
2026-07-08 07:16:29 +00:00