* fix: send chat image attachments when signed out of GitHub
Image attachments were silently dropped for signed-out users even when a
vision-capable BYOK/local model was configured. The panel Image prompt
element gated image inclusion on
`copilotToken?.isEditorPreviewFeaturesEnabled()`, which is `undefined`
when there is no Copilot token (i.e. not signed in), so the negation
evaluated truthy and the image was omitted before the request was sent.
`isEditorPreviewFeaturesEnabled()` represents an org policy that is only
meaningful when a Copilot token exists; a missing token should not block
the feature. Default the check to enabled when the token is absent, using
the same `?? true` pattern already used in
claudeChatSessionContentProvider. This preserves the org-policy behavior
(explicit `editor_preview_features=0` still omits images) while letting
signed-out / BYOK users send images to vision-capable models.
Applied to both HistoricalImage and Image render paths, and added unit
tests covering signed-out, signed-in, org-policy-disabled, and
non-vision-model cases.
Fixes#323854
Co-authored-by: SamirSaji <samirsaji13@gmail.com>
* fix: report accurate omission reason for policy-blocked images
Address review feedback: when a vision-capable model has images omitted
because org policy disables editor preview features, the omitted-reference
status previously said the model "does not support images", which is
misleading. Set the status description based on the actual cause
(lack of vision vs. org policy). The catch/error path keeps the generic
message.
Co-authored-by: SamirSaji <samirsaji13@gmail.com>
---------
Co-authored-by: SamirSaji <samirsaji13@gmail.com>
Co-authored-by: Dmitriy Vasyura <dmitriv@microsoft.com>
* fix(server): propagate --enable-proposed-api in serve-web
The `code serve-web` CLI accepts `--enable-proposed-api EXTENSION_ID`
but never propagated the allowlist to the workbench environment service
or the server-side extension scanner. As a result, extensions declaring
`enabledApiProposals` in their package.json had their proposals wiped
at runtime by ExtensionsProposedApi and failed to activate.
This wires the flag through two paths so it matches desktop behavior:
1. Server scanner: extend IProductService.extensionsEnabledWithApiProposalVersion
in setupServerServices so the node extension scanner keeps the manifest's
enabledApiProposals when --enable-proposed-api is passed.
2. Workbench env service: add a new `enabledExtensionProposedApi` field to
IWorkbenchConstructionOptions, populate it from the CLI args in
webClientServer, and surface it via BrowserWorkbenchEnvironmentService
.extensionEnabledProposedApi so the runtime allowlist in
ExtensionsProposedApi matches the requested IDs.
Fixes#228781
* cli: forward --enable-proposed-api to serve-web subprocess
The Rust CLI parses --enable-proposed-api as a global EditorOptions flag
but was not forwarding it to the node server subprocess spawned by
serve-web. As a result, the flag never reached the server's argv parser
and the server-side plumbing in serverServices.ts and webClientServer.ts
had no input to act on.
Capture the flag in ConnectionManager from CommandContext and pass it
through StartArgs, then append --enable-proposed-api=<id> for each
requested extension ID when spawning the server process.
* fix(server): update proposed API propagation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Martin Aeschlimann <martinae@microsoft.com>
Co-authored-by: Dmitriy Vasyura <dmitriv@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove the minimum-height filler from the latest chat response and clean up the related layout state, option plumbing, CSS, and component fixture.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
During _onProcessExit → dispose(), the _onDisposed event fires before
super.dispose() is called, so isDisposed is still false. Event listeners
triggered during _onDisposed can reach setVisible → _resize →
_updatePtyDimensions, which accesses xterm's dimensions getter. The
getter throws because xterm's internal renderer is in a bad state during
the disposal process.
Add a _isDisposing flag set at the start of dispose() and check it in
_resize() to prevent resize operations during the entire disposal
process, not just after it completes.
Co-authored-by: vs-code-engineering[bot] <122617954+vs-code-engineering[bot]@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: rzhao271 <7199958+rzhao271@users.noreply.github.com>
Co-authored-by: Dmitriy Vasyura <dmitriv@microsoft.com>
* Fix validation error on JavaScript block comment with arrow in HTML script
* Add test suite
* html: handle multiple inline HTML comments
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Dmitriy Vasyura <dmitriv@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: cover the client-hosted filesystem end to end
The resource* family was the largest contract gap the protocol-surface
coverage surfaced: ten of the fourteen uncovered commands were filesystem
operations, tested only in the frozen protocol suite, which side-loads a mock
agent and so cannot describe the contract for a different AHP implementation.
Adds a conformance suite covering both directions. Client to server is the
command surface the host executes against its own filesystem. Server to client
is the reverse direction, where the host addresses client-side files through
the vscode-agent-client scheme and asks the connected client for them - a
configuration nothing in the E2E suite previously reached.
The reverse direction is driven by a real host feature rather than a synthetic
call: a client publishes a plugin customization, and the host materializes it
by copying the directory out of the client. TestProtocolClient now records the
reverse requests it serves, so the test asserts the host actually reached back
rather than resolving the path locally, and asserts the resulting load state -
the customization notification fires on both the success and failure paths, so
without it a sync that reads and then fails would still look green.
Protocol-surface command coverage moves from 15/29 (51.7%) to 25/29 (86.2%).
(Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: address filesystem coverage review feedback (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: compare reverse-request paths through URI on both sides
The Windows E2E leg failed on the client-hosted plugin test. The host had in
fact reached back to the client - the log shows resourceResolve, resourceList
and a resourceRead of plugin.json - but the assertion did not recognize them.
The filter compared `URI.parse(uri).fsPath` against the raw `pluginRoot`, and
`fsPath` lower-cases the Windows drive letter: a served `file:///c%3A/...`
never matches a root of `C:\...`. Both sides now go through `URI`, so they
are normalized identically on whichever platform the test runs.
Introduced by the earlier review fix that replaced a substring match with a
path comparison; the substring version happened not to hit this.
(Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* updates
* agent host: sync user customizations to remote hosts
- Remote Agent Hosts discover the remote home rather than the client's, so
forward enabled user agents, skills, instructions, and prompts.
- Keep local Agent Hosts on native discovery to avoid duplicating same-machine
customizations.
- Preserve per-file opt-out and client-origin grouping for recovered user
customizations.
Fixes#327754
(Commit message generated by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Initial plan
* Stop dictation via toggle of start command; remove Escape keybinding
Co-authored-by: meganrogge <29464607+meganrogge@users.noreply.github.com>
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
* Add dictation help text to editor and terminal accessibility help dialogs
- Add `AccessibilityHelpNLS.editorDictation` string to standaloneStrings.ts
with keybinding reference to workbench.action.editorDictation.start
- Update editorAccessibilityHelp.ts to surface dictation start/stop toggle
help text when speech is available (HasSpeechProvider or built-in engine)
- Update terminalAccessibilityHelp.ts to document that
workbench.action.terminal.startVoice starts and stops dictation
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>
Co-authored-by: Megan Rogge <merogge@microsoft.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
- Resolves the selected response from the text nodes that actually
contribute characters rather than the raw anchor/focus nodes. Browsers
park a line selection's endpoint at offset 0 of the *next* block, which
for the last line of a response lands outside the markdown part
entirely, so a triple-click (the natural way to select a whole line)
looked like an out-of-scope selection and dismissed the widget.
- Paints the captured range with a CSS custom highlight once the native
selection is gone. Focusing the textarea collapses the document
selection as a browser side effect, so the text the question is about
visually disappeared the moment the user clicked in to type it.
- Sources the highlight color from a theming participant instead of a
stylesheet, because highlight pseudo-elements only inherit custom
properties from the root element and cannot see the `--vscode-*`
variables scoped to `.monaco-workbench`.
- Positions the widget from the range's visible line boxes, so the empty
box a line selection leaves in the following block no longer pushes it
a line too low.
Fixes#327706Fixes#327707
(Commit message generated by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* 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>
The Toggle Search Details button's hover tooltip showed a static label,
unlike other search view buttons that use
keybindingService.appendKeybinding(label, commandId) to surface the
configured shortcut (see appendSearchWithAIButton at line 1741 and
appendSearchInOpenedEditorsMessage at line 2043 in the same file).
Use the same pattern so the button's tooltip reflects
workbench.action.search.toggleQueryDetails (Ctrl+Shift+J by default).
Fixes#131484
Co-authored-by: Dmitriy Vasyura <dmitriv@microsoft.com>
* agentHost: fix Claude side chats during active turns
- Prevents active AHP request IDs from being passed to Claude as fork anchors, because the SDK only accepts persisted assistant message UUIDs.
- Preserves the quick /btw workflow by falling back to captured source context until Claude has produced a forkable response.
- Adds regression coverage for creating a side chat before the source response begins.
Fixes#327701
(Commit message generated by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: address review feedback
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Extend the npm extension to recognize the `catalog` section in
package.json, enabling IntelliSense completions, version suggestions,
and hover information for packages listed under the catalog key.
This supports the catalog feature used by pnpm, bun, and yarn for
centralizing dependency versions in monorepos.
Fixes#294609
Co-authored-by: Martin Aeschlimann <martinae@microsoft.com>
Fixed incorrect directory paths in json-language-features and html-language-features CONTRIBUTING.md files. The paths were missing hyphens which would cause command failures when users try to follow the documentation.
- Fixed: json-languagefeatures/server/ → json-language-features/server/
- Fixed: html-languagefeatures/server/ → html-language-features/server/
Adds folding markers for //#region and //#endregion to the json/jsonc
language configuration so that the minimap section headers feature
(editor.minimap.showRegionSectionHeaders) recognizes them and renders
the corresponding section labels.
vscode-json-languageservice already provides folding ranges for these
markers in jsonc, but the minimap section headers contribution reads
folding markers from the language configuration only, which is why the
labels were missing.
Fixes#219561
* agentHost: start local host earlier
Prewarm the local Agent Host during the Ready phase, react to cached startup enablement, and keep late local/remote initialization surfaces coherent. Add startup timing instrumentation for process connection, provider registration, authentication, proxy discovery, and initial session listing. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: respect AI feature opt-out
Prevent the Agent Host process from launching when chat.disableAIFeatures is enabled, even if Agent Host enablement is otherwise true. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chat: share AI disabled setting id
Use one platform-owned identifier for chat.disableAIFeatures across Agent Host, chat, sessions, extension management, layout, and tests. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: fix enablement browser tests
Inject the runtime platform into the testable enablement implementation and register the AI opt-out test at suite scope. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: update remote client test enablement
Adapt the merged remote Agent Host client test to observable enablement and stable relayed client surfaces. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: respect masked AI opt-out (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: keep Agents setup behavior unchanged (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: simplify lifecycle optimization (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: clean up formatting (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* agentHost: add startup performance marks (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove the post-response faithfulness gate that discarded successful cleanup output before it reached the chat input. Keep the refusal fallback and remove obsolete validator tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 5ecd2473-63cb-46ba-a12b-111c90dd5fcf
* nes: fix: share in-flight speculative requests across concurrent calls
A speculative request is fired when a suggestion is shown, betting on the
document state that results if the user accepts it. `consumePending()` nulled
the pending slot as soon as the first `getNextEdit` caller claimed the request,
so a second overlapping caller for the same post-edit state could not discover
it and issued a duplicate model request — losing the latency win, the
`ReusedRequestKind.Speculative` telemetry, and the `liveDependentants` sharing
that keeps a joined request alive for multiple dependants.
Rename it to `claimPending()` and keep claimed requests in a map until their
`result` settles, so concurrent callers join the in-flight request instead.
A map rather than a single slot: several speculatives can be claimed at once
(e.g. one per document), and evicting one on the arrival of another would
reintroduce the same bug.
Claimed requests deliberately survive the "nobody will want this anymore"
cancellation reasons (Replaced, Superseded, Rejected, IgnoredDismissed,
trajectory divergence) since they have a live consumer; `invalidateClaimed()`
still cancels them for reasons that invalidate the result itself (CacheCleared,
DocumentClosed, Disposed).
Also settle `firstEdit`/`result` in `_runSpeculativeProviderCall`'s outer catch.
Previously a throw at the first `editStream.next()` left them unsettled forever,
hanging any caller that reused the request — a pre-existing bug that the claimed
map would otherwise widen into a permanent map entry.
Behavior is unchanged when `inlineEdits.speculativeRequests` is off: the claimed
map can only be populated via `_triggerSpeculativeRequest`, which is gated on the
setting, so every new lookup degenerates to an empty-map no-op.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b9cc340f-f2af-491d-a411-6e1c2c19583e
* nes: test: cover speculative that throws before its first streamed edit
The outer catch in `_runSpeculativeProviderCall` settles `firstEdit`/`result`
so a caller reusing the request cannot hang, but nothing exercised it: every
existing speculative test yields at least one edit or is cancelled.
Add a `throwBeforeFirstYield` harness behavior and a regression test that claims
such a speculative. `getNextEdit` rethrows the underlying error for
`NoNextEditReason.Unexpected`, so the joiner rejects with the provider error
instead of awaiting forever, and the released claim lets the following request
recover with a fresh provider call.
Verified to fail without the fix: the joining call times out after 8s.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b9cc340f-f2af-491d-a411-6e1c2c19583e
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: b9cc340f-f2af-491d-a411-6e1c2c19583e
Stop hidden editor Copilot CLI session monitoring
Use the editor-window Extension Host visibility setting to control the shared session-state watcher while preserving the existing Agents-window behavior.\n\n(Written by Copilot)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Initial plan
* fix: prevent list cutoff at bottom of agent customization view
The AICustomizationListWidget.layout() method was setting an explicit
pixel height on its element, causing it to overflow its padded parent
container (prompts-content-container has padding: 40px 40px 16px with
overflow: hidden). The bottom portion of the list was clipped.
Fix: clear the explicit height style so CSS-computed height (height: 100%)
takes effect inside the parent's padding box, then read clientHeight to
get the actual available space before computing the Monaco list height.
This mirrors the approach already used by McpListWidget.layout().
Co-authored-by: aeschli <6461412+aeschli@users.noreply.github.com>
* Make group-header rows non-selectable to fix double focus border and hover highlight
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>
Co-authored-by: Martin Aeschlimann <martinae@microsoft.com>
* Initial plan
* Voice mode: static placeholder text, subtler glow, updated barge-in hint
Co-authored-by: meganrogge <29464607+meganrogge@users.noreply.github.com>
* chat: use pill radius for expanded dictation mic glow
Fixes the dictation active glow radius inside the segmented voice toggle so it renders as a pill rather than a squircle when expanded.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chat: align dictation mic glow with voice mode listening glow
Updates the active dictation mic glow to match the inner border and inset wash style used by voice mode while listening, replacing radial gradients with a subtle inset shadow and border.
Co-authored-by: Copilot <223556219+Copilot@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>
Co-authored-by: Elijah King <elijahwilliamking@icloud.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Megan Rogge <merogge@microsoft.com>