Skip to content

fix(web): browse pull requests across remote servers - #6108

Closed
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pull-requests-remote-projects
Closed

fix(web): browse pull requests across remote servers#6108
StiensWout wants to merge 1 commit into
pingdotgg:mainfrom
StiensWout:t3code/fix-pull-requests-remote-projects

Conversation

@StiensWout

@StiensWout StiensWout commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Problem

The Pull Requests page was permanently scoped to the primary environment, so projects and pull requests from connected remote T3 Code servers never appeared.

Fix

  • add a Server selector above the existing Project selector, including All servers
  • keep the menu open after choosing a server so the project can be selected next
  • aggregate list results, pagination, stats, and viewer identity without losing each pull request's owning environment
  • route linked pull requests, right-panel details, refreshes, and project actions to the correct server
  • show the page when any connected server advertises pull-request support

Verification

  • vp lint on the changed web files
  • vp run --filter @t3tools/web typecheck
  • vp run --filter @t3tools/web build
  • focused unit coverage added for server/project selection, cross-server list merging and pagination, viewer grouping, row/stat identity, and right-panel tabs

The local Vitest runner currently fails before collecting tests with the same runner/config error on both changed and untouched baseline tests. Static checks and the production build pass. Authenticated before/after UI evidence will be added to this draft.

Generated with GPT-5.6 Codex in T3 Code.

Note

Support browsing pull requests across multiple remote servers

  • Adds multi-environment pull request listing by introducing pullRequestsAcrossEnvironments atoms that aggregate per-environment list and stats results, with environment-scoped cursor keys to avoid cross-server collisions.
  • Extends the pull requests route to accept environmentId and selectedEnvironmentId URL params, enabling users to scope the list to a single server or browse all connected servers.
  • Updates PullRequestFiltersMenu to include a 'Server' radio group for picking an environment independently of the project filter; project scope values are now JSON-encoded [environmentId, projectId] strings (previously plain project IDs).
  • Adds environmentId to pullRequestEntryKey, diff stat keys, and right panel surface IDs so identical repository/PR numbers on different servers don't collide.
  • Updates the sidebar footer to show the pull requests link if any connected environment supports pull requests, not just the primary.
  • Behavioral Change: the project filter sentinel value changed from 'all' to 'all-projects'; stored URLs or state relying on the old value will not match.
📊 Macroscope summarized 97598ea. 9 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted

🗂️ Filtered Issues

No issues evaluated.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 89d231cf-ae17-47c1-88ac-37790007f9f7

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL 500-999 changed lines (additions + deletions). labels Aug 11, 2026
...previous,
projectCount: previous.projectCount + provider.projectCount,
searchesOnHost: previous.searchesOnHost && provider.searchesOnHost,
configured: previous.configured && provider.configured,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium state/pullRequests.ts:132

mergeProviders merges same-host providers with configured: previous.configured && provider.configured, so if one environment has github.com configured but another does not, the combined summary reports configured: false. The host menu then marks the entire host unavailable even though pull requests from the configured environment are readable, preventing selection of that host in the All servers view. Consider using || so the merged host is available when at least one environment can read it.

Suggested change
configured: previous.configured && provider.configured,
configured: previous.configured || provider.configured,
🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/web/src/state/pullRequests.ts around line 132:

`mergeProviders` merges same-host providers with `configured: previous.configured && provider.configured`, so if one environment has `github.com` configured but another does not, the combined summary reports `configured: false`. The host menu then marks the entire host unavailable even though pull requests from the configured environment are readable, preventing selection of that host in the All servers view. Consider using `||` so the merged host is available when at least one environment can read it.

: {
...previous,
projectCount: previous.projectCount + provider.projectCount,
searchesOnHost: previous.searchesOnHost && provider.searchesOnHost,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High state/pullRequests.ts:131

mergeProviders merges same-host providers from multiple environments using searchesOnHost: previous.searchesOnHost && provider.searchesOnHost, so when two servers share a host and only one supports server-side search, the merged host is treated as not searchable. The UI then falls back to local filtering of displayed fields and discards valid matches that the capable server returned from PR bodies, reviews, or commit messages — fields not present in the local row. Consider preserving searchesOnHost as previous.searchesOnHost || provider.searchesOnHost so the aggregate host is searchable when any contributing environment is.

Suggested change
searchesOnHost: previous.searchesOnHost && provider.searchesOnHost,
searchesOnHost: previous.searchesOnHost || provider.searchesOnHost,
🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/web/src/state/pullRequests.ts around line 131:

`mergeProviders` merges same-host providers from multiple environments using `searchesOnHost: previous.searchesOnHost && provider.searchesOnHost`, so when two servers share a host and only one supports server-side search, the merged host is treated as not searchable. The UI then falls back to local filtering of displayed fields and discards valid matches that the capable server returned from PR bodies, reviews, or commit messages — fields not present in the local row. Consider preserving `searchesOnHost` as `previous.searchesOnHost || provider.searchesOnHost` so the aggregate host is searchable when any contributing environment is.

const multiEnvironmentList = Atom.family((key: string) => {
const { environmentIds, input } = JSON.parse(key) as MultiEnvironmentListKey;
const atoms = environmentIds.flatMap((environmentId) => {
const cursors = pullRequestCursorsForEnvironment(environmentId, input.cursors);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 High state/pullRequests.ts:186

multiEnvironmentList skips any environment that has no scoped cursor whenever a continuation is requested. When one server returns a cursor while another returns truncated: true with no cursor (the contract's signal to increase limit), Load More sends the first server's cursor and line 189 drops the cursor-less server entirely — so its remaining pull requests can never be loaded while any cursor-bearing server still has pages. On line 189, pullRequestCursorsForEnvironment returns undefined both for environments absent from the continuation and for environments that need limit-based pagination, and the if treats both as "skip." Consider distinguishing the two cases so cursor-less-but-truncated environments are still queried (without a cursor) rather than excluded.

🤖 Copy this AI Prompt to have your agent fix this:
In file @apps/web/src/state/pullRequests.ts around line 186:

`multiEnvironmentList` skips any environment that has no scoped cursor whenever a continuation is requested. When one server returns a cursor while another returns `truncated: true` with no cursor (the contract's signal to increase `limit`), Load More sends the first server's cursor and line 189 drops the cursor-less server entirely — so its remaining pull requests can never be loaded while any cursor-bearing server still has pages. On line 189, `pullRequestCursorsForEnvironment` returns `undefined` both for environments absent from the continuation and for environments that need limit-based pagination, and the `if` treats both as "skip." Consider distinguishing the two cases so cursor-less-but-truncated environments are still queried (without a cursor) rather than excluded.

Bil0000 added a commit to Bil0000/t3code that referenced this pull request Aug 11, 2026
Bil0000 added a commit to Bil0000/t3code that referenced this pull request Aug 11, 2026
@StiensWout StiensWout closed this Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL 500-999 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant