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

@StiensWoutStiensWout 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

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-actionsgithub-actionsBot 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.

🟡 Mediumstate/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.

🟠 Highstate/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.

🟠 Highstate/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

@StiensWoutStiensWout 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

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-actionsgithub-actionsBot 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.

🟡 Mediumstate/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.

🟠 Highstate/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.

🟠 Highstate/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@StiensWoutStiensWout 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

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-actionsgithub-actionsBot 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.

🟡 Mediumstate/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.

🟠 Highstate/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.

🟠 Highstate/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@StiensWoutStiensWout 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

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-actionsgithub-actionsBot 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.

🟡 Mediumstate/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.

🟠 Highstate/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.

🟠 Highstate/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

@StiensWoutStiensWout 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

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-actionsgithub-actionsBot 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.

🟡 Mediumstate/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.

🟠 Highstate/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.

🟠 Highstate/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@StiensWoutStiensWout 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

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-actionsgithub-actionsBot 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.

🟡 Mediumstate/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.

🟠 Highstate/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.

🟠 Highstate/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

@StiensWoutStiensWout 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

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-actionsgithub-actionsBot 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.

🟡 Mediumstate/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.

🟠 Highstate/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.

🟠 Highstate/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@StiensWout
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

@StiensWoutStiensWout 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

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-actionsgithub-actionsBot 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.

🟡 Mediumstate/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.

🟠 Highstate/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.

🟠 Highstate/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.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XL500-999 changed lines (additions + deletions).vouch:trustedPR 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

@StiensWout