Repository navigation
feat(web): mark PR files viewed with shift-click - #26349
Conversation
| extendRange ? lastViewedFileKey : null, | ||
| ); | ||
| setLastViewedFileKey(fileKey); | ||
| for (const file of range) setViewed(file.path, viewed); |
There was a problem hiding this comment.
🟠 High pullRequest/PullRequestCodeTab.tsx:708
Shift-clicking a range of more than 500 files queues every path, so the flush sends a setFilesViewed request that exceeds PullRequestSetFilesViewedInput’s 500-file limit; the viewed marks are not persisted even though the handler folds the files. Split queued paths into batches of at most 500 in filesViewedStore.ts, including paths queued by earlier presses.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/web/src/components/pullRequest/PullRequestCodeTab.tsx around line 708:
Shift-clicking a range of more than 500 files queues every path, so the flush sends a `setFilesViewed` request that exceeds `PullRequestSetFilesViewedInput`’s 500-file limit; the viewed marks are not persisted even though the handler folds the files. Split queued paths into batches of at most 500 in `filesViewedStore.ts`, including paths queued by earlier presses.
ApprovabilityVerdict: Would Approve Macroscope's review found this PR approvable — Adds Shift-click to mark an inclusive range of PR files viewed or unviewed and update their folding. The reported oversized-range persistence failure remains subject to the separate blocking correctness gate. Needs human approval because:
Adjust the Minimum Blocking Severity for this repo — including turning it Off — in Settings. You can add or adjust custom eligibility rules. Learn more. |
Merges upstream `pingdotgg/t3code` `fe219c4de1` (95 commits, base `49a9e80e0b`) into the fork. Branched from `main`; no open merge PR to stack on. ## Resolution 15 conflicts, each resolved by the verdict `preflight.mjs` printed for it. The full record is in `docs/fork/upstream-merge-log.md` (2026-10-29). The main points: - **`LegacySidebar.tsx` deleted upstream** (pingdotgg#21039). The deletion is taken. Its fork deltas (touch long-press, Add project gate) already live in `Sidebar.tsx` / `SidebarThreadRow.tsx`. The file's paths are removed from three inventory entries, and the helper only it used is dropped from `Sidebar.logic.ts`. - **Composer access mode.** Upstream's simpler composer (pingdotgg#25869) shows the Access control in three places: the Permissions chip, the compact-menu section, and the effort-menu section in `ComposerControlsBar.tsx`. All three are gated on `FEATURES.accessMode`. `ComposerControlsBar.tsx` is added to `chat-composer-gates`. - **Sidebar.** Upstream's boring-sidebar project folders are combined with the fork's browse/closed/subtask filter. Upstream moved the row's meta line into a `metaLine` variable, and the fork's owner name and parent/child task links now live inside it. - **Settings.** The boring-sidebar Labs rows are client settings and are not gated. Simlock hosts join the `serverBehaviorSettings` rows, and the `simlock-hosts` search id is mapped to that flag. The new Fallback model row is hidden together with the default model row (`defaultModelSetting`). - **`AGENTS.md`.** Upstream now has agents check user-visible changes in a real client without asking first. The fork's version says the same, still pointing at the fork's skills. - `agentContextBudget.json` uses upstream's numbers, plus the fork's 108 bytes for `ProjectScript.port`. The value `46015` was measured by running the budget test. - `pnpm-lock.yaml` was re-derived from upstream's copy. **Merge stats:** 595 files landed vs 593 in the upstream range (the gap is explained in the tracker entry). Fork delta: 766 files, unchanged. ## Verification `verify.mjs` was run in full. These checks pass: duplicate-adds, tripwires, resolution-check, unsupported-methods, lockfile, fmt, lint, typecheck, build. In the test step, `web` and `client-runtime` pass. The same failures as the 2026-10-27 and 2026-10-28 merges remain, each confirmed failing alone: - `t3`: `RepositoryIdentityResolver`, `GitVcsDriver`, `CodexChatGptAuth`, `CodexManagedRuntime` (the known `/tmp` sticky-bit gap) - `provider-opencode`: `OpenCodeServerLedger` ## Usable as-is - Boring sidebar project folders, two-line folder rows, and hiding empty projects (pingdotgg#21039, pingdotgg#26387, pingdotgg#26391, pingdotgg#26463) - Simpler composer with grouped controls and effort words (pingdotgg#25869). The access-mode parts stay gated. - Pending approvals on their timeline row (pingdotgg#26255); tool call diffs open in the diff panel (pingdotgg#26304); compaction row timer (3ef1610) - Many web fixes: chat tables, inline code double-click, numbered composer lists, image chips, scroll-to-end, tool groups after a usage-limit pause, long-thread timeline perf (pingdotgg#26727) - New Claude threads default to Opus 5.5 (pingdotgg#26358) - PR files: mark viewed with shift-click, and the diff follows the file tree (pingdotgg#26349, pingdotgg#26730). These are reachable only where the PR surface is (`pullRequestSurface`). ## Unsupported in Moatless / needs implementation - **GitHub sign-in through the T3 Code for GitHub app** (pingdotgg#26245): `sourceControl.signInStart`, `signInWait`, `signInCancel`, `appAccess`. New `UnsupportedMethodError` entries. - **Simlock device pools** (pingdotgg#25259, pingdotgg#26706): `device.simlockIdentity` (new union entry) and the `simlockDeviceHostsEnabled` server setting. Part of the device hub gap. - **Fallback model when the default provider is out of usage** (pingdotgg#26164): the `fallbackModelSelection` server setting cannot be saved, because `server.updateSettings` is refused. The row is hidden. - Managing GitHub maintainer edits (pingdotgg#25588): in the pull-request write family Moatless does not dispatch. - T3 Connect tunnel usage and T3 Chat account push (pingdotgg#26369, pingdotgg#25931): relay/cloud, decided out. - Mobile dynamic workflows in the Agents sheet (pingdotgg#18642) and the mobile app fixes: mobile against Moatless is unverified. ## Backend behavior to consider reproducing in Moatless These are listed under _Runtime fixes upstream made to its own server_ in `docs/fork/gaps.md`: - Falling back to another provider when the default is out of usage (pingdotgg#26164), and refreshing usage when a turn hits its limit (pingdotgg#26234); no replay of stale Codex usage limits (pingdotgg#26331) - Settling a thread at once when its watched PR merges (pingdotgg#26395). Moatless reads no PR for settlement today, so this is a decision rather than a fix. - Loading long thread history in bounded pages (pingdotgg#26240); publishing local git status before the remote lookup (pingdotgg#21046); releasing completed PR sweep data (pingdotgg#25177) - Thread links that outside MCP clients can open (pingdotgg#26642); listing snoozed threads across projects in one MCP call (pingdotgg#26442) - Provider approval and subagent fixes: Claude command approvals (pingdotgg#20145), ACP ID-only approvals (pingdotgg#26647), Cursor subagents (pingdotgg#26592), OpenCode subagent runtime mode (pingdotgg#26302), Codex shadow-home locks (c4606e5); shorter remote reconnect and command delays (pingdotgg#25754) ## After merging - Disable the new upstream workflow: `gh workflow disable mobile-fingerprint-label.yml --repo soaplabs/t3code` 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- Moatless task: https://moatless.soaplabstest.com/tasks/b2df0ac3-40ce-4c78-a67d-b561b3d8772d
Problem
Reviewers had to mark each changed file as viewed individually, making it slow to update review progress across a group of files.
Change
Shift-clicking a file’s Viewed checkbox now applies its viewed state to the range between it and the last clicked file, in displayed order. This also supports marking a range unviewed and keeps file folding consistent. The shared web and desktop PR panel use this behavior.
Scope and approval
This is a focused improvement to the existing PR file viewed controls. It adds range selection without changing the review workflow.
Verification
The focused range logic tests pass (6 tests total), as do lint and the web package typecheck.
check:changedcould not complete because the worktree’s.envhas a symlink loop. Browser verification was not run.