Skip to content

Merge upstream#3

Open
SimplyRin wants to merge 1481 commits into
SimplyRin:development-linux-peachfrom
desktop:development
Open

Merge upstream#3
SimplyRin wants to merge 1481 commits into
SimplyRin:development-linux-peachfrom
desktop:development

Conversation

@SimplyRin

Copy link
Copy Markdown
Owner

Closes #[issue number]

Description

Screenshots

Release notes

Notes:

niik and others added 30 commits May 28, 2026 13:14
…failed

Because there's already an existing stash at that point
Instead of making the no-newline icon keyboard focusable (which would
violate WCAG 4.1.2 by making a non-interactive element tabbable), show
the text 'No newline at end of file' next to the icon. This makes the
information accessible to both screen readers and sighted users without
requiring keyboard focus or hover.

The text is styled in italic with a subdued color (--diff-alt-text-color)
to differentiate it from diff content.

refs: github/accessibility-audits#15980

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use local changes overwritten dialog restoring stash
Show 'No newline at end of file' as visible text in diff
Resolve conflict in copilot-store.ts by keeping the streaming
event-listener approach (send + on()) over the simpler sendAndWait
call that was added to development.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Resolve conflicts in copilot-store.ts (add cleanup() call),
copilot-conflicts-loading-dialog.tsx (combine titleId/Stop button
from #22080 with AriaLive announcements from this branch), and
_copilot-conflicts-loading.scss (add stop button styles, keep
font-weight-semibold).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
react-virtualized 9.22.6 introduced automatic role="gridcell" injection
on cells that don't have an explicit role prop (upstream PR #1624). Since
our ListRow components were not passed an explicit role prop in listbox
mode, the injected "gridcell" role overrode the intended "option" role,
producing an invalid ARIA tree (listbox > gridcell) that NVDA cannot
navigate.

Fix by always passing the correct role explicitly to ListRow so that
react-virtualized's defaultCellRangeRenderer skips the injection.

Fixes #22219, fixes #22203

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
react-virtualized 9.22.6 introduced automatic role="gridcell" injection
on cells that don't have an explicit role prop (upstream PR #1624). Since
our ListRow components were not passed an explicit role prop in listbox
mode, the injected "gridcell" role overrode the intended "option" role,
producing an invalid ARIA tree (listbox > gridcell) that NVDA cannot
navigate.

Fix by always passing the correct role explicitly to ListRow so that
react-virtualized's defaultCellRangeRenderer skips the injection.

Fixes #22219, fixes #22203

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Extract `buildDefaultMenuTemplate` from `buildDefaultMenu` so the
  template can be tested without the Electron runtime
- Add a test that builds the menu template for all 128 combinations of
  label-affecting boolean parameters and asserts no submenu contains
  duplicate Windows access keys
- Fix the existing duplicate: change `&Worktrees list` (key 'w') to
  `Wor&ktrees list` (key 'k') to resolve the clash with
  `Sho&w stashed changes` (key 'w') in the View submenu
…-aria-role-injectio

Fix accessibility regression from react-virtualized 9.22.6 upgrade
…licts-loading-polis

Polish Copilot conflicts loading interstitial
…ry-gaps

Resolve with Copilot: account gating, disclaimer, error surfacing, and aria-live announcements
Adds a 'Conflict Resolution' model picker to the Copilot preferences tab,
mirroring the existing commit-message-generation picker, and wires the
selected model into the conflict-resolution engine (which previously
hardcoded gpt-5-mini/medium).

- Extend CopilotFeature with 'conflict-resolution'
- Thread a CopilotModelRequest through resolveConflicts -> resolveChunk
- Resolve the stored selection in AppStore._resolveConflictsWithCopilot
- Render the picker gated behind enableCopilotConflictResolution()

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

Adversarial review (Opus/Sonnet/GPT) flagged that resolveSessionModelConfig
forced reasoningEffort: 'medium' onto selected models and dropped BYOK
timeoutMs, diverging from the commit-message path.

- Add getSupportedReasoningEffort() to clamp the preferred effort to one the
  model supports (or undefined when unsupported), instead of blindly sending
  'medium'.
- BYOK requests now pass reasoningEffort/timeoutMs through unchanged (undefined
  stays undefined), matching generateCommitMessage.
- Thread timeoutMs into resolveChunk so per-provider BYOK timeouts are honored;
  falls back to the previous 600s default otherwise.
- Remove redundant conflict-resolution picker description in preferences.
- Add unit tests for getSupportedReasoningEffort.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The loading dialog header hardcoded "GPT-5 mini · Medium" regardless of
the user's conflict-resolution model selection. Derive the label from the
selected model so it reflects the model (and reasoning effort) the engine
will actually use.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add enableCopilotSdkCommitMessageGeneration to the conflict-resolution
eligibility predicate so the Copilot SDK remote kill-switch also disables
conflict resolution.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Deduplicate resolveTimer/totalTimer .done() calls that were repeated in
the try and catch so each timing is recorded exactly once on all paths.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Gate trimOverflowingMessages() on displayedMessages actually changing so
the dialog doesn't read scrollHeight/clientHeight on every unrelated state
update (e.g. incoming reasoning snippets).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Derive elapsedSeconds from a mount timestamp via Date.now() instead of
incrementing per tick, so message rotation stays accurate when interval
timers are throttled (e.g. while the app is backgrounded). Clamp to the
previous value to stay monotonic across backwards clock adjustments.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pressing "Stop" in the Copilot conflicts loading dialog previously only
navigated the UI back to the conflicts list while the underlying SDK turn
kept running to completion in the background. This wires up genuine
cancellation via net-new AbortController/AbortSignal plumbing.

- Store an AbortController on the multi-commit-operation state and expose
  it via a new dispatcher.abortCopilotConflictResolution ->
  _abortCopilotConflictResolution path that the Stop button now fires.
- Thread the AbortSignal from _resolveConflictsWithCopilot through
  copilotStore.resolveConflicts into resolveChunk.
- Extract the per-attempt streaming promise into an exported, testable
  runConflictResolutionTurn helper that subscribes to the signal, rejects
  with a CopilotConflictResolutionAbortError on abort, and destroys the
  session exactly once in its own finally so an in-flight turn is torn
  down immediately.
- Guard the multi-chunk batch loop so no new batches start once aborted.
- Distinguish user aborts from real errors (signal.aborted + the sentinel
  error) so cancellation isn't logged or surfaced as a failure, and use an
  object-identity guard so a stale run can't clobber a newer run's state.
- Add unit tests covering mid-turn abort teardown, pre-aborted signal,
  normal completion, and reasoning streaming.

Note: moving session.destroy() into runConflictResolutionTurn slightly
overlaps the B4 session! refactor handled in another session.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Render every model the same way in the conflict-resolution loading
dialog. Some Copilot models embed the reasoning level in their name
(e.g. "Claude Opus 4.7 (High reasoning)(Internal only)"); strip just the
redundant reasoning parenthetical so the effort isn't duplicated, while
keeping other markers like "(Internal only)". Results in labels such as
"Claude Opus 4.7 (Internal only) · High" and "GPT-5 mini · Medium".

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Simplify getSupportedReasoningEffort to delegate to getLowestReasoningEffort
- Rename resolveSessionModelConfig to resolveConflictModelConfig and drop the
  unused defaultReasoningEffort param (hardcodes the conflict default)
- Remove an unreachable null guard in renderFeatureModelPicker; pass the
  narrowed copilotModels array directly
- Inline cleanModelName in conflict-resolution-model display helper

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Show BYOK model names verbatim instead of running cleanModelName on them
  (user-provided names shouldn't have parentheticals stripped)
- Consolidate three copies of formatReasoningEffort into copilot-store and
  drop the cross-dialog import from the conflict loading dialog
- Name the resolved model config shape (IResolvedConflictModelConfig) instead
  of duplicating the inline type literal

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
tidy-dev and others added 30 commits June 23, 2026 09:36
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Bump app version to 3.6.0 and flip feature-flag defaults: Copilot conflict resolution and worktree support are now enabled by default (changed to always-true functions). Update changelog to list 3.6.0 release notes and reorder entries accordingly.
The enableCopilotConflictResolution feature flag was changed to always
return true, which means the conflict resolution model picker is now
always rendered alongside the commit message generation picker. This
caused several test failures due to ambiguous element queries.

Changes:
- Use getAllByRole/getAllByText where both pickers match the same query
- Scope model selection click to within the popover dropdown to avoid
  matching the second picker's button text
- Remove the withConflictResolutionEnabled test helper since the flag
  is no longer toggleable
- Replace 'is hidden when flag is disabled' test with 'renders both
  pickers' since conflict resolution is always on
- Simplify remaining conflict resolution tests by removing unnecessary
  env var wrappers

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

Bump dompurify from 3.4.0 to 3.4.11 in /app
fix(license-overrides.ts): add missing linuxmusl copilot platform
Replace awaited calls to this.stopClient(client) with direct calls in several code paths. The stopClient call appears synchronous (or no longer returns a Promise), so remove unnecessary await to avoid awaiting non-Promise values and keep control flow consistent. Affects three locations in copilot-store.ts where the client is stopped in finally/cleanup logic.
Remove async/await from stopClient and call client.stop() without awaiting, attaching a .catch() to log errors. Keeps shutdown from blocking on stop and centralizes error logging.
Hard code copilot picker popover heights for now
The hardcoded default 'gpt-5-mini' model is no longer available for
Copilot Free and Student plan users, causing 400 errors during commit
message generation and conflict resolution. The 'auto' model uses
server-side routing and works across all plan tiers.

Closes #22380

Hide multiplier label for the Auto model in model picker

The Auto model routes requests to different underlying models with varying
credit multipliers, so displaying a single '(1x)' label is misleading.
Skip the billing label for the default model (now 'auto') and show it
simply as 'Auto (default)'.

Also updates DefaultCopilotModel from 'gpt-5-mini' to 'auto' and the
fallback display name to 'Auto' to match the upstream SDK change.

Co-Authored-By: Copilot <223556219+Copilot@users.noreply.github.com>
Update the copilot-sdk dependency to 1.0.3 and simplify the build
script's copyCopilotDependency function. The @github/copilot package
now ships platform-specific optional dependencies (e.g.
@github/copilot-darwin-arm64) that already contain only the binaries
for the target platform, making the cross-platform pruning logic and
mxc-bin cleanup unnecessary.

Update build.ts

Co-Authored-By: Copilot <223556219+Copilot@users.noreply.github.com>
- Set Auto as the default Copilot model for conflict resolution
- Remove unnecessary parentheses around type annotations and nullish coalescing expressions for TypeScript compliance
- Add cross-compilation support to CI environment setup
- Fix trailing newline in test file

Update build.ts

Co-Authored-By: Copilot <223556219+Copilot@users.noreply.github.com>
Let GraphQL know we can support the Copilot max SKU
Add beta2 changelog entry for Max plan fix

Update `3.6.1-beta2` release notes to include a fix ensuring Copilot Max plan users are recognized correctly (#22400).
Bump actions still running Node < 24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants