voice: unify connected animation and clarify GPT Live usage #343315

Merged
meganrogge opened 2:28pm on October 21, 2026 wanted to merge 1199 Δ into microsoft/vscode main from
agents/voice-mode-unified-animation-state

Pull Request Overview

  • Opened on October 21, 2026
  • Status Merged
  • Commit count 5 with first commit October 21, 2026

Total Delta

1199 Total Diff Delta

Open Days

Open 9 weekdays

Test Delta

469 Diff Delta in Test Files
Breakdown by Phase

How long has this pull request spent in each phase of its lifecycle?

Fraction of total time Business days Phase
N/A -0.0 days Issue creation to work beginning
 
0.0 days Authoring 1 commit before pull request opened for review
 
0.0 days Awaiting first review
 
0.2 days Revising work with 4 commits in response to 2 reviews that left 4 comments
 
9.0 days Merge to deploy (still awaiting deployment)

Total time for pull request 0.2 business days from first commit authored to merge
Still awaiting deployment

Author avatar

voice: unify connected animation and clarify GPT Live usage

Fixes #343323

Summary

Use one blue listening animation whenever Voice Mode is connected, rather than changing or hiding the animation between listening, speaking, idle, and processing. This shared behavior applies to both hosted voice and GPT Live.


  • Keep the connected glow across chat inputs and the floating voice widget, including while muted. Preserve ownership gating, audio reactivity, theming, high contrast, and reduced motion.

  • Remove the remaining purple speaking accents, the listening placeholder, and barge-in placeholder hints. Preserve transcripts, mute/manual-talk hints, and interruption behavior.

  • Show the GPT Live/OpenAI model notice only on the first successful GPT Live connection, persisted per profile across reconnects and restarts. Cancelled startup does not consume the notice.

  • Identify OpenAI GPT Live in both segmented and standalone Voice Mode hovers based on the active connection, not just configuration.

  • Consolidate glow fixtures and add regression coverage, including legacy-class cleanup and explicit DOM synchronization in decoration tests.

Validation



  • npm run compile-client — passed, zero compilation errors for the GPT Live changes.


  • npm run build-fast -- --client-only — passed after all follow-up changes.


  • ./scripts/test.sh --reporter dot --run src/vs/workbench/contrib/chat/test/browser/micButtonHovers.test.ts --run src/vs/workbench/contrib/chat/test/browser/voiceClient/voiceSessionController.test.ts --run src/vs/workbench/contrib/chat/test/browser/voiceInputMode.test.ts --run src/vs/workbench/contrib/chat/test/browser/voiceClient/voiceGlow.test.ts --run src/vs/workbench/contrib/chat/test/browser/voiceClient/voiceInputDecorations.test.ts — passed, 204 tests.


  • git diff --name-only -z | xargs -0 node build/hygiene.ts — passed for all 10 files in the latest follow-up, including lint and formatting checks.


  • npm run stylelint -- src/vs/workbench/contrib/chat/browser/voiceInputMode/media/voiceInputMode.css src/vs/workbench/contrib/chat/browser/voiceClient/media/voiceGlow.css — passed for the speaking-color changes.


  • git diff --cached --check — passed before both latest commits.

  • Earlier validation: 26 targeted glow/decorations/onboarding tests passed. Connected-glow fixtures were inspected in Dark, Light, and DarkHighContrast; render/dispose checks passed for all three fixtures. Rendered voice control colors matched across connected idle, listening, and speaking states in Code OSS.

Manual testing


  1. Connect Voice Mode and verify the blue animation remains visible while idle, listening, processing, playing speech, and muted; it clears on disconnect.

  2. Verify no listening or barge-in placeholder appears. Confirm transcripts and mute/manual-talk hints still work and interruption is unaffected.

  3. Switch sessions and check that only the voice-owning input glows. Check reduced-motion and high-contrast behavior.

  4. Connect GPT Live for the first time: one OpenAI model information notice should appear after session initialization. Disconnect/reconnect and restart: it should not repeat. Cancel a first connection before session initialization: the next successful connection should still show the notice.

  5. While using GPT Live, hover Voice Mode and verify the description names OpenAI GPT Live. With hosted voice, verify the generic real-time voice description remains.

Live voice-provider conversation end-to-end testing was not performed.

<!-- ⚠️⚠️ Do Not Delete This! feature_request_template ⚠️⚠️ --> <!-- Please read our Rules of Conduct: https://opensource.microsoft.com/codeofconduct/ --> <!-- Please search existing issues to avoid creating duplicates. -->

<!-- Describe the feature you would like. --> Voice Mode should have a consistent connected appearance, without switching visual states between listening and speaking or showing repetitive placeholder hints. GPT Live usage should remain discoverable without showing a notification on every connection.

Requested Changes

  • [ ] Always show the blue listening animation while Voice Mode is connected, including idle, processing, speaking, and muted states; clear it on disconnect and preserve ownership gating, audio reactivity, theming, high contrast, and reduced-motion support.
  • [ ] Remove the purple speaking accent from voice controls and the floating voice widget so connected voice indicators stay blue.
  • [ ] Remove the “Listening...” placeholder while preserving transcripts and useful mute/manual-talk hints.
  • [ ] Remove barge-in placeholder hints and interruption wording from manual-talk hints, without changing interruption behavior.
  • [ ] Show the GPT Live/OpenAI provider information notification only on the first successful GPT Live connection, remembering it across reconnects and restarts for the profile. Failed or cancelled startup must not consume the notice.
  • [ ] Identify OpenAI GPT Live in the Voice Mode hover when the current connection uses it, across both segmented and standalone voice controls; retain the generic description for hosted voice.

The shared connection visuals and hint changes should apply to both hosted Voice Mode and GPT Live.

Implementation: #343315.

Comments Threads Pending Resolution

ljharb reviewed on October 21, 2026
ljharb left a comment

> [!WARNING]
> Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a `copilot-code-review.yml` file specifying one with the `runs-on` attribute. See the [docs](https://gh.io/AA11tgch) for more details.

## Copilot review overview

2 open issues

- Medium severity [The test reads DOM state immediately after observable/config changes (e.g. `state.set(...)`,…](https://github.com/microsoft/vscode/pull/343315#discussion_r4341229429) · New
- Low severity [Now that the controller no longer manages per-state classes, `clear()` only removes `voice-active`…](https://github.com/microsoft/vscode/pull/343315#discussion_r4341229527) · New

What changed in this PR

This PR unifies Voice Mode’s ambient glow into a single “connected” blue animation, keeping it visible across voice states (idle/listening/processing/speaking) while connected, and simplifying theme tokens and UI hints accordingly.

**Changes:**
- Made the glow controller state-independent (render/clear now depend on connection/ownership, not voice state).
- Consolidated theme/color behavior so listening/speaking share the same (listening) accent; deprecated the speaking token.
- Updated fixtures/tests and removed “Listening…”/barge-in placeholders while preserving transcript/hints behavior.

| File | Description |
| ---- | ----------- |
| src/​vs/​workbench/​test/​browser/​componentFixtures/​chat/​voiceGlow.fixture.ts | Consolidates fixture coverage into a single “connected” glow fixture. |
| src/​vs/​workbench/​contrib/​chat/​test/​browser/​voiceClient/​voiceInputDecorations.test.ts | Adds regression coverage for connected glow + transcript overlay hint behavior. |
| src/​vs/​workbench/​contrib/​chat/​test/​browser/​voiceClient/​voiceGlow.test.ts | Updates unit tests for new always-connected glow model and shared accent. |
| src/​vs/​workbench/​contrib/​chat/​common/​widget/​chatColors.ts | Updates Voice Mode color token descriptions and deprecates the speaking glow token. |
| src/​vs/​workbench/​contrib/​chat/​browser/​widgetHosts/​viewPane/​chatViewPane.ts | Keeps input glow running while connected, updates transcript hint logic and analyser selection. |
| src/​vs/​workbench/​contrib/​chat/​browser/​voiceInputMode/​voiceInputModeActionViewItem.ts | Removes per-state pill colors and updates comments to match shared blue color. |
| src/​vs/​workbench/​contrib/​chat/​browser/​voiceInputMode/​media/​voiceInputMode.css | Makes connected/listening/speaking share the same blue color. |
| src/​vs/​workbench/​contrib/​chat/​browser/​voiceClient/​voiceInputDecorations.ts | Starts/stops glow based on connected/active/owner only; removes listening placeholders except muted hint. |
| src/​vs/​workbench/​contrib/​chat/​browser/​voiceClient/​voiceGlowController.ts | Refactors controller to a single connected rim, removing state-based cross-fades. |
| src/​vs/​w...

src/vs/workbench/contrib/chat/test/browser/voiceClient/voiceInputDecorations.test.ts
80
		assert.deepStrictEqual({
Unspecified Git Hub Copilot Model
81
			snapshots,
Unspecified Git Hub Copilot Model
82
			listeningOverlayHidden,
Unspecified Git Hub Copilot Model
83
			mutedSnapshot,
Unspecified Git Hub Copilot Model
84
			nonOwnerActive,
Unspecified Git Hub Copilot Model
src/vs/workbench/contrib/chat/browser/voiceClient/voiceGlowController.ts
431 409
		if (this._disposed || 
!
this._
active
) {
410
			return;
411
		}
412
		this._active = false;
436 413
		this._target.classList.remove('voice-active', 'voice-listening'
, 'voice-processing', 'voice-speaking'
);

Resolved Comment Threads

No resolved comments have been left on this PR.