-
Notifications
You must be signed in to change notification settings - Fork 2k
feat: bring desktop Studio UI and local playback to web #2312
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
Open
richiemcilroy
wants to merge
183
commits into
main
Choose a base branch
from
feature/web-editor-desktop-parity
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
+78,604
−2,264
Open
Changes from all commits
Commits
Show all changes
183 commits
Select commit
Hold shift + click to select a range
748bac3
feat: bring desktop editor to web
richiemcilroy a6e1dd5
fix: isolate editor worker from standalone media server
richiemcilroy b13e7f3
fix: reclaim unattached web editor sessions
richiemcilroy aece09d
chore: pin editor worker build inputs
richiemcilroy f6ec320
fix: align GPUI icon inventory with caption controls
richiemcilroy c067e9a
fix: normalize web recorder warning quotes
richiemcilroy 86ec71f
fix: gate macOS-only memory pressure variants
richiemcilroy fac71b4
improve: show desktop editor while web sessions prepare
richiemcilroy 2943fc6
fix: verify staged editor assets before reuse
richiemcilroy 489510d
fix: require HTTPS for remote editor workers
richiemcilroy c6dcac6
fix: restore image overlays in web editor
richiemcilroy 1787aba
test: verify web image overlays in browsers
richiemcilroy 5a641d3
fix: restore self-host MinIO image pulls
richiemcilroy 3a6cae2
fix: pin self-host MinIO image digests
richiemcilroy f7e39b5
fix: format extension shortcut script
richiemcilroy bc148b4
improve: match desktop editor error state on web
richiemcilroy 39dafcb
fix: keep editor preparation visible during slow startup
richiemcilroy 6d41f66
fix: keep web editor recovery actions usable
richiemcilroy c6ad26b
fix: use browser-valid preview socket close code
richiemcilroy 640dab0
fix: clarify web recording bundle action
richiemcilroy 1f9a917
docs: explain separate webcam capture in web
richiemcilroy 36a536c
fix: align paired recordings to start calls
richiemcilroy 45820dc
fix: keep background editor exports alive
richiemcilroy 8359544
fix: retain active and completed editor exports
richiemcilroy 408cd52
fix: isolate extension tab-capture test gesture
richiemcilroy 7c500d7
fix: authenticate the native web editor renderer
richiemcilroy ec42b7a
fix: keep native H.264 benchmark authenticated
richiemcilroy 5c04675
fix: recover non-caption edits after plan downgrade
richiemcilroy 6397e5e
fix: bound web recorder backup memory
richiemcilroy 18eaba9
fix: preserve overflow during recorder spool recovery
richiemcilroy 79544ca
improve: stream extension webcam uploads during recording
richiemcilroy 0b6984b
fix: keep paired extension recovery complete
richiemcilroy f2f7a5f
fix: limit web caption languages to supported codes
richiemcilroy 4f3ea7b
fix: restore web editor crop frame and context menus
richiemcilroy b4203d8
feat: capture separate audio tracks for web recordings
richiemcilroy 05b4dbc
fix: render web editor preview without offscreen canvas
richiemcilroy 7e542f1
test: replay web editor recording folder import
richiemcilroy 6b3d1b8
test: run editor import replay in CI
richiemcilroy 6b77660
fix: pin recording reliability checkout action
richiemcilroy a7a9ceb
test: replay paired web recorder capture in Chromium
richiemcilroy 5245e89
fix: recover paired web captures when camera storage fails
richiemcilroy 6f3630c
test: expose paired browser harness initialization failures
richiemcilroy 6c16272
test: run native WebKit capture replay on macOS
richiemcilroy ce4d56e
test: report paired WebKit terminal state on timeout
richiemcilroy 74e60fe
test: exercise WebKit capture in headed macOS CI
richiemcilroy 701e22a
test: probe native WebKit capture on macOS 15
richiemcilroy 9f71b9c
test: replay longer native WebKit paired capture
richiemcilroy 3b9d572
test: probe WebKit media on Intel macOS runner
richiemcilroy 391bb91
fix: verify editor image identity before redirect
richiemcilroy d7e32b4
test: cover editor image identity at HTTP boundary
richiemcilroy d43ae7d
feat: preserve tab input in web editor
richiemcilroy 0f1e3d8
fix: make tab input metadata safe and optional
richiemcilroy 9f58e31
fix: bound web editor previews to the timeline
richiemcilroy d3408e6
fix: stabilize low-bandwidth web editor preview
richiemcilroy 4880d6e
test: verify cursor-only web editor MOV export
richiemcilroy 6112de5
fix: isolate editor subprocess credentials and source identity
richiemcilroy 2460afc
improve: start web editor H.264 without redundant previews
richiemcilroy 78461dc
fix: restore web editor preview quality after network changes
richiemcilroy 42be7d9
fix: stop web editor clip capture after closing
richiemcilroy 41d821c
fix: refresh web editor captions after plan changes
richiemcilroy 331b4f5
fix: gate existing web captions after plan downgrade
richiemcilroy 6c6bdff
fix: preserve paid captions during web plan transitions
richiemcilroy 68ec604
fix: wait for editor capacity before failing
richiemcilroy 95d2efe
fix: use secure recorder session ids
richiemcilroy c70ba68
fix: confine native editor projects to worker root
richiemcilroy 15c991e
fix: verify native editor root after canonicalization
richiemcilroy 16ee330
fix: use validated native editor path outside request state
richiemcilroy d5332ed
fix: capture tab input events on HTTP pages
richiemcilroy 830936c
test: verify Chrome extension paired capture in PR CI
richiemcilroy f75117e
test: replay web editor reupload through native export
richiemcilroy 0bd5362
test: gate web editor reupload through native worker CI
richiemcilroy 8e560f7
test: stress and diagnose WebKit Reupload autosaves
richiemcilroy 50d42df
test: align Free caption save replay with production API
richiemcilroy 3d4761b
fix: omit private tab pointer events from sidecar
richiemcilroy 29a01bd
docs: rename editor worker guide to kebab-case
richiemcilroy 1cf35fa
fix: omit custom private tab controls from pointer sidecar
richiemcilroy 828b1e5
fix: keep web editor Studio Sound defaults across recordings
richiemcilroy 82c387b
fix: accept partial web Studio Sound preferences
richiemcilroy 7dd5498
fix: expose worker fonts in web editor
richiemcilroy b2bdc2f
fix: refresh web editor caption access for live Pro changes
richiemcilroy ee5c71f
fix: close web caption editing when Pro access ends
richiemcilroy bc92dbd
test: cover live web caption revocation with transcript open
richiemcilroy c7c5680
fix: finish paired recorder uploads after control errors
richiemcilroy 34af945
fix: preserve paired uploads when backup cleanup stalls
richiemcilroy 8470b89
fix: hide uploaded backups from extension recovery
richiemcilroy 0bb337c
fix: run extension recovery UI in CI
richiemcilroy 32e7ad6
improve: avoid repeated web caption hashing during edits
richiemcilroy 07336ef
fix: complete web cursor MOV downloads in WebKit
richiemcilroy ff04d71
refactor: use kebab-case studio sound modules
richiemcilroy 9a6a065
improve: diagnose cursor MOV browser downloads
richiemcilroy 6fa8052
fix: force MOV downloads in WebKit
richiemcilroy 92e742e
improve: test legacy canvas preview in editor worker CI
richiemcilroy e58337e
fix: preserve web editor preset backgrounds across recordings
richiemcilroy 6660577
fix: allow web editor export retry after cancel
richiemcilroy 6ba4505
fix: bound web editor export cleanup before retry
richiemcilroy 620bc01
test: stabilize paired-capture browser replay
richiemcilroy 2d5546f
fix: release web editor worker on preparation failure
richiemcilroy 7fe065f
feat: render web Studio preview on browser GPU
richiemcilroy b89291f
fix: keep bundle session alive and build web Studio assets
richiemcilroy 03c6a40
test: verify local Studio compositor in three browsers
richiemcilroy 104e0ef
test: report Firefox compositor initialization failure
richiemcilroy c21d64a
fix: render shared Studio shader on WebGPU
richiemcilroy 94391a5
fix: wait for decoded dimensions and validate GPU fallbacks
richiemcilroy defe202
test: trace Firefox pooled video dimensions
richiemcilroy 9158840
fix: keep Firefox decoder on the first video frame
richiemcilroy 58e3717
fix: stabilize browser Studio replay and bundle access
richiemcilroy 9f9f972
fix: synchronize local Studio playback and entitlement-bound export
richiemcilroy 2949b33
fix: trace Safari WebGL startup and validate canvas fallback
richiemcilroy 52d11e8
fix: lease web export sessions across concurrent operations
richiemcilroy 93cf533
test: inspect WebGL extension state on Intel WebKit
richiemcilroy 2344219
feat: reuse native animated gradients in browser playback
richiemcilroy 6615777
fix: reconcile extension capture after a lost start response
richiemcilroy c87dacb
test: exercise larger browser clips and diagnose fallback redraw
richiemcilroy 1a87115
fix: align browser Studio playback to decoded video
richiemcilroy 15d33b4
test: serve external replay clips with their media types
richiemcilroy 0487d1c
test: guard browser Studio frame parity at 8x
richiemcilroy 2ac3f14
test: verify Studio frame parity on headless GPUs
richiemcilroy 37e9177
test: inspect visible WebGPU Studio frames on macOS
richiemcilroy 0f0a816
fix: finish microphone sidecars after backup failure
richiemcilroy 4ca71f7
test: verify browser Studio pixels on GPU-limited runners
richiemcilroy 0bc9527
fix: keep streamed paired recordings after backup overflow
richiemcilroy 84fb2fc
test: enforce live paired replay and baseline H264
richiemcilroy cebe2ad
fix: wait for Blink high-speed seeks and test Intel WebGL fallback
richiemcilroy 0ce5862
fix: present browser WebGPU editor with its preferred surface format
richiemcilroy 881892e
test: diagnose WebGPU canvas presentation on Intel Chrome
richiemcilroy 38d5f10
fix: select visible WebGL2 compositor on software GPUs
richiemcilroy 88969c1
test: allow software GPU replay time to advance
richiemcilroy 4296ea7
feat: render imported image backgrounds in browser Studio
richiemcilroy d73a900
fix: complete invalid browser folder selection before alerting
richiemcilroy d68768c
test: verify healthy WebGPU and failed-probe fallback
richiemcilroy 164597a
fix: match native JPEG orientation in browser preview
richiemcilroy f0dd2cd
fix: match native image decode in browser editor
richiemcilroy 1529857
test: serve browser replay worker assets over HTTP
richiemcilroy 3e5e100
chore: exclude generated image WASM bindings from Biome
richiemcilroy 1718e00
feat: share native background blur with browser preview
richiemcilroy 3aa5c08
test: isolate blur regression from software playback timing
richiemcilroy 3e81b14
test: stream paired replay media for realistic startup timing
richiemcilroy 2932808
test: compare paired Studio preview with native renderer
richiemcilroy 6fb448c
fix: align saved Studio previews and end frames
richiemcilroy e1e2f06
fix: render browser-only Studio exports on demand
richiemcilroy 63d080a
test: capture WebKit Studio preview differences
richiemcilroy f0189d1
fix: render browser crop locally and cancel stale worker estimates
richiemcilroy f1f35f7
improve: speed web Studio export estimates and browser replays
richiemcilroy b9f2763
fix: install Xvfb auth for headed Studio replays
richiemcilroy 6ecf6cf
fix: keep browser editor video decoded in view
richiemcilroy 0c485d0
fix: recover browser preview after sustained load
richiemcilroy 21f0d96
fix: retain browser editor frames on WebGL canvases
richiemcilroy 064db78
fix: compare whole visible browser editor frame
richiemcilroy b7112e8
fix: refresh web caption plan from parent page focus
richiemcilroy 0c227c5
fix: refresh Studio caption access from web host
richiemcilroy 8e2d9c5
fix: preserve Studio caption refresh across overlapping requests
richiemcilroy c5e148e
test: report browser Studio replay stalls
richiemcilroy b82bf06
fix: use newest successful caption plan for Studio
richiemcilroy c249dac
test: profile Studio socket closes and WebGL frame costs
richiemcilroy bca2018
fix: wait for paused Studio video presentation
richiemcilroy 31663e9
test: exercise local Studio plan refresh and decode pacing
richiemcilroy ace3f98
fix: isolate worker downloads from Studio navigation
richiemcilroy 2b0a5b0
improve: keep browser videos playing between preview frames
richiemcilroy 2e2a526
fix: bound browser preview frame drift
richiemcilroy d4912b0
fix: draw decoded preview before media startup completes
richiemcilroy 484f053
fix: preserve paired Safari camera and audio captures
richiemcilroy e593a57
fix: snapshot retained browser GPU frames
richiemcilroy c65dca2
improve: decode browser Studio frames without repeated seeks
richiemcilroy 8787965
improve: stream local Studio decoding and align Firefox color
richiemcilroy d6ff28e
fix: align Firefox WebCodecs color with worker frames
richiemcilroy 5c6a06d
test: verify WebCodecs color and scaled blur preview
richiemcilroy 5e0bdcd
test: read Firefox color path from editor iframe
richiemcilroy 59d2197
feat: share image overlays and stabilize browser playback
richiemcilroy be0063a
chore: regenerate browser editor WASM bindings
richiemcilroy d931655
test: accept relative image paths in worker UI replay
richiemcilroy 7496864
fix: skip Windows base comparison for new source files
richiemcilroy 84e528c
fix: fetch Windows PR base before comparison
richiemcilroy 4b7e461
chore: align Studio frame controls and replay literals
richiemcilroy 2cbade2
fix: wait for presented Safari frames during Studio playback
richiemcilroy 3be8a73
test: align browser Studio recovery and fixture quotes
richiemcilroy 5331edf
test: give indexed compositor replay time on Intel macOS
richiemcilroy 589d1ca
fix: fall back from slow browser video decoding
richiemcilroy 61e5110
fix: adapt playback to slow software decoding
richiemcilroy c74fae8
fix: preserve accurate decoding on software GPUs
richiemcilroy a34f21e
feat: restrict web Studio pilot to Richie and verify Instant capture
richiemcilroy 5896798
Merge main into web Studio pilot
richiemcilroy 2069290
fix: allow existing editor sessions to close after pilot changes
richiemcilroy 94ac24d
fix: identify editor worker Docker cache mounts
richiemcilroy File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,164 @@ | ||
| name: Docker Build Editor Worker | ||
|
|
||
| on: | ||
| pull_request: | ||
| paths: | ||
| - "apps/media-server/**" | ||
| - "apps/web/lib/editor-caption-access.ts" | ||
| - "apps/web/lib/editor-caption-transport.ts" | ||
| - "apps/web/lib/editor-recording-title.ts" | ||
| - "apps/desktop/src/assets/music/**" | ||
| - "apps/desktop/src-tauri/assets/backgrounds/**" | ||
| - "crates/**" | ||
| - "packages/editor-cap-bundle/**" | ||
| - "packages/editor-solid-web/**" | ||
| - "vendor/**" | ||
| - "Cargo.toml" | ||
| - "Cargo.lock" | ||
| - "package.json" | ||
| - "bun.lock" | ||
| - "bunfig.toml" | ||
| - ".github/workflows/docker-build-editor-worker.yml" | ||
| push: | ||
| branches: | ||
| - main | ||
| paths: | ||
| - "apps/media-server/**" | ||
| - "apps/web/lib/editor-caption-access.ts" | ||
| - "apps/web/lib/editor-caption-transport.ts" | ||
| - "apps/web/lib/editor-recording-title.ts" | ||
| - "apps/desktop/src/assets/music/**" | ||
| - "apps/desktop/src-tauri/assets/backgrounds/**" | ||
| - "crates/**" | ||
| - "packages/editor-cap-bundle/**" | ||
| - "packages/editor-solid-web/**" | ||
| - "vendor/**" | ||
| - "Cargo.toml" | ||
| - "Cargo.lock" | ||
| - "package.json" | ||
| - "bun.lock" | ||
| - "bunfig.toml" | ||
| - ".github/workflows/docker-build-editor-worker.yml" | ||
|
|
||
| permissions: {} | ||
|
|
||
| jobs: | ||
| build: | ||
| name: Build and test editor worker (${{ matrix.platform }}) | ||
| runs-on: ${{ matrix.runner }} | ||
| timeout-minutes: 30 | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| include: | ||
| - platform: amd64 | ||
| runner: ubuntu-24.04 | ||
| - platform: arm64 | ||
| runner: ubuntu-24.04-arm | ||
| permissions: | ||
| contents: read | ||
| steps: | ||
| - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 | ||
| with: | ||
| persist-credentials: false | ||
| - name: Set up Docker Buildx v3.12.0 | ||
| uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f | ||
| - name: Build editor worker image with Docker v6.19.2 | ||
| uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 | ||
| with: | ||
| context: . | ||
| file: apps/media-server/Dockerfile.editor | ||
| platforms: linux/${{ matrix.platform }} | ||
| load: true | ||
| tags: cap-editor-worker:verification | ||
| cache-from: type=gha,scope=editor-worker-${{ matrix.platform }} | ||
| cache-to: type=gha,mode=max,scope=editor-worker-${{ matrix.platform }} | ||
| - name: Check native worker readiness | ||
| run: | | ||
| docker run --rm --network none \ | ||
| -e CAP_WEB_EDITOR_PUBLIC_ORIGIN=http://127.0.0.1:3457 \ | ||
| -e MEDIA_SERVER_WEBHOOK_SECRET=test \ | ||
| --entrypoint bun cap-editor-worker:verification \ | ||
| -e 'import app from "./src/editor-worker-app.ts"; const response = await app.request("/health"); if (!response.ok) process.exit(1)' | ||
| - name: Exercise paired native editor routes | ||
| run: | | ||
| docker run --rm --network none --cpus 4 --memory 4g \ | ||
| -e MEDIA_SERVER_WEBHOOK_SECRET=test \ | ||
| --entrypoint bun cap-editor-worker:verification test \ | ||
| src/__tests__/editor-worker-app.test.ts \ | ||
| src/__tests__/lib/editor-assets.test.ts \ | ||
| src/__tests__/lib/editor-clip-thumbnails.test.ts \ | ||
| src/__tests__/lib/editor-config-paths.test.ts \ | ||
| src/__tests__/lib/editor-image-assets.test.ts \ | ||
| src/__tests__/lib/editor-security.test.ts \ | ||
| src/__tests__/lib/editor-wallpapers.test.ts \ | ||
| src/__tests__/routes/editor-clips.test.ts \ | ||
| src/__tests__/routes/editor.test.ts | ||
| - name: Verify editor subprocess credential isolation | ||
| run: | | ||
| docker run --rm --network none \ | ||
| -e MEDIA_SERVER_WEBHOOK_SECRET=test \ | ||
| -e AWS_SECRET_ACCESS_KEY=test \ | ||
| --entrypoint bun cap-editor-worker:verification \ | ||
| src/__tests__/lib/editor-process-env-replay.ts | ||
| - name: Verify cursor-only MOV export | ||
| run: | | ||
| docker run --rm --network none --cpus 4 --memory 4g \ | ||
| --entrypoint bun cap-editor-worker:verification \ | ||
| src/__tests__/routes/editor-cursor-mov-replay.ts | ||
| - name: Replay browser-only Studio and worker exports | ||
| if: matrix.platform == 'amd64' | ||
| run: | | ||
| docker run --rm --cpus 4 --memory 8g --ipc host \ | ||
| -v "${{ github.workspace }}:/source" \ | ||
| -w /source/apps/media-server \ | ||
| cap-editor-worker:verification \ | ||
| bash -e -u -o pipefail -c ' | ||
| cd /source | ||
| bun install --frozen-lockfile | ||
| bunx playwright install --with-deps chromium webkit firefox | ||
| apt-get install -y --no-install-recommends xauth | ||
| bun run --filter @cap/editor-solid-web build | ||
| cd /source/apps/media-server | ||
| export CAP_EDITOR_UI_PARITY_ARTIFACT_DIR=/source/cap-editor-parity-artifacts | ||
| run_browser_only_studio() { | ||
| case "$CAP_EDITOR_UI_BROWSER" in | ||
| firefox|webkit) CAP_EDITOR_UI_HEADED=1 xvfb-run -a bun src/__tests__/routes/editor-solid-browser-only-replay.ts ;; | ||
| *) bun src/__tests__/routes/editor-solid-browser-only-replay.ts ;; | ||
| esac | ||
| } | ||
| run_worker_studio() { | ||
| case "$CAP_EDITOR_UI_BROWSER" in | ||
| firefox|webkit) CAP_EDITOR_UI_HEADED=1 xvfb-run -a bun run test:native-editor-ui ;; | ||
| *) bun run test:native-editor-ui ;; | ||
| esac | ||
| } | ||
| browser_replay_failed=0 | ||
| for browser in chromium firefox webkit; do | ||
| if ! CAP_EDITOR_UI_PARITY_ARTIFACT_DIR=/source/cap-editor-parity-artifacts CAP_EDITOR_UI_BROWSER="$browser" run_browser_only_studio; then | ||
| browser_replay_failed=1 | ||
| fi | ||
| done | ||
| for browser in chromium webkit firefox; do | ||
| for pro in 0 1; do | ||
| CAP_EDITOR_UI_SHARE_REPLAY=1 CAP_EDITOR_UI_BROWSER="$browser" CAP_EDITOR_UI_PRO_CAPTIONS="$pro" run_worker_studio | ||
| done | ||
| done | ||
| for repeat in 2 3; do | ||
| printf "WebKit Free replay %s\n" "$repeat" | ||
| CAP_EDITOR_UI_SHARE_REPLAY=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio | ||
| done | ||
| CAP_EDITOR_UI_CURSOR_MOV=1 CAP_EDITOR_UI_BROWSER=chromium CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio | ||
| CAP_EDITOR_UI_CURSOR_MOV=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=1 run_worker_studio | ||
| CAP_EDITOR_UI_CANVAS_FALLBACK=1 CAP_EDITOR_UI_BROWSER=chromium CAP_EDITOR_UI_PRO_CAPTIONS=0 run_worker_studio | ||
| CAP_EDITOR_UI_CANVAS_FALLBACK=1 CAP_EDITOR_UI_BROWSER=webkit CAP_EDITOR_UI_PRO_CAPTIONS=1 run_worker_studio | ||
| bun src/__tests__/routes/editor-presets-browser-replay.ts | ||
| if [ "$browser_replay_failed" -ne 0 ]; then exit 1; fi | ||
| ' | ||
| - name: Upload Studio parity diagnostics | ||
| if: failure() && matrix.platform == 'amd64' | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: web-studio-parity-diagnostics | ||
| path: cap-editor-parity-artifacts | ||
| if-no-files-found: ignore | ||
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.