-
Notifications
You must be signed in to change notification settings - Fork 6.6k
feat(desktop): add cross-platform window capture #8103
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
+31,651
−362
Merged
Changes from 12 commits
Commits
Show all changes
261 commits
Select commit
Hold shift + click to select a range
68fb035
fix(desktop): use native macOS window capture
Bil0000 4f2126e
fix(desktop): avoid helper screen permission check
Bil0000 0cb4597
fix(desktop): sign macOS development bundle
Bil0000 5eb661a
fix(web): align capture preview thumbnail
Bil0000 1fc523a
fix(desktop): request capture permission when enabled
Bil0000 c8fda84
feat(web): add capture sound preview
Bil0000 eccd2b8
fix(desktop): preserve capture failure context
Bil0000 2b392b2
fix(desktop): harden macOS development launcher
Bil0000 0bf5376
fix(web): decode window captures without fetch
Bil0000 bf0f5bd
feat(desktop): include accessible text in window captures
Bil0000 17565d7
fix(desktop): safely scope window capture text
Bil0000 051cd9b
fix(desktop): harden window capture boundaries
Bil0000 2c9e7e3
fix(desktop): tighten window text boundaries
Bil0000 6c537da
fix(desktop): allow manual window capture
Bil0000 661cffb
fix(server): preserve window capture paths
Bil0000 8586d74
fix(web): align window capture controls
Bil0000 53d2137
fix(desktop): bound window blur wait
Bil0000 5e58008
refactor(desktop): inject window capture storage
Bil0000 4376023
feat(desktop): refine window capture experience
Bil0000 5258d27
fix(web): keep window capture cards compact
Bil0000 cce59d0
fix(web): align capture card labels
Bil0000 397ad44
fix(desktop): report shift listener failures
Bil0000 6bd350a
fix(desktop): serialize window capture settings
Bil0000 109dc0e
fix(web): hide capture details before preview loads
Bil0000 69b4c03
fix(web): refine window capture labels
Bil0000 89a4bf9
fix(web): size sent capture previews correctly
Bil0000 c4ac056
fix(desktop): improve window capture feedback
Bil0000 97cb434
fix(web): simplify window capture settings
Bil0000 5ec8102
fix(desktop): open main window with capture enabled
Bil0000 bd988b3
fix(desktop): contain Shift shortcut callback failures
Bil0000 e613058
fix(desktop): serialize capture accessibility reads
Bil0000 322e803
fix(desktop): bound native capture resources
Bil0000 b3c42b8
fix(web): align capture settings and cards
Bil0000 81f3479
fix(web): use canonical capture gradient
Bil0000 c77c800
fix(desktop): use Wayland-safe flash display
Bil0000 8cedf22
fix(desktop): isolate global Shift listener
Bil0000 097e0b6
chore: merge main into window capture
Bil0000 e4193f1
fix(desktop): keep Shift capture outside Electron
Bil0000 d507a14
fix(web): announce current capture shortcut
Bil0000 7886ca2
fix(desktop): prevent window capture flash crashes
Bil0000 5e199d8
fix(desktop): support Shift shortcut double tap
Bil0000 9a4c545
fix(web): preserve stashed capture metadata
Bil0000 01d9a23
fix(desktop): require matching Shift double taps
Bil0000 e48e14a
fix(desktop): stop window capture crash on macOS
Bil0000 1e6d02e
fix(desktop): sharpen window capture app icons
Bil0000 bc980b6
fix(web): show attachment remove button on card hover
Bil0000 be83c63
fix(web): polish window capture controls
Bil0000 b1ff847
fix(desktop): check Wayland capture shortcut conflicts
Bil0000 ce3f10b
feat: accept any modifier pair as window capture shortcut
Bil0000 2d9f2ba
fix(desktop): keep valid client settings when one field fails to decode
Bil0000 ee456b4
fix(desktop): trigger capture pairs only by holding both keys
Bil0000 5ab2b65
fix(desktop): stop capture shortcut helpers outliving their kill
Bil0000 3c0af50
fix(desktop): keep the dev bundle signature stable across restarts
Bil0000 362bd64
fix(desktop): trigger macOS capture pairs without permissions
Bil0000 c9dbfde
feat(desktop): attach app name and text to Wayland portal captures
Bil0000 5e8f9d2
feat(web): show window capture key caps
Bil0000 bbd910a
fix(web): separate shortcut key caps
Bil0000 9510d0e
test(desktop): match salvaged settings warning
Bil0000 84e3cb5
fix(web): keep sound action beside setting title
Bil0000 0419846
fix(web): recheck capture shortcut conflicts
Bil0000 96044e1
fix(web): serialize client settings writes
Bil0000 ebc1fbc
fix(web): detect physical shortcut aliases
Bil0000 ede80b8
fix(desktop): verify live Wayland sockets
Bil0000 6b911b4
fix(desktop): suppress capture while recording shortcuts
Bil0000 567ea76
fix(web): animate new captures only once
Bil0000 4470b0d
fix(web): validate capture settings before saving
Bil0000 63d3afe
test(web): include capture shortcut suppression
Bil0000 beb2158
refactor(desktop): simplify window capture internals
Bil0000 28e0a2c
feat(web): use a camera shutter capture sound
Bil0000 c2b52e8
test(desktop): gate Wayland socket test by procfs
Bil0000 c0c020a
fix(web): hide inactive capture shortcut reset
Bil0000 2ed33f1
fix(web): resume capture sound context
Bil0000 f58ef17
test(desktop): use host platform service
Bil0000 c0d0a22
Merge branch 'main' into feat/window-capture
Bil0000 4074541
fix(web): preserve capture app name casing
Bil0000 8212f97
Merge branch 'main' into feat/window-capture
Bil0000 79036c4
chore: merge main into window capture
Bil0000 4006880
test(contracts): narrow window capture attachment
Bil0000 602914a
refactor: simplify window capture implementation
Bil0000 0b16844
Merge remote-tracking branch 'origin/main' into HEAD
Bil0000 6433aa7
docs: clarify oversized capture recovery
Bil0000 f5153b6
fix(web): focus composer after window capture
Bil0000 1065463
fix(web): keep window captures on active thread
Bil0000 1894e80
fix(desktop): smooth window capture handoff
SunkenInTime afb0e2d
fix(desktop): simplify window capture handoff
Bil0000 f54f912
fix(desktop): keep animation failures non-fatal
Bil0000 92adb2c
fix(desktop): soften capture animation flash
Bil0000 eb50bad
Merge pull request #11 from Bil0000/fix/window-capture-handoff
Bil0000 0829129
fix(web): keep active capture animations registered
Bil0000 221a244
refactor: remove window capture comments
Bil0000 ffd57c0
fix(window-capture): address review feedback
Bil0000 1b2cf15
fix(web): normalize shortcuts by physical key
Bil0000 e230174
fix(web): isolate shortcut recording requests
Bil0000 b9f69eb
fix(desktop): restore capture motion and sound
Bil0000 83d3313
feat(web): choose window capture sound
Bil0000 dfafc92
fix(web): polish capture sound picker
Bil0000 61e4783
fix(desktop): separate capture IPC authorization error
Bil0000 c11a3ad
fix(web): discard rejected window captures
Bil0000 aa118db
chore(web): clean up capture sound settings
Bil0000 098f583
fix(desktop): ignore capture animation failures
Bil0000 438a0c1
fix(web): make capture sound picker responsive
Bil0000 9241ed6
fix(desktop): avoid Windows capture stalls
SunkenInTime fcfd45b
fix(desktop): capture macOS windows directly
SunkenInTime 01ef8db
Merge pull request #13 from SunkenInTime/t3code/window-capture-native…
Bil0000 ec4c72b
fix(desktop): stabilize native window capture
Bil0000 5d65260
fix(desktop): complete capture animation handoff
Bil0000 9787d49
fix(web): harden window capture settings
Bil0000 773b92d
fix(desktop): keep capture animation on its display
Bil0000 297e448
fix(desktop): smooth cross-display capture motion
Bil0000 293c41d
fix(desktop): stabilize cross-display capture handoff
Bil0000 7d8ef3f
fix(desktop): align window capture handoff
SunkenInTime 77b0dca
Merge pull request #14 from SunkenInTime/fix/window-capture-landing-p…
Bil0000 ef5321a
chore: merge main into window capture
Bil0000 32d0cb2
chore: merge latest main into window capture
Bil0000 c950af7
fix(web): use window capture sound effect 16
SunkenInTime e23f287
Merge pull request #15 from SunkenInTime/fix/window-capture-sound-eff…
Bil0000 6c9dbb8
fix(web): preserve Latin layout shortcut keys
Bil0000 ca26d05
fix(web): keep image remove actions visible
Bil0000 0132edf
fix(web): scroll window captures horizontally
SunkenInTime b9965e2
style(web): polish window capture scrollbar
SunkenInTime e19573f
Merge pull request #16 from SunkenInTime/fix/window-capture-carousel
Bil0000 bf35851
Merge branch 'main' into feat/window-capture
Bil0000 7dc9d5c
style(web): keep capture scrollbar styles local
Bil0000 471cddd
chore(desktop): explain window capture diagnostics
Bil0000 3a44d40
fix(web): keep sound test action with controls
Bil0000 d4a299e
style(web): use window icon for capture settings
Bil0000 b15c023
style(web): refine window capture icon
Bil0000 b37e023
chore: retry CI
Bil0000 d4084bb
feat(web): replace window capture sounds
Bil0000 a527fcb
fix(web): keep capture frame styles in sync
Bil0000 c42c489
fix(desktop): repair window capture setup
Bil0000 f4bbd6d
fix(desktop): refine window capture settings
Bil0000 078ac19
fix(desktop): harden window capture delivery
Bil0000 f418ab9
Merge branch 'main' into feat/window-capture
Bil0000 306873a
chore(deps): bump Electron to 44.1.0
StiensWout 29367ee
fix(desktop): enable Wayland shortcut portal
juliusmarminge 93df0a8
fix(desktop): package Electron 44 native modules
juliusmarminge b10babb
fix(desktop): defer Wayland shortcut registration
juliusmarminge acb61b3
fix(desktop): enable preferred Wayland shortcut portal
juliusmarminge f29fec6
fix(desktop): set Linux portal identity before startup
juliusmarminge bb6d19e
fix(desktop): prepare launcher entry before portal registration
juliusmarminge 2b079c2
feat(desktop): add native Linux window capture
juliusmarminge 856c3df
fix(web): raise window capture whoosh volume
Bil0000 95415f8
fix(web): make capture sound preview accessible
Bil0000 293e4bc
fix(desktop): improve capture accessibility reliability
Bil0000 8e38308
feat(web): show capture accessibility details
Bil0000 2a22d39
fix(web): gate capture onboarding by platform
Bil0000 6c2dc7d
fix(web): add portable capture arrival feedback
Bil0000 3d59087
fix(web): stabilize capture sound selector width
Bil0000 9d75750
fix(web): reveal newly captured attachments
Bil0000 1f7a409
fix(desktop): isolate capture accessibility crashes
Bil0000 027ff76
fix(web): restore compact capture sound control
Bil0000 3d1caab
test(desktop): cover structured capture accessibility
Bil0000 c410aab
fix(desktop): keep capture warning in effect context
Bil0000 117d7f4
fix(web): put sound previews inside menu
Bil0000 33237f2
fix(web): resolve capture UI feedback
Bil0000 1a8d89f
fix(web): tighten capture sound menu
Bil0000 75ee116
fix(desktop): handle clipboard write failures
Bil0000 bb2b2ca
fix(web): keep capture sound rows unbroken
Bil0000 b35ba2a
feat(web): swap expanded capture between image and text
Bil0000 6529fe8
fix(web): mark the default sound on the trigger
Bil0000 4cbc6bb
fix(web): close the sound menu on select
Bil0000 5682faf
fix(web): resolve capture accessibility feedback
Bil0000 35c8afe
fix(desktop): keep the capture flight alive across displays
Bil0000 869f95e
fix(web): reveal the capture attachment before the overlay closes
Bil0000 ebae566
fix(web): keep capture detail hover on dark surface
Bil0000 e1d7698
chore: merge latest main into window capture
Bil0000 b8a7e7a
fix(web): keep capture dialog controls on dark surface
Bil0000 07e3201
fix(web): keep capture details clear during uploads
Bil0000 ffd24c1
chore: merge latest main into window capture
Bil0000 94f8a22
chore: merge latest main into window capture
Bil0000 bc971cf
feat(window-capture): refine accessibility data
juliusmarminge 337796f
feat(desktop): finish Wayland capture setup and native integrations
juliusmarminge 9a96dc0
fix(desktop): match Windows accessibility windows on scaled displays
Bil0000 c81194d
fix(web): route hidden capture search results
Bil0000 9a7e685
chore: merge latest main into window capture
Bil0000 1465ab2
fix(desktop): preserve window capture setup errors
Bil0000 8851158
fix(web): align Niri capture instructions
Bil0000 e2704b4
fix(desktop): derive capture setup messages
Bil0000 f34570a
test(desktop): resolve GNOME fixtures from test files
Bil0000 f3e314e
fix(web): match window capture shortcut caps
Bil0000 08aefe6
fix(desktop): avoid window capture accessibility timeout
SunkenInTime 7b79017
chore(desktop): remove window capture lookup comments
SunkenInTime afe3a69
Merge pull request #17 from SunkenInTime/fix/window-capture-foregroun…
Bil0000 2fad302
feat(desktop): add Hyprland capture and guided shortcut setup
juliusmarminge bd8f89e
fix(desktop): smooth Windows window capture handoff
juliusmarminge 12d7f97
fix(desktop): capture T3 in place from global shortcuts
juliusmarminge eb1b108
fix(desktop): keep capture responsive during accessibility reads
juliusmarminge 0c1a3b0
fix(desktop): ignore rapid window capture shortcut repeats
juliusmarminge fba626a
fix(web): keep approved capture shortcuts in keycaps
juliusmarminge 27f0504
fix(desktop): polish capture shortcut settings
juliusmarminge 594d182
chore: merge latest main into window capture
Bil0000 65eb607
fix(scripts): allow Node glob matcher in packaging test
Bil0000 fe7270d
fix(desktop): require Windows foreground activation
SunkenInTime 6186ab0
perf(desktop): speed up Windows capture reveal
SunkenInTime 98c223a
Merge remote-tracking branch 'origin/main' into t3code/pr-8103/feat/w…
juliusmarminge b708313
fix(web): keep the shared unavailable settings group in integrations
juliusmarminge a50f8d3
Merge pull request #18 from SunkenInTime/fix/windows-capture-foreground
Bil0000 2e5d166
fix(desktop): reveal over Windows shell apps
SunkenInTime 80d0cb2
fix(desktop): stabilize shell-hosted capture handoff
SunkenInTime b3b2264
Merge pull request #19 from SunkenInTime/fix/windows-capture-foreground
Bil0000 e506e16
fix(desktop): use native Windows capture metadata
SunkenInTime e43f0fb
chore: merge main into window capture
juliusmarminge 8665437
fix(desktop): keep Windows native package metadata archived
juliusmarminge 5188bde
chore: merge main into window capture
juliusmarminge 341f636
fix(desktop): read Windows window icons without enumerating sources
SunkenInTime 5ee3459
fix(desktop): extract 256px Windows app icons from the executable
SunkenInTime 7fb622c
Merge pull request #20 from SunkenInTime/t3code/fix-window-capture-na…
Bil0000 637b358
chore: merge latest main into window capture
Bil0000 2ccaf64
feat(desktop): per-permission macOS snapshot setup and rename to Snap…
Bil0000 12047ab
fix(web): put the macOS snapshot access title and hint on one line
Bil0000 3a697d1
fix(web): style macOS permission tiles like System Settings and merge…
Bil0000 f47a477
fix(web): draw macOS permission icons after System Settings and resto…
Bil0000 65f34bf
fix(desktop): recover from revoked macOS snapshot permissions and hid…
Bil0000 0399c3a
chore: spell the product name SnapShots
Bil0000 6ec2d4b
refactor: rename window capture identifiers, files, and assets to Sna…
Bil0000 3aeb799
feat(web): skip SnapShot setup on Windows
Bil0000 4591c5d
fix(web): match snapshot permission icons to macOS
Bil0000 a63bfd8
chore: merge main into window capture
Bil0000 cbfd64c
fix: align capture tests with current main
Bil0000 eb4d7b0
fix(desktop): accept Unicode spacing in capture config
Bil0000 b4f2caa
fix(web): check only the active capture helper
Bil0000 71d12dd
test(desktop): stabilize Linux capture fixtures
Bil0000 81a70aa
test(server): verify captured data stays inside its warning
Bil0000 e36b532
fix(desktop): close the Windows focus worker with its scope
Bil0000 0e6bfa1
fix(desktop): retain window focus lookup fallback
Bil0000 4f88100
fix(desktop): allow cold accessibility helper startup
Bil0000 e16e1da
fix(desktop): bound native region capture waits
Bil0000 994d8c8
docs: clarify capture permissions and helper commands
Bil0000 dad30c0
chore: merge main into window capture
Bil0000 51ebb60
style: align merged files with CI formatter
Bil0000 c37718e
fix(desktop): register capture entry points with knip
Bil0000 b9622d4
Merge branch 'main' into feat/window-capture
Bil0000 92272d2
chore: merge latest main into snapshot capture
Bil0000 5632fe4
Merge remote-tracking branch 'origin/main' into t3code/pr-8103/feat/w…
juliusmarminge 7308a71
chore(contracts): stop exporting snapshot defaults only used in setti…
juliusmarminge ae6cc08
fix(desktop): preserve snapshot delivery and image coordinates
juliusmarminge fadcd12
fix(desktop): bound native snapshot labels and keep window context wi…
juliusmarminge aafd0d1
feat(desktop): drop the command palette snapshot action
juliusmarminge 7bc2113
perf(desktop): keep snapshot dependencies off the startup path
juliusmarminge c4000a3
perf(desktop): load Windows foreground helpers only for capture reveals
juliusmarminge 8dd75a3
ci: cache the Linux capture helpers and test the new crates
juliusmarminge 5e0bb76
docs: cut the SnapShots guides to what a reader needs
juliusmarminge bfb2e42
refactor(desktop): send capture lifecycle events on one typed channel
juliusmarminge e4c5de0
fix(desktop): connect to abstract-socket session buses without usocket
juliusmarminge 7520bc9
refactor(desktop): replace get-windows and uiohook-napi, isolate xa11y
juliusmarminge 20680c2
chore(deps): drop usocket from dbus-next entirely
juliusmarminge 45949d0
Merge remote-tracking branch 'origin/main' into t3code/pr-8103/feat/w…
juliusmarminge 7a63f20
chore(desktop): keep file-local snapshot helpers unexported
juliusmarminge 07c887d
fix(desktop): resume macOS snapshot setup and preserve accessibility …
juliusmarminge File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
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
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
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
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
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
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
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
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
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| import { | ||
| DesktopPendingWindowCapture, | ||
| DesktopWindowCapture as DesktopWindowCaptureSchema, | ||
| DesktopWindowCaptureId, | ||
| DesktopWindowCaptureState, | ||
| } from "@t3tools/contracts"; | ||
| import * as Effect from "effect/Effect"; | ||
| import * as Schema from "effect/Schema"; | ||
|
|
||
| import * as DesktopWindowCapture from "../../windowCapture/DesktopWindowCapture.ts"; | ||
| import * as IpcChannels from "../channels.ts"; | ||
| import * as DesktopIpc from "../DesktopIpc.ts"; | ||
|
|
||
| export const getWindowCaptureState = DesktopIpc.makeIpcMethod({ | ||
| channel: IpcChannels.GET_WINDOW_CAPTURE_STATE_CHANNEL, | ||
| payload: Schema.Void, | ||
| result: DesktopWindowCaptureState, | ||
| handler: Effect.fn("desktop.ipc.windowCapture.getState")(function* () { | ||
| return yield* (yield* DesktopWindowCapture.DesktopWindowCapture).state; | ||
| }), | ||
| }); | ||
|
|
||
| export const captureWindow = DesktopIpc.makeIpcMethod({ | ||
| channel: IpcChannels.CAPTURE_WINDOW_CHANNEL, | ||
| payload: Schema.Void, | ||
| result: Schema.Void, | ||
| handler: Effect.fn("desktop.ipc.windowCapture.capture")(function* () { | ||
| yield* (yield* DesktopWindowCapture.DesktopWindowCapture).capture; | ||
| }), | ||
| }); | ||
|
|
||
| export const listPendingWindowCaptures = DesktopIpc.makeIpcMethod({ | ||
| channel: IpcChannels.LIST_PENDING_WINDOW_CAPTURES_CHANNEL, | ||
| payload: Schema.Void, | ||
| result: Schema.Array(DesktopPendingWindowCapture), | ||
| handler: Effect.fn("desktop.ipc.windowCapture.listPending")(function* () { | ||
| return yield* (yield* DesktopWindowCapture.DesktopWindowCapture).listPending; | ||
| }), | ||
| }); | ||
|
|
||
| export const readWindowCapture = DesktopIpc.makeIpcMethod({ | ||
| channel: IpcChannels.READ_WINDOW_CAPTURE_CHANNEL, | ||
| payload: DesktopWindowCaptureId, | ||
| result: DesktopWindowCaptureSchema, | ||
| handler: Effect.fn("desktop.ipc.windowCapture.read")(function* (id) { | ||
| return yield* (yield* DesktopWindowCapture.DesktopWindowCapture).read(id); | ||
| }), | ||
| }); | ||
|
|
||
| export const acknowledgeWindowCapture = DesktopIpc.makeIpcMethod({ | ||
| channel: IpcChannels.ACKNOWLEDGE_WINDOW_CAPTURE_CHANNEL, | ||
| payload: DesktopWindowCaptureId, | ||
| result: Schema.Void, | ||
| handler: Effect.fn("desktop.ipc.windowCapture.acknowledge")(function* (id) { | ||
| yield* (yield* DesktopWindowCapture.DesktopWindowCapture).acknowledge(id); | ||
| }), | ||
| }); |
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
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
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
Oops, something went wrong.
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.