Merge upstream#3
Open
SimplyRin wants to merge 1481 commits into
Open
Conversation
…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
Worktree support
Release 3.5.12-beta2
Add worktree usage analytics
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>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
Release 3.5.13-beta4
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
Release 3.6.0
Trigger PR triage on ready_for_review
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>
Release 3.6.1-beta1
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).
Release 3.6.1-beta2
Bump actions still running Node < 24
Release 3.6.1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #[issue number]
Description
Screenshots
Release notes
Notes: