* refactor: remove Automations section from AI Customizations editor
The Automations UX has moved to a dedicated custom view in the sessions
app sidebar. Remove the old widget, accessibility help, and all wiring
from the AI Customization Management Editor.
- Delete automationsListWidget.ts and automationsAccessibilityHelp.ts
- Delete corresponding test files
- Remove widget creation, layout, visibility, and focus handling from
the editor
- Remove deep-link focusAutomation case from contribution
- Remove stale AccessibilityHelp registration from sessions contribution
- Keep Automations enum value (sessions app still depends on it)
* chore: remove dead Automations CSS from customization editor stylesheet
* chore: remove dead Automations test and fixture references
* fix: retarget automation-configured button to sessions custom view
* fix: redirect Automations tree link to custom view
* fix: redirect Automations overview tile to custom view
* fix: remove Automations link from customization tree view
* fix: remove Automations tile from customization overview
* fix: remove Automations from customizations toolbar
* chore: remove dead automationId parameter from OpenEditor command
* chore: remove dead automationsContentContainer from test interface
* chore: remove dead isAutomations field from ICustomizationItemConfig
* docs: remove stale Automations widget paragraphs from AI_CUSTOMIZATIONS.md
* chore: remove dead automationsEnabled fixture scaffolding
* chore: remove AutomationsTab from blocks-ci-screenshots.md
Switching Add Context to `Codicon.addCompact` changes the `+` in the
inline chat zone widget, which is a blocks-ci fixture.
Verified the change is intentional and confined before accepting the new
hashes: rendering the fixture on this branch and on its merge-base and
diffing them locally shows a single 12×12px region differing — the `+`
glyph going from 11×11 to 10×10 of ink. That is the optically tuned
compact glyph replacing the scaled-down base one, at a call site already
rendering at `codiconFontSize-compact`, which is the pairing the design
tokens guidance asks for. Nothing else in the widget moved.
Hashes are exactly the ones the failing run computed.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chat: enable agent host defaults
Flip the Agent Host migration settings to their rolled-out defaults and enable remote Agent Host support for web clients attached to a remote extension host. Serverless web retains extension-host fallbacks. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* test: cover web agent host disablement
Add web-remote coverage for configuration and AI disablement, and clarify the serverless web requirement in the setting description. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* test: pin smoke session providers
Pre-seed extension-host smoke profiles before startup and update Agent Host picker labels so the suites exercise their intended providers after the default flip. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chat: restore agent host setting description
Keep the existing concise setting and policy description while retaining the runtime availability behavior. (Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* telemetry: report ResizeObserver delivery context
The browser's ResizeObserver loop ErrorEvent contains only a generic message; it does not expose the skipped target or causative callback. Prefixing that warning with the most recently invoked DisposableResizeObserver therefore turned callback order into false causal attribution.
Record the wrapped observers that ran in the current rendering frame instead. Context is scoped per window, deduplicated, sorted for stable bucketing, and bounded to the canonical smallest eight names plus an overflow marker. The telemetry prefix explicitly calls these recent wrapped observers rather than an offending consumer.
Clear context at the next animation frame, after Blink dispatches any loop warning from the current rendering update. Unit coverage locks deduplication, canonical overflow, window isolation, and frame cleanup; a real Chromium component fixture deliberately triggers a self-resize loop and verifies context survives until the native warning.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: aacd276e-cf84-48bd-a2ab-6f6a4d4c3431
* telemetry: shorten ResizeObserver context prefix
ResizeObserverLoopContext already identifies the observer names as non-causal context, so remove the redundant
ecentWrappedObservers= label from the emitted error string.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: aacd276e-cf84-48bd-a2ab-6f6a4d4c3431
---------
Copilot-Session: aacd276e-cf84-48bd-a2ab-6f6a4d4c3431
Chat telemetry reported a large volume of "ResizeObserver loop completed
with undelivered notifications" warnings attributed to
ChatInputPart.containerHeight. That attribution is misleading: the loop
error is dispatched by Chromium after the observation phase, so the
DisposableResizeObserver name recorded is simply whichever observer
fired last, not the one that caused the loop.
The actual cause is in ChatListItemRenderer. Row templates observed
their rowContainer for the entire template lifetime, but the chat list
is virtualized and recycles rows. When an observation phase disconnects
an observed target, its notification can never be delivered, and the
browser raises the loop error.
Bind the row observation to mount state using the existing
connection-observer element: observe on connect, clear on disconnect.
This is synchronous with mount, so it needs no frame deferral.
Also stop ChatViewPane's stacked-sessions input-height autorun from
re-entering inputPart.layout(). It now uses a targeted path that
updates the height budget and lays out only list-side surfaces.
Adds a component-explorer harness with fully mocked model traffic and a
Playwright regression covering four host-layout scenarios, plus a unit
test locking the targeted layout dispatch order.
Refs #316501
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: aacd276e-cf84-48bd-a2ab-6f6a4d4c3431
* Automations: Cap empty-state button width
Keep the empty-state CTA aligned with its explanatory copy and add CI-blocking dark/light fixture coverage for wide layouts.
Fixes#327772
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a856258f-4dcf-43c5-a1dd-e0704c440a2c
* Automations: Update blocks-ci screenshot hashes
Record the CI-generated dark and light hashes for the new Automations empty-state fixture.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a856258f-4dcf-43c5-a1dd-e0704c440a2c
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: a856258f-4dcf-43c5-a1dd-e0704c440a2c
* Default editor and panel chat to Agent Host Copilot when the agent host is enabled
Builds on the chat.editor.preferCopilotHarness behavior to make Agent Host
Copilot the computed default chat provider for both editor and panel chat
whenever the agent host is enabled, so first-time users land on Copilot instead
of Local. chat.editor.preferCopilotHarness stays scoped to the one-time
Local -> Copilot migration only.
- Thread an agentHostEnabled flag (from IAgentHostEnablementService) through the
default-session-type resolution and its callers.
- Keep Local visible and selectable; honor explicit and remembered selections.
- New Local Chat opens a local session directly: it cancels the in-flight
default-provider resolution (which would otherwise block on agent host
activation) so the local request wins immediately.
- Open a Local chat first in all chat participant API tests, since chat
participants are a Local-harness feature.
- Add a smoketest.openLocalChat command for Local panel smoke scenarios; the
sandbox reopen path reveals the existing local session to avoid a focus race.
- Register an IAgentHostEnablementService stub in the component fixtures.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chat: honor resolved session type when starting a new chat
Fixes the New Chat drop bug (review comment #2 on #326086): when the
agent host is enabled the computed default is a non-local harness, so the
editor clear path recomputed that default and dropped explicit or
preserved local requests.
- clearChatSessionPreservingType now branches on the resolved session
type for the sidebar (non-local -> loadSession, local ->
startNewLocalSession) so a generic New Chat from a Local panel
preserves Local, consistent with contributed panels.
- The resolved type is threaded through IChatWidget.clear ->
viewOptions.clear -> chatEditor.clear -> clearChatEditor so the editor
opens a session of that type instead of recomputing the default. This
restores explicit "New Local Chat" from a non-local editor.
- clearChatEditor applies an explicit target type directly and keeps its
swap-aware default only for direct (untargeted) calls.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chat: cancel the previous applyModel resolution before replacing it
Assigning a new CancellationTokenSource to the MutableDisposable only
disposes the previous source, and disposing a CancellationTokenSource
does not cancel it. So a re-entrant applyModel() (view render, switch
session) left the prior in-flight resolution running, racing to call
showModel with a stale result. Cancel the previous source explicitly
before replacing it.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Refactor model picker
* Some linters and formatters
* Cleanup some old tests
* Simplify model picker state and configuration
* format stuff
* Address model picker review feedback
* Update blocks-ci screenshot hashes
* Simplify model picker architecture terms
Restart the application after updating sandbox settings so
configuration changes are loaded before running the allowRead
and allowNetwork probes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* rehaul chat input padding and spacing and icons
* some more fixes on collapsing
* address comments, fix claude
* fix auto not having copilot icon
* fix component fixtures
* fix: implement getModelConfiguration in chat fixture model service mock
Co-authored-by: justschen <54879025+justschen@users.noreply.github.com>
* fix tests
* Expand panel chat model picker before driving inline config in smoke test
The chat model-picker rehaul added a width-driven compact layout that hides
the inline model-config button (and model-name text) when the panel is narrow.
The panel chat's auxiliary bar defaults below the collapse threshold, so the
Chat Model Configuration smoke test could not find the config button.
Widen the auxiliary bar via its leading sash until the picker leaves compact
mode before interacting with the inline config UI.
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: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: fix base-controller single-pane leak via Template Method hooks (R1)
Move the single-pane branches out of BaseLayoutController into
SinglePaneDesktopSessionLayoutController via three protected hooks
(_suppressEditorVisibilityDuringRestore, _shouldRevealEditorPartOnApply,
_shouldRevealEditorPartForEmptyWorkingSet). The base controller no longer
reads isSinglePaneLayoutEnabled.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: segregate docked-editor layout concerns into IDockedEditorLayout (R3)
Extract handleDockedEditorPartLayout and isEditorRevealedExplicitly into a
focused IDockedEditorLayout interface that IAgentWorkbenchLayoutService extends,
keeping the cross-cutting isSinglePaneLayoutEnabled and
suppressEditorPartAutoVisibility on the main contract. Fix stale typo comment.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: extract side-pane presentation Strategy from workbench (R2/R4)
Replace the 26 scattered _dockDetailPanel branches in workbench.ts with an
ISidePaneLayoutStrategy (GridSidePaneStrategy + DockedSidePaneStrategy),
selected once at initLayout. DockedSidePaneStrategy owns the docked width,
the DockedAuxiliaryBarController lifecycle, the reveal-sync, and a
DockedEditorSizeMemento for the docked size bookkeeping (R4). Workbench
implements ISidePaneLayoutHost and delegates geometry, grid-descriptor,
visibility-mutator, and reveal-sync work to the strategy. Behaviour is
unchanged in both layouts; the only remaining _dockDetailPanel reference is
the strategy selection point.
Rewrites workbench.test.ts to drive the real strategy through a host harness.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: replace side-pane Strategy with Workbench subclass (R5)
Convert the composition-based ISidePaneLayoutStrategy into inheritance,
matching the layout-controller Template Method pattern. The base Workbench
now carries the classic (grid) layout as protected _-prefixed hooks;
SinglePaneWorkbench overrides them for the docked detail-panel layout and
owns the docked width, DockedAuxiliaryBarController, reveal-sync, and
DockedEditorSizeMemento. A createSessionsWorkbench factory picks the subclass
from the setting at construction; web.main.ts and sessions.main.ts use it.
Removes sidePaneLayoutStrategy.ts and the ISidePaneLayoutHost callback
interface. No behaviour change in either layout.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: single-pane editor part owns the auxiliary bar (R6)
Make editor + auxiliary bar a single unit in the single-pane (new) layout by
having the editor part create and own the auxiliary bar instead of the
workbench/pane-composite service:
- New SinglePaneMainEditorPart extends MainEditorPart; lazily creates the
SinglePaneAuxiliaryBarPart via a getter and owns the DockedAuxiliaryBarController
(created in create(), calling setContentRightInset directly).
- EditorParts.createMainEditorPart() returns SinglePaneMainEditorPart when the
shared shouldUseSinglePaneLayout(config) predicate is true.
- AgenticPaneCompositePartService retrieves the same aux bar instance from the
editor part in single-pane; classic/mobile create it as before.
- SinglePaneWorkbench drops DockedAuxiliaryBarController ownership; keeps the
docked width (exposed via getDockedAuxiliaryBarWidth/setDockedAuxiliaryBarWidth
on IDockedEditorLayout) and reveal-sync, delegating layout to the editor part.
- workbenchFactory, EditorParts, and the pane-composite service all select via
the single shouldUseSinglePaneLayout predicate so the workbench, editor part,
and aux bar are always chosen together (fixes a phone-viewport + setting-on
mismatch that would pair SinglePaneWorkbench with a plain MainEditorPart).
Classic (default) and mobile layouts are unchanged.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: make isSinglePaneLayoutEnabled class-based, not a config read
Address review feedback: since the workbench subclass is selected at construction
(Workbench vs SinglePaneWorkbench), isSinglePaneLayoutEnabled is now a class-level
constant — false in the base, overridden to true in SinglePaneWorkbench — instead
of reading DOCK_DETAIL_PANEL_SETTING at runtime. Removes the _configurationServiceForLayout
field. This also aligns the flag with the phone-aware workbench selection, so it no
longer reports single-pane on a phone viewport where the classic workbench is used.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: single-pane editor-group header menus, docked aux bar, and header styling
- Make the full-width Changes header a group-level editor concept: the editor
part configures header menu ids via IEditorGroupViewOptions.headerMenuIds and
the editor opts in via IEditorPane.getHeaderActions(); EditorGroupView renders
the menus (no concrete menu points leak into core).
- Docked aux bar: top border connecting to the sash, and hide editor/aux when
their sash collapses them.
- Changes pill and file-diff open reveal the editor explicitly
(revealEditorPartExplicitly), and close the Files tab when a real file opens.
- Header styling: re-scope diff-stats/picker CSS via marker classes, restore
inter-action spacing, and shrink the right toolbar buttons to 24px.
- Fix setHeaderContent wiping freshly-rendered content on re-render; tie per-group
header listeners to group removal.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: reparent single-pane layout to a sibling controller with composed strategies
Make `SinglePaneLayoutController` a sibling of the classic desktop
`LayoutController` (both extend `BaseLayoutController`) instead of extending it,
so the desktop controller can be deprecated/deleted without affecting
single-pane. Its behaviour is composed from focused strategy objects under
`contrib/layout/browser/singlePane/`:
- Detail (aux bar) ownership split in two — `SinglePaneDetailVisibilityStrategy`
owns per-session shown/hidden memory (D1-D4); `SinglePaneDetailPanelStrategy`
owns container selection (Changes/Files), maximize, browser-hide, and the
nothing-to-show hide. Removed the overlapping `EmptyAuxCleanup` (D10) strategy
and desktop's redundant saved-container machinery.
- `SinglePaneManagedTabsStrategy` + `SinglePaneEditorAreaCollapseStrategy` share a
`SinglePaneDockedTabsCoordinator`; plus `SinglePaneResponsiveSidebarStrategy`
(Toggle Details), `SinglePaneNewSessionRulesStrategy` (R1), and
`SinglePaneQuickChatEditorHideStrategy`.
- Strategies coordinate through the controller via `ISinglePaneLayoutContext`.
- Fresh per-session storage keys (`sessions.singlePane.*`) so single-pane never
shares state with the classic controller.
Fix a chain of new-session-submit / Detail-only bugs (all verified in-app):
- New-session submit no longer reveals the docked editor or hides the just-opened
detail. `onDidReplaceSession` fires before the controller's later-registered
listener, so submit is detected intrinsically from the reactive transition
(`!previousIsCreated && isCreated`); D3c leaves the detail as-is when a session
has no saved state; the empty-editor-group hide is skipped during a layout
restore.
- Detail-only sessions no longer flicker the editor open on switch or reload: the
editor-part grid view (which hosts the docked aux bar) no longer maps its
visibility to `setEditorHidden`, the width-based reveal-sync bails while
editor-part auto-visibility is suppressed, and the persisted editor width uses
the node's real visibility so a reload restores the collapsed node width.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix component fixture screenshot CI
Add the missing workbench layout service mock needed by the changes view fixtures and update blocks-ci screenshot hashes to the expected CI output.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: fix cramped Changes actions bar in the single-pane editor header
The `ChangesActionsBar` marker (`.changes-actions-bar`) only carried a height
rule in the single-pane editor-group header; the classic
`.session-changes-editor-header-right` normalization does not reach that header,
so the primary split-button and the trailing secondary icon actions rendered
cramped together with no spacing or button chrome.
Add the container flex/gap layout and the secondary icon-button chrome (padding,
corner radius, secondary background/border + hover) keyed off `.changes-actions-bar`,
using design tokens, so it applies in the single-pane editor-group header while
staying idempotent for the classic internal changes-editor header (whose element
also carries `.session-changes-editor-header-right` with the same values).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: match classic Changes actions bar chrome in single-pane editor header
The single-pane editor-group header renders the Changes actions bar
(`.changes-actions-bar`) inside `.editor-group-header-secondary`, where the
high-specificity `editorgroupview.css` rules stretched the primary split-button
but gave the trailing secondary icon actions (Mark as Done, Run Code Review) no
inter-button gap and no button chrome, so they rendered flat and cramped against
the dropdown chevron.
Add, at matching specificity in `editorgroupview.css`, the container flex/gap and
the secondary icon-button chrome (padding, corner radius, secondary
background/border + hover) mirroring the classic `.chat-editing-session-actions`
actions bar. Drop the equivalent low-specificity rules from
`sessionChangesEditor.css`, which lost the cascade to the editor-group-header
selectors.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: fix single-pane Changes actions bar and move its styles out of core
In the single-pane editor-group header the Changes actions bar renders as a
toolbar action item inside a `.monaco-action-bar`, where the generic rule
`.monaco-action-bar .action-item .codicon { width: 16px; height: 16px }` clamped
every codicon — including the button elements themselves (which carry the
`codicon` class), squashing the secondary icon buttons and detaching the
split-button chevron.
- Un-clamp the codicons and lay out the bar (primary split-button grows, trailing
secondary icons stay natural size) scoped to `.monaco-action-bar
.action-item.changes-actions-bar`, so the classic internal changes-editor header
and the aux-bar Changes view are left untouched.
- Move all `.changes-actions-bar`-specific rules OUT of core
`editorgroupview.css` into the contributing component's
`sessionChangesEditor.css`; core keeps only the generic header/toolbar layout.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: draw the single-pane header divider under the editor header/tab bar
Move the single-pane detail-panel separator from the auxiliary bar's top border
to a bottom divider on the editor header (spanning the editor content and docked
detail), so the line runs the full header width. When the active editor has no
header toolbars (e.g. Files), the divider is drawn under the tab bar instead so a
separator is always present below the header row.
The docked auxiliary bar is absolutely positioned over the right of the editor
part with a solid background, so it would overlay the divider. Rather than fight
it with z-index, start the aux bar one divider-thickness below the header/tab bar
(new `DockedAuxiliaryBarController.DIVIDER` offset applied to the aux top/height
and the resize sash), so its background sits just beneath the line.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: update docked aux geometry tests for the header-divider offset
The docked auxiliary bar now starts one divider-thickness below the header/tab
bar (`DockedAuxiliaryBarController.DIVIDER`), so its top and height shift by 1px
(top 34->35, height 566->565). Update the two workbench geometry snapshot tests
to the new expected values. Fixes the CI unit-test failures on the PR.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Re-enables the 'Test Codex session' smoke test (skipped in #323867).
The native Codex binary ships as a per-platform *optional* dependency of the
`@openai/codex` launcher shim; npm silently ignores an optional dep that fails
to install, so a node_modules cache built during such a hiccup keeps the shim
(which makes Codex report as "available") but loses the binary — the session
then fails at spawn time and the test only times out after 5 minutes.
Add a from-source pre-check that fails fast with an actionable message when the
shim is present but the native binary is missing. No cache change is needed
here (main's lockfile has since rolled to a healthy cache); if it recurs,
bumping build/.cachesalt forces a fresh npm ci that reinstalls the binary.
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>
Move `requestfailed` (context + page) and console error/warning logging out
of the `--verbose` block in the Playwright browser driver so they are always
captured. Without this, a stalled or aborted module fetch during web workbench
bootstrap can prevent `.monaco-workbench` from rendering without producing a
page error, crash or HTTP error response, leaving the failure (a 20s timeout)
impossible to root cause from CI logs. The chatty lifecycle events stay gated
behind `--verbose`.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* smoke: fail fast with actionable error when Electron crashes during launch
The per-suite `before all` hook launches Electron via Playwright's
`_electron.launch`. This was called with `timeout: 0`, so when the
Electron process crashed during startup (e.g. a native SIGSEGV in the
Chromium browser-process/sandbox init path, which leaves a minidump),
the launch promise never resolved or rejected. It simply hung until
Mocha's 120s `before all` hook timeout fired, producing an opaque
"Timeout of 120000ms exceeded" with no hint that a native crash had
occurred.
Give the launch (and the first-window wait) a finite timeout well below
the Mocha hook timeout and wrap them so a failure is re-thrown as an
actionable error pointing at the crash-dump directory and Playwright
trace. This turns a 120s opaque hang into a faster, clearly-diagnosable
failure.
Co-authored-by: Copilot <223556219+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>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Remote smoke tests intermittently fail with "Cannot reconnect. Please reload
the window." The root cause is the remote server process exiting unexpectedly
shortly after a client connects; because the server logs nothing on the way out,
the client reconnects against a freshly spawned server with a new connection
token and hits "Unknown reconnection token (never seen)".
Add best-effort process exit diagnostics in server-main.ts that distinguish a
self-exit (beforeExit), an external kill (signal) and a crash
(uncaughtExceptionMonitor), and log the test resolver child's exit/close signal.
Gated behind the VSCODE_SERVER_EXIT_DIAGNOSTICS env var, which the remote smoke
launcher sets, so it adds no product noise.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>