* 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
* 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>
* 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.
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>
* 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>
* 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>
* 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>
* 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.
* Add prompt timeline rail to the Agents window
Introduce a right-edge "prompt timeline" rail in the Agents window that
lets users scan and jump between the prompts they have sent in a chat
session, adapted from GitHub's "jump to your messages" affordance.
- Self-contained contrib under src/vs/sessions/contrib/promptTimeline,
attached per-widget via IChatWidgetContrib (no vs/workbench changes).
- Recency-bucketed ticks (pure, unit-tested budgetBucketPrompts) capped
so each tick keeps a >=24px hit target (WCAG 2.5.8).
- Dense marks at rest that expand on hover/focus, with green/red per-turn
diff magnitude and a solid-blue active mark.
- Interactive hover card: prompt text, clickable +/- diff stats that open
the per-request diff, and per-file drill-down rows.
- Per-request diffs via provider-agnostic IChatResponseFileChangesService
(agent-host server-computed turn changeset) with editing-session
fallback; diff sides are probed so missing checkpoint blobs render as a
pure add/delete instead of crashing the multi-diff editor.
- Keyboard-first commands: Go to Next/Previous Prompt, Go to Prompt...
(quick pick), Review Changes for Prompt, with ARIA announcements.
- Gated behind the new sessions.promptTimeline.enabled setting and
ChatContextKeys.enabled; rail is created/disposed reactively.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: quiet gray-dense rail with single-mark accordion
Replace the whole-rail expand-on-engage behavior with a per-mark
accordion. The rail now stays quiet, gray and dense at all times; only
the mark under the pointer (or keyboard focus) expands to a >=24px pill
and reveals its green/red diff, so the rail no longer becomes a column
of slim pills with large gaps when interacted with.
- CSS: drop the `.engaged` whole-rail slot expansion and the transform
fisheye; expand only `:hover`/`:focus-visible` marks (8px -> 24px slot,
fat pill, diff colors). Active mark stays solid blue in every state.
- Rail: remove the fisheye magnify, the engaged-state tracking, and the
magnitude width buckets; capacity now reserves headroom for a single
expanded mark over the dense 8px rhythm, so more prompts fit.
- Drop the now-unused --tick-scale/--tick-scale-y custom properties.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: open per-file diff inside the multi-diff, revealed at that file
Clicking a file row in the hover card previously opened a standalone
single-file diff. Route it through the same multi-file diff we already
build for "Review Changes", passing viewState.revealData so it opens
revealed at the clicked file. Per-file and whole-prompt review now share
one multi-diff experience (and open in the modal editor when enabled),
reusing the existing MultiDiffEditorInput without any new UI.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: show per-turn diffs against the frozen after-turn snapshot
The per-prompt diff was rendering before-turn vs the live working file, so
it showed the combined changes of all later turns. The per-turn changeset
already carries a frozen "after" snapshot; surface it and diff against it.
- Add optional `modifiedContentURI` to IEditSessionEntryDiff: the frozen
after-state RHS content, distinct from `modifiedURI` (the live file used
for identity / go-to-file). Opt-in, so existing consumers (e.g. the chat
"Changed N files" summary) keep their current behavior unchanged.
- Populate it in AgentHostResponseFileChangesProvider from the changeset's
after-content; extend its test to assert the mapping.
- PromptTimelineModel now diffs originalURI (frozen before) against the
frozen after snapshot, so review shows only that turn's changes, while
go-to-file still opens the live working file.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: add an overview-ruler style selectable by setting
Introduce a second rail style and let users choose via the new
sessions.promptTimeline.style setting ('compact' | 'overview').
- Extract IPromptTimelineRail as the seam the contrib consumes, and a
shared PromptTimelineCard (hover preview) used by both styles.
- Rename the existing rail to PromptTimelinePillRail (dense pills).
- Add PromptTimelineRulerRail: the session compressed into the rail like
the editor overview ruler — proportional marks at their transcript
scroll positions, a scrollbar-slider you-are-here thumb, one green
"changed code" signal (editorOverviewRuler.addedForeground), focusBorder
active, >=24px hit targets. Detail stays in the shared hover card.
- Model exposes getScrollLayout()/onDidChangeScrollLayout for proportional
positions (per-request offsets via currentRenderedHeight + scrollTop).
- Contrib picks the rail class reactively and reuses the enablement swap
pattern, wiring setScrollLayout only for rails that support it.
All colors come from real theme tokens. Validated: typecheck, eslint,
layers, hygiene, unit tests (12 passing).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: position overview-ruler marks from the list layout model
The overview-ruler rail placed each mark by accumulating chat items'
`currentRenderedHeight`, which the virtualized tree only sets for rows it has
actually rendered. Off-screen prompts reported `undefined` (treated as 0), so
every not-yet-rendered mark collapsed onto the same position and only spread
out as the user scrolled and rows rendered.
Read each prompt's top from the list's layout height model instead, the same
virtualization-safe source the scrollbar uses (all items have a height via the
delegate's `currentRenderedHeight ?? defaultElementHeight`). Threaded a
read-only accessor through the layers, all in the list's content-pixel space so
the viewport thumb stays aligned:
- AbstractTree.getElementTop(location): absolute top (works off-screen), sibling
of getRelativeTop.
- ChatListWidget.getElementTop / ChatWidget.getElementTop + ChatWidget.scrollHeight.
- PromptTimelineModel.getScrollLayout() and _updateActive() now use these instead
of accumulating currentRenderedHeight.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: color ruler marks by the turn's add/remove split
Ruler marks were a single green "edited" signal, so a delete-heavy turn still
showed green. Render the mark as a two-tone bar instead (a green added segment
and a red removed segment sized by flexGrow from the turn's diff stat), reusing
the pill rail's seg-add/seg-del pattern. Only the non-zero side is appended, so
a pure-add turn is fully green and a pure-delete turn fully red, and a 1px
min-width keeps the minority color visible on a lopsided split. Segments go
transparent while the mark is active so the focusBorder you-are-here color wins.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: fall back to the live file when a turn snapshot is unreadable
Per-turn review diffed the frozen before/after turn-checkpoint snapshots so only
that turn's changes show. But those checkpoint blobs can be absent (an added
file's original, or a pruned/restored session where whole turn checkpoints are
gone). When both sides were unreadable every item was dropped and reviewChanges
opened nothing at all.
_readableSides now still prefers the frozen snapshots but falls back to the live
working file for the modified side when the checkpoint blob is unreadable, so
review always opens with the best available fidelity. An unreadable side is
still dropped so the file renders as a clean add/delete instead of crashing the
diff editor.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: drop the pill style, keep only the overview ruler
The rail shipped with two selectable styles (dense pills vs overview ruler)
behind sessions.promptTimeline.style. We're standardizing on the overview-ruler
UX, so remove the pill style and the setting entirely (the on/off
sessions.promptTimeline.enabled setting stays).
- Delete promptTimelinePillRail.ts and the PROMPT_TIMELINE_STYLE_SETTING /
PromptTimelineStyle enum.
- The contribution always builds the ruler rail; drop the style-based swap, the
capacity->display-budget wiring, and the optional setScrollLayout indirection
(now required on the interface).
- Model no longer tracks a dynamic display budget; ticks bucket against the
constant MAX_TICKS (still caps very long sessions).
- Remove the pill-only CSS; the overflow rule now hides the ruler marks.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: address review feedback on grouped-tick diffs and read probes
Two fixes from a council review:
- getRequestFiles: when a grouped tick edits the same file in more than one
prompt, advance the merged entry's diffModifiedURI to the later prompt's
after-snapshot (keeping the earliest originalURI) so the opened multi-diff
spans the whole tick instead of only the first edit.
- _canRead: probe availability with readFile(resource, { length: 1 }) instead of
reading whole (potentially large) file contents just to test whether a diff
side is readable.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: refresh comments left over from earlier iterations
Comment-only cleanup after removing the pill style and the display-budget
mechanism: drop the stale "or budget", "(like the pill rail)", and "visual
density" references so the docs match the single overview-ruler implementation.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: gate the enabled setting behind an experiment
Put sessions.promptTimeline.enabled behind the experimentation service via the
`experiment: { mode: 'startup' }` property (the sanctioned way for core
TS-registered settings; the registry auto-adds the onExP tag). Default is now
false so the rail is off until the experiment (or the user) turns it on.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: address PR review feedback and fix class-field init order
Review fixes:
- Remove the redundant GoToNext/GoToPrevious commands: they duplicated and
collided with the built-in chat nextUserPrompt/previousUserPrompt keybindings
(same chord, weight, when). Drop the two actions, their command ids,
contrib.navigate(), and model.getSiblingTick(). GoToPrompt and ReviewChanges
stay.
- Fix the active-mark fallback: when scrolled above the oldest prompt, highlight
the oldest tick (ticks.at(0)), not the newest (ticks.at(-1)).
- Replace the getComputedStyle probe + unreverted host `position` mutation with a
lifecycle-scoped `.prompt-timeline-host` class removed on teardown.
- Give the overview-ruler toolbar a proper keyboard model: aria-orientation,
roving tabindex (a single Tab stop) and Arrow/Home/End navigation between marks.
Also assign `_sessionResource` in the constructor instead of a field initializer:
it reads `this.widget`, which under useDefineForClassFields is not yet assigned
when field initializers run (fixes the define-class-fields-check / TS2729).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: stop showing the unreliable per-prompt timestamp
Agent-host sessions don't record per-turn timestamps; the transcript is
reconstructed via ChatModel.addRequest(), which stamps Date.now(), so every
prompt showed ~the current time. Since the real send times aren't available to
recover, drop the absolute time from the hover card and the "Go to Prompt"
picker. Grouped ticks still show their prompt count; the prompt text and diff
stats (both reliable) are unchanged.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Prompt timeline: act on PR review (remove ReviewChanges action; rename modifiedContentURI)
- Remove the ReviewPromptChangesAction command: per-prompt review is already
available from the hover card, so the palette/keyboard entry point was
redundant. Drops the command id and the now-unused contrib.getActiveTick() /
contrib.reviewChanges() bridge (model.reviewChanges stays, wired to the card).
- Rename IEditSessionEntryDiff.modifiedContentURI -> modifiedSnapshotURI: it's the
frozen after-turn snapshot content, and "snapshot" reads clearer next to
modifiedURI (the live file) than "content".
- Clarify in comments that this field is distinct from the agent-host checkpoint-
ref readability fix (#323932): that made the snapshot blobs readable; this
carries which snapshot to diff against so a per-turn review shows only that
turn's changes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat: restore node_modules bundled into asar
* fix: store node_modules at top level inside asar archive
* Revert "fix: store node_modules at top level inside asar archive"
This reverts commit 4747aa5e375cc1fe49b8eb510dd1acec1fd6a581.
* fix: pack node_modules into asar
* fix: read copilot/ripgrep natives from node_modules.asar.unpacked
* fix: load node-context modules and native binaries from ASAR
- bootstrap-esm: resolve bare specifiers via package self-reference so
Node applies the package's real `exports`/`main` and ESM conditions.
The previous CommonJS `require.resolve()` picked the `require`
condition and loaded the CJS entry of dual CJS/ESM packages (e.g.
playwright-core), which did not expose their named ESM exports.
- amdX: in `_nodeJSLoadScript`, read module files with the ASAR-aware
`require('fs')` instead of `import('fs')`, which the resolution hook
maps to the ASAR-unaware `original-fs` and therefore cannot read
files inside the archive (e.g. @vscode/iconv-lite-umd).
- agentHost commandAutoApprover: load the tree-sitter `.wasm` files
from node_modules.asar.unpacked in built apps (node_modules in dev).
- agentHost copilotAgent: resolve the @github/copilot-<platform> CLI
and the @microsoft/mxc-sdk sandbox binaries from
node_modules.asar.unpacked in built apps, and unpack
@microsoft/mxc-sdk/bin so those executables can be spawned.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: resolve ASAR modules relative to the archive root
Two follow-up fixes for ASAR support:
- bootstrap-esm: resolve packages inside node_modules.asar with relative
specifiers (require.resolve("./<pkg>/package.json") and "./<spec>")
instead of bare specifiers. The archive directory is named
node_modules.asar, so a bare-specifier resolution walks for a
node_modules directory that does not exist and fails. This broke every
native module imported from main.js in the packaged app
(@vscode/spdlog, @vscode/sqlite3, native-keymap, @vscode/deviceid,
@vscode/policy-watcher), preventing startup.
- create-universal-app: pass `singleArchFiles` so the universal merger
allows files that are unique to a single arch inside the merged
node_modules.asar (the @github/copilot-<arch> platform package and the
arch-specific copilot/ripgrep binaries). These paths are ASAR-internal
(top level, no node_modules prefix); without the allowlist the merge
aborts with "Detected unique file ... not covered by allowList rule".
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: resolve sandbox runtime and Windows CJS lookups with ASAR
* fix: resolve ESM modules from the importer's own node_modules
* fix: unpack node-pty package.json
* fix: resolve node-pty binaries from unpacked asar in Copilot shim
* fix: resolve Copilot native binaries from node_modules.asar.unpacked
* fix: universal build for mxc
* fix: load tree-sitter wasm from node_modules on web
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: animate input banner border while an action is running
The CI checks and comments input banners in the Agents window now show an
animated "border beam" while an async action is running, mirroring the chat
input's in-flight border. This is primarily for the CI "Fix Checks" action,
which spends a noticeable amount of time fetching check annotations before
submitting the prompt.
- SessionInputBannerWidget: action run() may return a promise; while it is
pending the banner gets a `.working` class and its buttons are disabled. The
animation is only shown after a 50ms delay so fast actions don't flicker.
- CSS: added the comet/glow ::before/::after rings (padding + inverted mask
trick) driven by a spinning conic gradient, respecting reduced-motion.
- Color matches the chat input working-border token for comments banners, and
the orange accent (same as the primary button) for CI banners.
- Fix Checks / Address Comments await their work; Reveal Checks stays
fire-and-forget. Added a CIFailuresLoading screenshot fixture.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: address input banner loading review feedback
- Disable banner buttons immediately while an action is pending; only the
animated border is delayed by 50ms to avoid flicker.
- Make the click handler explicitly fire-and-forget and swallow action errors
inside _runAction so it can never produce an unhandled rejection.
- Type _executeCommand cleanly as Promise<void> (await + try/catch) instead of
returning the unknown-typed executeCommand result.
- Expose SessionInputBannerWidget.setWorking so the CIFailuresLoading fixture
reflects the real disabled-button state, not just the .working class.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* build: register session input banner CSS variables for hygiene
The animated banner border introduced new CSS custom properties that must be
listed in build/lib/stylelint/vscode-known-variables.json, otherwise the
hygiene 'Unknown variable' check fails.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(automations): add foundation — types, storage service, scheduler, leader election
Introduces the Automations subsystem core:
- IAutomation types and IAutomationSchedule (interval-based: manual/hourly/daily/weekly)
- DST-safe computeNextRunAt scheduling logic
- IAutomationService with persistent JSON ledger (StorageScope.APPLICATION)
- Optimistic concurrency via revision counter for cross-window safety
- Leader election to ensure single scheduler instance across windows
- AutomationScheduler: periodic tick loop checking due automations
- Feature gate: chat.automations.enabled setting mirrored to context key
- Unit tests for scheduling logic
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: address Copilot Code Review feedback on PR 1
- Add _unsupportedSchema guard to recordRunStart and updateRun
- Localize CRASH_RECOVERY_REASON string via nls.localize()
- Move imports above registerSingleton call in contribution file
- Fix test comment referencing wrong helper name (buildLocalDate -> localDate)
* fix: address CCR round 2 — schema guards, telemetry cleanup, scope fix
- Add _unsupportedSchema guard to markStaleRunsFailed and advanceNextRunAt
- Replace boolean telemetry flags with actual enum values (permissionLevel, isolationMode)
- Remove hasProviderId, hasSessionTypeId, hasModelId, hasMode, hasPermissionLevel flags
- Add scope: ConfigurationScope.MACHINE to runTimeoutMinutes setting
* fix: gate scheduler construction on chat.automations.enabled
AutomationSchedulerCore (and its leader election heartbeat/storage
writes) are now only constructed when the feature setting is enabled.
Uses MutableDisposable for clean teardown on runtime toggle.
Addresses CCR feedback: avoid 30s heartbeat timer + storage writes
when the feature is disabled.
* fix: isolate per-automation errors in dispatch loop
Wrap advanceNextRunAt + runOneWithTimeout in try/catch so a failure
in one automation does not abort dispatch of remaining due automations.
* fix: register automations path in i18n resources
Adds vs/sessions/contrib/automations to the translation resources
so nls.localize calls pass the eslint translation-remind rule.
* fix: validate enum fields at write boundary and harden persist()
- Normalize permissionLevel/isolationMode in createAutomation and
mergeAutomation: reject unknown values to keep persisted data and
GDPR-classified telemetry low-cardinality.
- Wrap persist() storage read and write in try/catch so storage
failures degrade gracefully instead of breaking the scheduler.
* fix: scheduler to Eventually phase, simplify persist(), document serial dispatch
- Move scheduler registration from AfterRestored to Eventually —
background concern that doesn't need to block workbench restore.
- Remove re-read-before-write in persist() — refreshFromStorage via
onDidChangeValue already handles cross-window sync. Eliminates
redundant JSON.parse on every mutation and the misleading optimistic
concurrency check that overwrote anyway.
- Document that _pendingRuns serializes dispatch intentionally.
* style: remove em dashes and obscure acronyms from comments
Replace all em dashes with periods or semicolons. Remove TOCTOU
acronym. Replace multiplication sign with plain x.
* Signing commit
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chore: bump electron@42.4.0
* chore: apply temp dir workaround for short paths
* chore: use 24.15.x for CI node
* chore: update nodejs build
* chore: bump electron@42.5.0
* fix: unblock playwright install on node 24.17
Node 24.16+ made Readable pause()/resume() a no-op on destroyed streams
which makes yauzl 2.x / extract-zip 2.x and older playwright extraction
hang forever.
- extensions/copilot: add "yauzl": "^3.3.1" override (was missed by #318682)
so electron and @vscode/vsce no longer resolve the broken yauzl 2.10, fixing the
hung `npm ci` in the Copilot and Extract chat-lib pipelines.
- extensions/copilot: bump electron ^39.8.5 -> ^42.5.0 so its install
script uses the native @electron-internal/extract-zip instead of extract-zip.
- bump @playwright/test ^1.56.1 -> ^1.61.1 so `playwright install`
uses the fixed extractor, unblocking the "Download Electron and
Playwright" step in all electron test pipelines.
* chore: update build
* agentHost: fix macOS sandbox smoke sentinel parsing
On macOS CI, the AgentHost sandbox smoke test resolves the shell to
/bin/sh, which uses the sentinel-based completion path. In that path, the
parser could consume the echoed sentinel command text
(`<<<COPILOT_SENTINEL_..._EXIT_$?>>>`) before the real numeric marker
arrived, causing a false `Exit code: -1` failure even though the command
later completed successfully.
Harden the sentinel parser to ignore echoed/non-numeric sentinel text
and use the latest complete numeric marker instead. Also force the
macOS AgentHost sandbox smoke test to use /bin/sh and assert that in the
suite log so local runs exercise the same path as CI.
Adds a regression test for echoed sentinel command text.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chore: update screenshot baseline after playwright bump
* chore: bump distro
* chore: fix typecheck
* chore: bump distro
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The GitHub Actions PR test workflows run integration/smoke tests out of
sources, so each test section launches scripts/code.bat, which runs
build/lib/preLaunch.ts. Unlike the Azure Pipelines product builds, the
GitHub workflows did not set VSCODE_SKIP_PRELAUNCH, so preLaunch ran on
every section and getElectron() unconditionally deleted and re-downloaded
.build/electron each time. On Windows this races with file locks held by
the just-exited Electron process and intermittently fails the whole job
with the bare 'The system cannot find the path specified.' error.
- Set VSCODE_SKIP_PRELAUNCH=1 on the unit/integration/remote test steps of
the win32, linux and darwin PR workflows, matching Azure Pipelines (the
workflows already prepare node_modules, out, built-in extensions and
Electron in dedicated steps before the tests run).
- Make getElectron() version-aware: skip the destructive re-download when
the installed Electron already matches the expected version, falling back
to a download on any detection failure.
- Make scripts/code.bat fail fast with a clear message when preLaunch.ts
fails instead of falling through to launch a missing executable.
- Retry rimraf on EBUSY/EPERM (Windows file-lock codes), not just ENOTEMPTY.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The checked-in policyData.jsonc was generated with the Copilot extension
loaded, which injected referencedSettings linking the OTel extension
settings to the core CopilotOtel* policies. The PolicyExport integration
test regenerates using the test fixture distro with no user extensions, so
those referencedSettings are absent. Regenerate in an isolated environment
to match the fixture-based export.
* Gate Claude3PIntegration behind editor preview policy
Flip ownership of the `Claude3PIntegration` enterprise policy so it can
honor the account-side editor preview-features flag.
Previously the policy was owned by the copilot-chat extension setting
`github.copilot.chat.claudeAgent.enabled` via the distro `product.json`
`extensionConfigurationPolicy` block. Because `product.json` is pure JSON
it cannot carry a `value(policyData)` callback, so the policy only
responded to OS/MDM admin policy and never honored
`chat_preview_features_enabled` (sourced from the Copilot token's
`editor_preview_features`). Codex works because its core setting owns
`Codex3PIntegration` in code with a value callback.
Now the in-code core setting `chat.agentHost.claudeAgent.enabled` owns
`Claude3PIntegration` with the preview-features value callback, and the
extension setting attaches via a `policyReference` declared from
`product.json`. To express that, an `extensionConfigurationPolicy` entry
can now be either form:
- the current owner/"parent" syntax (full `IPolicy`: name, category,
minimumVersion, description), or
- a reference: `{ "policyReference": { "name": "<owner>" } }`, mirroring
the in-code `policyReference` configuration field.
`configurationExtensionPoint` and the policy exporter detect the
`policyReference` key to route entries to `.policy` vs `.policyReference`;
the exporter links reference entries into the owner's `referencedSettings`
and skips type validation for settings not registered in the headless
export process.
Regenerates `policyData.jsonc` and updates the export test fixture.
Requires the companion change in microsoft/vscode-distro that turns the
claude entry into a `policyReference`.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Bump distro to pick up Claude3PIntegration policy reference
Update the distro pin to 7abf39b86c07d094722a4b3ec9f37e78fe3d5db3, which
includes the merged change turning the `github.copilot.chat.claudeAgent.enabled`
`extensionConfigurationPolicy` entry into a `policyReference` to the in-code
`Claude3PIntegration` owner (microsoft/vscode-distro#1434).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Ubuntu <josh@ahp.4mywozgnka0etnlo23z031udwc.xx.internal.cloudapp.net>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
On a narrow Agents window, auto-hide the sessions sidebar while both the
editor and the side panel (auxiliary bar) are open, and show it again once
either closes or the window grows wide. A manual close suppresses auto-show
until the user opens it again; suspended while the editor is maximized or
multiple sessions are visible. Gated by the experimental setting
`sessions.layout.autoCollapseSessionsSidebar` (default on in non-stable builds).
Session navigation never auto-hides the sidebar: a base-controller restore
epoch (`_withSessionLayoutRestore` / `_isRestoringSessionLayout`) wraps both
the aux-bar restore and the editor working-set apply (`_applyWorkingSet`, which
reveals the editor part after an await). The D7 autorun re-baselines instead of
reacting while a restore is in flight. The epoch is a depth counter so the
guard stays up across overlapping/independently-settling restores, and it
decrements synchronously for void work so it never leaks for no-op restores.
Layout-controller registration moves to a new
`sessions.layout.contribution.ts` that picks the desktop or mobile controller
per platform and registers the experimental setting.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Bump Copilot CLI packages to @github/copilot@1.0.64-1 and @github/copilot-sdk@1.0.3
* Resolve Agent Host Copilot CLI through @github/copilot/bin.copilot
* Materialize @github/copilot/sdk from @github/copilot-<platform> in extension postinstall
* Package @github/copilot-<platform>/copilot for Agent Host and linuxmusl
* Exclude Copilot optional native payloads from extension package
* Scan @github/copilot-*/copilot for Linux package dependencies
* Tighten Copilot SDK 1.0.64-1 attachment and RPC typings
* Increase Copilot SDK native binary scan test timeout
* Update amd64 deb deps for @github/copilot-linux-x64/copilot
* Update arm64 rpm deps for Copilot package layout
* Update x64 rpm deps for @github/copilot-linux-x64/copilot
* Try to fix windows smoke test
* Try to fix platform runtime files for agent host
* exclude copilot computer.node from agent host packaging
* Another attempt to try to get packaging right
* Should only try to load 1.0.64-1
* Try to fix packaing for windows, macos, deb deps
* Update armhf/arm64 deb and x64 rpm Copilot dependency baselines
* Copilot darwin ripgrep universal merge and arm64 rpm deps
* Restore target Copilot SDK prebuilds for built-in extension packaging
* see if changes to gulpfile.reh.ts would help
* dont mess with formatting
* Launch copilot cli from platform index.js and exclude SEA
* sessions: contribute PR pill as session header meta toolbar action
The session header pull request pill was rendered as bespoke DOM directly in sessionHeader.ts. Instead contribute it as an action into the existing Menus.SessionHeaderMeta toolbar, mirroring how the changes view contributes the diff-stats action.
- Add OpenPullRequestAction + OpenPullRequestActionViewItem (renders the #<number> pill, opens the PR on GitHub) in contrib/github/browser/pullRequestActions.ts, registered via IActionViewItemService.
- Gate it on a new per-view SessionHasPullRequestContext key, set by SessionView from the session's GitHub info (parallel to SessionHasChangesContext).
- Remove the manual PR pill DOM, fields, handlers and IOpenerService/URI usage from sessionHeader.ts; the meta toolbar now owns both the diff-stats and PR pills.
- Share the pill CSS between the diff-stats and PR action view items.
- Replace the header fixture's PR-pill variants with a dedicated openPullRequest fixture for the new action view item.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: document PR pill in Agents window accessibility help
Add a line to the SessionsChat accessibility help dialog describing the session header pull request pill and referencing its command keybinding placeholder, mirroring the existing diff-stats entry so screen reader users can discover it.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* build: register vs/sessions/contrib/github for i18n
The new pullRequestActions.ts introduces the first localized strings under vs/sessions/contrib/github. Add the module to build/lib/i18n.resources.json so the code-translation-remind eslint rule passes (it was failing Compile & Hygiene).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fixtures: render PR + diff pills in session header fixture
The session header fixture rendered the real SessionHeader, but its meta toolbar (Menus.SessionHeaderMeta) was backed by the empty TestMenuService / NullActionViewItemService, so the contributed pull request and diff-stats pills never appeared.
Wire the fixture's meta toolbar through the production code path: use FixtureMenuService for IMenuService, a small Map-backed IActionViewItemService, and a bound ISessionContext, then register the real OpenPullRequestActionViewItem / ViewAllChangesActionViewItem factories and contribute the matching menu items (gated on the mock session having a PR / changes). The header now shows 'folder #<number> +X -Y' as in production.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: add CI failures and created-comments banners above the chat input
Add two dismissible banners that render directly above the active session's
chat input in the Agents window:
- A CI failures banner (orange accent) shown when the active session has at
least one failed CI check. It reads "X of N checks failed" (ellipsized) with
a floating right-aligned button bar: Fix Checks (same as the Changes view
fix-ci action) and Reveal Checks (opens the Changes view and expands +
focuses the CI checks section).
- A created-comments banner (neutral accent) shown when the active session has
reviewable (PR/Agent review) comments still in the Created state. It reads
"N comments" with Address Comments (sends /act-on-feedback) and Reveal
Comments (opens the first comment in the editor).
Each banner has its own dismiss (x) that permanently hides it for that session,
persisted across reloads via the storage service.
The presentational card is a self-contained SessionInputBannerWidget so it can
be rendered in a Component Explorer fixture; the reactive SessionInputBanners
host composes it and the chat view mounts it above the input via the public
IChatWidget.inputPart.element API.
Also adds CIStatusWidget.expand()/focus(), ChangesViewPane.revealChecks(), and a
Reveal Checks command, plus Component Explorer fixtures for the banners.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: register sessionInputBanners in i18n.resources.json
Fixes the Compile & Hygiene CI failure: the new contrib uses localize() so its
folder must be listed for translation extraction.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: address PR feedback on input banner widget
- Use the shared Button widget for banner action buttons so theming, focus,
keyboard/touch, and accessibility stay consistent (primary = button colors,
secondary = ghost), mirroring the chat input notification widget.
- Make the ThemeIcon import type-only.
- Use the --vscode-strokeThickness token for the 1px border and focus outlines.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: make the Fix Checks button orange to match the CI banner accent
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: give secondary banner buttons a visible border
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: label comments banner by kind (PR / agent / mixed)
Show 'N PR comments' when all counted comments are PR reviews, 'N agent
comments' when all are agent reviews, and 'N comments' for a mix.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>