feat(web): filter sidebar threads by environment - #8530

Open
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter
Open

feat(web): filter sidebar threads by environment#8530
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter

Conversation

@saphid

@saphidsaphid commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Problem

When the client connects to more than one environment, the sidebar interleaves threads from every machine. The existing project scope cannot isolate one environment because a logical project can exist in several environments.

Fix

The web sidebar now shows an environment checklist beside the project picker when at least two environments are connected.

The selected environments filter:

  • Thread rows, drafts, and search results
  • Project picker options
  • Multi-select state
  • Settled-thread pagination and empty states

The client stores disabled environment IDs, so new connections remain visible by default. It prevents disabling the last enabled environment and removes stale disabled IDs when connections disappear. The filter is session-only, like the project scope.

This shared sidebar ships to web and desktop. Mobile has a separate thread list and is unchanged. Providers, server events, and wire contracts are also unchanged.

Validation

Refreshed onto current main at 0681d854994ec0ceed0562ae74549ccf8ef2ec41. Current PR head is 2cf51227bff7e5bf8b8b65bade27c343c2f2787c.

  • CI=true pnpm vp test run src/components/Sidebar.logic.test.ts: 120 tests passed
  • CI=true pnpm --filter @t3tools/web typecheck: passed
  • Targeted lint for the three changed files: passed
  • Targeted format check for the three changed files: passed
  • git diff --check origin/main...HEAD: passed
  • The owner confirmed the interaction works in Fork Nightly with the same client patch

Evidence

Before filtering

Before filtering: all environments enabled

After selecting one environment

After selecting one environment

Interaction

Animated environment filter interaction

WebM recording\n\n## Limits

The control is hidden when the client knows about only one environment. Relay and tunnel transports were not retested because the change only filters the client-side environment catalog.

Implemented by GPT-5.6 Sol using Codex in T3 Code.

Note

Add environment filter checklist to sidebar thread list in Sidebar

  • Adds a multi-environment menu to the Sidebar with per-environment checkboxes, labels, and optional URLs, so users can filter threads, drafts, and project-scope options by enabled environments
  • Stores filter state as a set of disabled environment IDs and derives connected environments from the catalog; the last enabled environment cannot be disabled
  • Adds toggleDisabledEnvironmentId to toggle individual environments and pruneDisabledEnvironmentIds to remove disabled IDs that disconnect from the catalog and reset to all-enabled when no enabled environment remains
  • Clears thread selection and resets settled-thread pagination when the disabled set changes; removes project groups with no members in an enabled environment and clears a project scope that becomes fully disabled
  • Risk: changing the filter resets pagination and selection state in Sidebar, so consumers relying on preserved scroll position or selected thread across filter changes will see both cleared

Macroscope summarized 2cf5122.


Note

Low Risk
Client-only sidebar filtering with guarded edge cases; no auth, server, or persistence changes. Minor UX risk when project scope resets automatically after environment toggles.

Overview
Adds a session-only environment filter to the web sidebar when two or more environments are connected, alongside the existing project scope.

Filter state is stored as disabled environment IDs (new connections stay visible; “all environments” is an empty set). Sidebar.logic gains toggleDisabledEnvironmentId and pruneDisabledEnvironmentIds to enforce at least one enabled environment, no-op on redundant toggles, and safe cleanup when the connected catalog shrinks.

The sidebar wires this through thread/draft lists, project-scope combobox options, multi-select clearing, settled-tail pagination reset, and a server-icon Environments menu with checkboxes and an “All environments” reset. Project scope auto-clears if every environment for the scoped project is disabled; empty states mention when the filter hides everything.

Reviewed by Cursor Bugbot for commit 2cf5122. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 28, 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: ed595e2f-27b7-40f6-bd25-6aaef96209b9

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

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:L 100-499 changed lines (additions + deletions). labels Aug 28, 2026
@macroscopeapp

macroscopeappBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — Adds a production sidebar environment checklist and threads the selected environments through thread, draft, search, project-scope, selection, and pagination behavior. The session-only default preserves the existing all-environments view, but the breadth of the new interactive path and its cross-cutting state effects merits review.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 28, 2026
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 258c853 to 8983e13CompareAugust 28, 2026 21:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 21:35

Dismissing prior approval to re-evaluate 8983e13

@macroscopeappmacroscopeappBot left a comment

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.

One consistency finding on the new environment-filter trigger: it is the only icon SidebarMenuButton in this header row without the coarse-pointer hit-target overlay its neighbors use. Everything else (Menu/MenuPopup/MenuCheckboxItem composition, width-class contract on MenuPopup, active-filter dot matching PullRequestListFilters) matches the shared component system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 8983e13 to 14ed67bCompareAugust 28, 2026 22:45
saphidand others added 2 commits August 29, 2026 13:47
Add an icon button next to the sidebar's project scope menu (visible only
when more than one environment is connected) that opens a checklist to
enable and disable which environments' threads the list shows. The filter
composes with the project scope, draft rows, search, and the settled-tail
pagination reset; the project menu narrows to projects with a presence in
an enabled environment.
State is the disabled set, so newly connected environments are visible by
default. The last enabled environment cannot be unchecked, and a catalog
change that would leave nothing enabled resets the filter instead of
hiding every thread behind a control that no longer renders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 14ed67b to 72c948dCompareAugust 29, 2026 03:48

@macroscopeappmacroscopeappBot left a comment

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.

Two consistency findings on the new environment filter control in apps/web/src/components/Sidebar.tsx. Everything else (dot indicator matching PullRequestListFilters, MenuPopup width contract, SidebarMenuButton icon-color indirection) lines up with the existing system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d80e30b. Configure here.

Comment threadapps/web/src/components/Sidebar.logic.ts Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the new commit: the locked environment row explains its constraint with a native title attribute instead of the shared Tooltip primitive. Details inline.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the newest commit: the environment checkbox rows now pin data-highlighted text colors, which overrides MenuCheckboxItem's accent-surface foreground contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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

@saphid
, '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

feat(web): filter sidebar threads by environment - #8530

Open
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter
Open

feat(web): filter sidebar threads by environment#8530
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter

Conversation

@saphid

@saphidsaphid commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Problem

When the client connects to more than one environment, the sidebar interleaves threads from every machine. The existing project scope cannot isolate one environment because a logical project can exist in several environments.

Fix

The web sidebar now shows an environment checklist beside the project picker when at least two environments are connected.

The selected environments filter:

  • Thread rows, drafts, and search results
  • Project picker options
  • Multi-select state
  • Settled-thread pagination and empty states

The client stores disabled environment IDs, so new connections remain visible by default. It prevents disabling the last enabled environment and removes stale disabled IDs when connections disappear. The filter is session-only, like the project scope.

This shared sidebar ships to web and desktop. Mobile has a separate thread list and is unchanged. Providers, server events, and wire contracts are also unchanged.

Validation

Refreshed onto current main at 0681d854994ec0ceed0562ae74549ccf8ef2ec41. Current PR head is 2cf51227bff7e5bf8b8b65bade27c343c2f2787c.

  • CI=true pnpm vp test run src/components/Sidebar.logic.test.ts: 120 tests passed
  • CI=true pnpm --filter @t3tools/web typecheck: passed
  • Targeted lint for the three changed files: passed
  • Targeted format check for the three changed files: passed
  • git diff --check origin/main...HEAD: passed
  • The owner confirmed the interaction works in Fork Nightly with the same client patch

Evidence

Before filtering

Before filtering: all environments enabled

After selecting one environment

After selecting one environment

Interaction

Animated environment filter interaction

WebM recording\n\n## Limits

The control is hidden when the client knows about only one environment. Relay and tunnel transports were not retested because the change only filters the client-side environment catalog.

Implemented by GPT-5.6 Sol using Codex in T3 Code.

Note

Add environment filter checklist to sidebar thread list in Sidebar

  • Adds a multi-environment menu to the Sidebar with per-environment checkboxes, labels, and optional URLs, so users can filter threads, drafts, and project-scope options by enabled environments
  • Stores filter state as a set of disabled environment IDs and derives connected environments from the catalog; the last enabled environment cannot be disabled
  • Adds toggleDisabledEnvironmentId to toggle individual environments and pruneDisabledEnvironmentIds to remove disabled IDs that disconnect from the catalog and reset to all-enabled when no enabled environment remains
  • Clears thread selection and resets settled-thread pagination when the disabled set changes; removes project groups with no members in an enabled environment and clears a project scope that becomes fully disabled
  • Risk: changing the filter resets pagination and selection state in Sidebar, so consumers relying on preserved scroll position or selected thread across filter changes will see both cleared

Macroscope summarized 2cf5122.


Note

Low Risk
Client-only sidebar filtering with guarded edge cases; no auth, server, or persistence changes. Minor UX risk when project scope resets automatically after environment toggles.

Overview
Adds a session-only environment filter to the web sidebar when two or more environments are connected, alongside the existing project scope.

Filter state is stored as disabled environment IDs (new connections stay visible; “all environments” is an empty set). Sidebar.logic gains toggleDisabledEnvironmentId and pruneDisabledEnvironmentIds to enforce at least one enabled environment, no-op on redundant toggles, and safe cleanup when the connected catalog shrinks.

The sidebar wires this through thread/draft lists, project-scope combobox options, multi-select clearing, settled-tail pagination reset, and a server-icon Environments menu with checkboxes and an “All environments” reset. Project scope auto-clears if every environment for the scoped project is disabled; empty states mention when the filter hides everything.

Reviewed by Cursor Bugbot for commit 2cf5122. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 28, 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: ed595e2f-27b7-40f6-bd25-6aaef96209b9

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

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:L 100-499 changed lines (additions + deletions). labels Aug 28, 2026
@macroscopeapp

macroscopeappBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — Adds a production sidebar environment checklist and threads the selected environments through thread, draft, search, project-scope, selection, and pagination behavior. The session-only default preserves the existing all-environments view, but the breadth of the new interactive path and its cross-cutting state effects merits review.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 28, 2026
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 258c853 to 8983e13CompareAugust 28, 2026 21:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 21:35

Dismissing prior approval to re-evaluate 8983e13

@macroscopeappmacroscopeappBot left a comment

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.

One consistency finding on the new environment-filter trigger: it is the only icon SidebarMenuButton in this header row without the coarse-pointer hit-target overlay its neighbors use. Everything else (Menu/MenuPopup/MenuCheckboxItem composition, width-class contract on MenuPopup, active-filter dot matching PullRequestListFilters) matches the shared component system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 8983e13 to 14ed67bCompareAugust 28, 2026 22:45
saphidand others added 2 commits August 29, 2026 13:47
Add an icon button next to the sidebar's project scope menu (visible only
when more than one environment is connected) that opens a checklist to
enable and disable which environments' threads the list shows. The filter
composes with the project scope, draft rows, search, and the settled-tail
pagination reset; the project menu narrows to projects with a presence in
an enabled environment.
State is the disabled set, so newly connected environments are visible by
default. The last enabled environment cannot be unchecked, and a catalog
change that would leave nothing enabled resets the filter instead of
hiding every thread behind a control that no longer renders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 14ed67b to 72c948dCompareAugust 29, 2026 03:48

@macroscopeappmacroscopeappBot left a comment

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.

Two consistency findings on the new environment filter control in apps/web/src/components/Sidebar.tsx. Everything else (dot indicator matching PullRequestListFilters, MenuPopup width contract, SidebarMenuButton icon-color indirection) lines up with the existing system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d80e30b. Configure here.

Comment threadapps/web/src/components/Sidebar.logic.ts Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the new commit: the locked environment row explains its constraint with a native title attribute instead of the shared Tooltip primitive. Details inline.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the newest commit: the environment checkbox rows now pin data-highlighted text colors, which overrides MenuCheckboxItem's accent-surface foreground contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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

@saphid
, '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

feat(web): filter sidebar threads by environment - #8530

Open
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter
Open

feat(web): filter sidebar threads by environment#8530
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter

Conversation

@saphid

@saphidsaphid commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Problem

When the client connects to more than one environment, the sidebar interleaves threads from every machine. The existing project scope cannot isolate one environment because a logical project can exist in several environments.

Fix

The web sidebar now shows an environment checklist beside the project picker when at least two environments are connected.

The selected environments filter:

  • Thread rows, drafts, and search results
  • Project picker options
  • Multi-select state
  • Settled-thread pagination and empty states

The client stores disabled environment IDs, so new connections remain visible by default. It prevents disabling the last enabled environment and removes stale disabled IDs when connections disappear. The filter is session-only, like the project scope.

This shared sidebar ships to web and desktop. Mobile has a separate thread list and is unchanged. Providers, server events, and wire contracts are also unchanged.

Validation

Refreshed onto current main at 0681d854994ec0ceed0562ae74549ccf8ef2ec41. Current PR head is 2cf51227bff7e5bf8b8b65bade27c343c2f2787c.

  • CI=true pnpm vp test run src/components/Sidebar.logic.test.ts: 120 tests passed
  • CI=true pnpm --filter @t3tools/web typecheck: passed
  • Targeted lint for the three changed files: passed
  • Targeted format check for the three changed files: passed
  • git diff --check origin/main...HEAD: passed
  • The owner confirmed the interaction works in Fork Nightly with the same client patch

Evidence

Before filtering

Before filtering: all environments enabled

After selecting one environment

After selecting one environment

Interaction

Animated environment filter interaction

WebM recording\n\n## Limits

The control is hidden when the client knows about only one environment. Relay and tunnel transports were not retested because the change only filters the client-side environment catalog.

Implemented by GPT-5.6 Sol using Codex in T3 Code.

Note

Add environment filter checklist to sidebar thread list in Sidebar

  • Adds a multi-environment menu to the Sidebar with per-environment checkboxes, labels, and optional URLs, so users can filter threads, drafts, and project-scope options by enabled environments
  • Stores filter state as a set of disabled environment IDs and derives connected environments from the catalog; the last enabled environment cannot be disabled
  • Adds toggleDisabledEnvironmentId to toggle individual environments and pruneDisabledEnvironmentIds to remove disabled IDs that disconnect from the catalog and reset to all-enabled when no enabled environment remains
  • Clears thread selection and resets settled-thread pagination when the disabled set changes; removes project groups with no members in an enabled environment and clears a project scope that becomes fully disabled
  • Risk: changing the filter resets pagination and selection state in Sidebar, so consumers relying on preserved scroll position or selected thread across filter changes will see both cleared

Macroscope summarized 2cf5122.


Note

Low Risk
Client-only sidebar filtering with guarded edge cases; no auth, server, or persistence changes. Minor UX risk when project scope resets automatically after environment toggles.

Overview
Adds a session-only environment filter to the web sidebar when two or more environments are connected, alongside the existing project scope.

Filter state is stored as disabled environment IDs (new connections stay visible; “all environments” is an empty set). Sidebar.logic gains toggleDisabledEnvironmentId and pruneDisabledEnvironmentIds to enforce at least one enabled environment, no-op on redundant toggles, and safe cleanup when the connected catalog shrinks.

The sidebar wires this through thread/draft lists, project-scope combobox options, multi-select clearing, settled-tail pagination reset, and a server-icon Environments menu with checkboxes and an “All environments” reset. Project scope auto-clears if every environment for the scoped project is disabled; empty states mention when the filter hides everything.

Reviewed by Cursor Bugbot for commit 2cf5122. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 28, 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: ed595e2f-27b7-40f6-bd25-6aaef96209b9

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

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:L 100-499 changed lines (additions + deletions). labels Aug 28, 2026
@macroscopeapp

macroscopeappBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — Adds a production sidebar environment checklist and threads the selected environments through thread, draft, search, project-scope, selection, and pagination behavior. The session-only default preserves the existing all-environments view, but the breadth of the new interactive path and its cross-cutting state effects merits review.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 28, 2026
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 258c853 to 8983e13CompareAugust 28, 2026 21:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 21:35

Dismissing prior approval to re-evaluate 8983e13

@macroscopeappmacroscopeappBot left a comment

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.

One consistency finding on the new environment-filter trigger: it is the only icon SidebarMenuButton in this header row without the coarse-pointer hit-target overlay its neighbors use. Everything else (Menu/MenuPopup/MenuCheckboxItem composition, width-class contract on MenuPopup, active-filter dot matching PullRequestListFilters) matches the shared component system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 8983e13 to 14ed67bCompareAugust 28, 2026 22:45
saphidand others added 2 commits August 29, 2026 13:47
Add an icon button next to the sidebar's project scope menu (visible only
when more than one environment is connected) that opens a checklist to
enable and disable which environments' threads the list shows. The filter
composes with the project scope, draft rows, search, and the settled-tail
pagination reset; the project menu narrows to projects with a presence in
an enabled environment.
State is the disabled set, so newly connected environments are visible by
default. The last enabled environment cannot be unchecked, and a catalog
change that would leave nothing enabled resets the filter instead of
hiding every thread behind a control that no longer renders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 14ed67b to 72c948dCompareAugust 29, 2026 03:48

@macroscopeappmacroscopeappBot left a comment

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.

Two consistency findings on the new environment filter control in apps/web/src/components/Sidebar.tsx. Everything else (dot indicator matching PullRequestListFilters, MenuPopup width contract, SidebarMenuButton icon-color indirection) lines up with the existing system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d80e30b. Configure here.

Comment threadapps/web/src/components/Sidebar.logic.ts Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the new commit: the locked environment row explains its constraint with a native title attribute instead of the shared Tooltip primitive. Details inline.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the newest commit: the environment checkbox rows now pin data-highlighted text colors, which overrides MenuCheckboxItem's accent-surface foreground contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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

@saphid
, '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

feat(web): filter sidebar threads by environment - #8530

Open
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter
Open

feat(web): filter sidebar threads by environment#8530
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter

Conversation

@saphid

@saphidsaphid commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Problem

When the client connects to more than one environment, the sidebar interleaves threads from every machine. The existing project scope cannot isolate one environment because a logical project can exist in several environments.

Fix

The web sidebar now shows an environment checklist beside the project picker when at least two environments are connected.

The selected environments filter:

  • Thread rows, drafts, and search results
  • Project picker options
  • Multi-select state
  • Settled-thread pagination and empty states

The client stores disabled environment IDs, so new connections remain visible by default. It prevents disabling the last enabled environment and removes stale disabled IDs when connections disappear. The filter is session-only, like the project scope.

This shared sidebar ships to web and desktop. Mobile has a separate thread list and is unchanged. Providers, server events, and wire contracts are also unchanged.

Validation

Refreshed onto current main at 0681d854994ec0ceed0562ae74549ccf8ef2ec41. Current PR head is 2cf51227bff7e5bf8b8b65bade27c343c2f2787c.

  • CI=true pnpm vp test run src/components/Sidebar.logic.test.ts: 120 tests passed
  • CI=true pnpm --filter @t3tools/web typecheck: passed
  • Targeted lint for the three changed files: passed
  • Targeted format check for the three changed files: passed
  • git diff --check origin/main...HEAD: passed
  • The owner confirmed the interaction works in Fork Nightly with the same client patch

Evidence

Before filtering

Before filtering: all environments enabled

After selecting one environment

After selecting one environment

Interaction

Animated environment filter interaction

WebM recording\n\n## Limits

The control is hidden when the client knows about only one environment. Relay and tunnel transports were not retested because the change only filters the client-side environment catalog.

Implemented by GPT-5.6 Sol using Codex in T3 Code.

Note

Add environment filter checklist to sidebar thread list in Sidebar

  • Adds a multi-environment menu to the Sidebar with per-environment checkboxes, labels, and optional URLs, so users can filter threads, drafts, and project-scope options by enabled environments
  • Stores filter state as a set of disabled environment IDs and derives connected environments from the catalog; the last enabled environment cannot be disabled
  • Adds toggleDisabledEnvironmentId to toggle individual environments and pruneDisabledEnvironmentIds to remove disabled IDs that disconnect from the catalog and reset to all-enabled when no enabled environment remains
  • Clears thread selection and resets settled-thread pagination when the disabled set changes; removes project groups with no members in an enabled environment and clears a project scope that becomes fully disabled
  • Risk: changing the filter resets pagination and selection state in Sidebar, so consumers relying on preserved scroll position or selected thread across filter changes will see both cleared

Macroscope summarized 2cf5122.


Note

Low Risk
Client-only sidebar filtering with guarded edge cases; no auth, server, or persistence changes. Minor UX risk when project scope resets automatically after environment toggles.

Overview
Adds a session-only environment filter to the web sidebar when two or more environments are connected, alongside the existing project scope.

Filter state is stored as disabled environment IDs (new connections stay visible; “all environments” is an empty set). Sidebar.logic gains toggleDisabledEnvironmentId and pruneDisabledEnvironmentIds to enforce at least one enabled environment, no-op on redundant toggles, and safe cleanup when the connected catalog shrinks.

The sidebar wires this through thread/draft lists, project-scope combobox options, multi-select clearing, settled-tail pagination reset, and a server-icon Environments menu with checkboxes and an “All environments” reset. Project scope auto-clears if every environment for the scoped project is disabled; empty states mention when the filter hides everything.

Reviewed by Cursor Bugbot for commit 2cf5122. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 28, 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: ed595e2f-27b7-40f6-bd25-6aaef96209b9

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

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:L 100-499 changed lines (additions + deletions). labels Aug 28, 2026
@macroscopeapp

macroscopeappBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — Adds a production sidebar environment checklist and threads the selected environments through thread, draft, search, project-scope, selection, and pagination behavior. The session-only default preserves the existing all-environments view, but the breadth of the new interactive path and its cross-cutting state effects merits review.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 28, 2026
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 258c853 to 8983e13CompareAugust 28, 2026 21:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 21:35

Dismissing prior approval to re-evaluate 8983e13

@macroscopeappmacroscopeappBot left a comment

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.

One consistency finding on the new environment-filter trigger: it is the only icon SidebarMenuButton in this header row without the coarse-pointer hit-target overlay its neighbors use. Everything else (Menu/MenuPopup/MenuCheckboxItem composition, width-class contract on MenuPopup, active-filter dot matching PullRequestListFilters) matches the shared component system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 8983e13 to 14ed67bCompareAugust 28, 2026 22:45
saphidand others added 2 commits August 29, 2026 13:47
Add an icon button next to the sidebar's project scope menu (visible only
when more than one environment is connected) that opens a checklist to
enable and disable which environments' threads the list shows. The filter
composes with the project scope, draft rows, search, and the settled-tail
pagination reset; the project menu narrows to projects with a presence in
an enabled environment.
State is the disabled set, so newly connected environments are visible by
default. The last enabled environment cannot be unchecked, and a catalog
change that would leave nothing enabled resets the filter instead of
hiding every thread behind a control that no longer renders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 14ed67b to 72c948dCompareAugust 29, 2026 03:48

@macroscopeappmacroscopeappBot left a comment

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.

Two consistency findings on the new environment filter control in apps/web/src/components/Sidebar.tsx. Everything else (dot indicator matching PullRequestListFilters, MenuPopup width contract, SidebarMenuButton icon-color indirection) lines up with the existing system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d80e30b. Configure here.

Comment threadapps/web/src/components/Sidebar.logic.ts Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the new commit: the locked environment row explains its constraint with a native title attribute instead of the shared Tooltip primitive. Details inline.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the newest commit: the environment checkbox rows now pin data-highlighted text colors, which overrides MenuCheckboxItem's accent-surface foreground contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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

@saphid
, '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

feat(web): filter sidebar threads by environment - #8530

Open
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter
Open

feat(web): filter sidebar threads by environment#8530
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter

Conversation

@saphid

@saphidsaphid commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Problem

When the client connects to more than one environment, the sidebar interleaves threads from every machine. The existing project scope cannot isolate one environment because a logical project can exist in several environments.

Fix

The web sidebar now shows an environment checklist beside the project picker when at least two environments are connected.

The selected environments filter:

  • Thread rows, drafts, and search results
  • Project picker options
  • Multi-select state
  • Settled-thread pagination and empty states

The client stores disabled environment IDs, so new connections remain visible by default. It prevents disabling the last enabled environment and removes stale disabled IDs when connections disappear. The filter is session-only, like the project scope.

This shared sidebar ships to web and desktop. Mobile has a separate thread list and is unchanged. Providers, server events, and wire contracts are also unchanged.

Validation

Refreshed onto current main at 0681d854994ec0ceed0562ae74549ccf8ef2ec41. Current PR head is 2cf51227bff7e5bf8b8b65bade27c343c2f2787c.

  • CI=true pnpm vp test run src/components/Sidebar.logic.test.ts: 120 tests passed
  • CI=true pnpm --filter @t3tools/web typecheck: passed
  • Targeted lint for the three changed files: passed
  • Targeted format check for the three changed files: passed
  • git diff --check origin/main...HEAD: passed
  • The owner confirmed the interaction works in Fork Nightly with the same client patch

Evidence

Before filtering

Before filtering: all environments enabled

After selecting one environment

After selecting one environment

Interaction

Animated environment filter interaction

WebM recording\n\n## Limits

The control is hidden when the client knows about only one environment. Relay and tunnel transports were not retested because the change only filters the client-side environment catalog.

Implemented by GPT-5.6 Sol using Codex in T3 Code.

Note

Add environment filter checklist to sidebar thread list in Sidebar

  • Adds a multi-environment menu to the Sidebar with per-environment checkboxes, labels, and optional URLs, so users can filter threads, drafts, and project-scope options by enabled environments
  • Stores filter state as a set of disabled environment IDs and derives connected environments from the catalog; the last enabled environment cannot be disabled
  • Adds toggleDisabledEnvironmentId to toggle individual environments and pruneDisabledEnvironmentIds to remove disabled IDs that disconnect from the catalog and reset to all-enabled when no enabled environment remains
  • Clears thread selection and resets settled-thread pagination when the disabled set changes; removes project groups with no members in an enabled environment and clears a project scope that becomes fully disabled
  • Risk: changing the filter resets pagination and selection state in Sidebar, so consumers relying on preserved scroll position or selected thread across filter changes will see both cleared

Macroscope summarized 2cf5122.


Note

Low Risk
Client-only sidebar filtering with guarded edge cases; no auth, server, or persistence changes. Minor UX risk when project scope resets automatically after environment toggles.

Overview
Adds a session-only environment filter to the web sidebar when two or more environments are connected, alongside the existing project scope.

Filter state is stored as disabled environment IDs (new connections stay visible; “all environments” is an empty set). Sidebar.logic gains toggleDisabledEnvironmentId and pruneDisabledEnvironmentIds to enforce at least one enabled environment, no-op on redundant toggles, and safe cleanup when the connected catalog shrinks.

The sidebar wires this through thread/draft lists, project-scope combobox options, multi-select clearing, settled-tail pagination reset, and a server-icon Environments menu with checkboxes and an “All environments” reset. Project scope auto-clears if every environment for the scoped project is disabled; empty states mention when the filter hides everything.

Reviewed by Cursor Bugbot for commit 2cf5122. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 28, 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: ed595e2f-27b7-40f6-bd25-6aaef96209b9

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

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:L 100-499 changed lines (additions + deletions). labels Aug 28, 2026
@macroscopeapp

macroscopeappBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — Adds a production sidebar environment checklist and threads the selected environments through thread, draft, search, project-scope, selection, and pagination behavior. The session-only default preserves the existing all-environments view, but the breadth of the new interactive path and its cross-cutting state effects merits review.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 28, 2026
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 258c853 to 8983e13CompareAugust 28, 2026 21:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 21:35

Dismissing prior approval to re-evaluate 8983e13

@macroscopeappmacroscopeappBot left a comment

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.

One consistency finding on the new environment-filter trigger: it is the only icon SidebarMenuButton in this header row without the coarse-pointer hit-target overlay its neighbors use. Everything else (Menu/MenuPopup/MenuCheckboxItem composition, width-class contract on MenuPopup, active-filter dot matching PullRequestListFilters) matches the shared component system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 8983e13 to 14ed67bCompareAugust 28, 2026 22:45
saphidand others added 2 commits August 29, 2026 13:47
Add an icon button next to the sidebar's project scope menu (visible only
when more than one environment is connected) that opens a checklist to
enable and disable which environments' threads the list shows. The filter
composes with the project scope, draft rows, search, and the settled-tail
pagination reset; the project menu narrows to projects with a presence in
an enabled environment.
State is the disabled set, so newly connected environments are visible by
default. The last enabled environment cannot be unchecked, and a catalog
change that would leave nothing enabled resets the filter instead of
hiding every thread behind a control that no longer renders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 14ed67b to 72c948dCompareAugust 29, 2026 03:48

@macroscopeappmacroscopeappBot left a comment

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.

Two consistency findings on the new environment filter control in apps/web/src/components/Sidebar.tsx. Everything else (dot indicator matching PullRequestListFilters, MenuPopup width contract, SidebarMenuButton icon-color indirection) lines up with the existing system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d80e30b. Configure here.

Comment threadapps/web/src/components/Sidebar.logic.ts Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the new commit: the locked environment row explains its constraint with a native title attribute instead of the shared Tooltip primitive. Details inline.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the newest commit: the environment checkbox rows now pin data-highlighted text colors, which overrides MenuCheckboxItem's accent-surface foreground contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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

@saphid
, '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

feat(web): filter sidebar threads by environment - #8530

Open
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter
Open

feat(web): filter sidebar threads by environment#8530
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter

Conversation

@saphid

@saphidsaphid commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Problem

When the client connects to more than one environment, the sidebar interleaves threads from every machine. The existing project scope cannot isolate one environment because a logical project can exist in several environments.

Fix

The web sidebar now shows an environment checklist beside the project picker when at least two environments are connected.

The selected environments filter:

  • Thread rows, drafts, and search results
  • Project picker options
  • Multi-select state
  • Settled-thread pagination and empty states

The client stores disabled environment IDs, so new connections remain visible by default. It prevents disabling the last enabled environment and removes stale disabled IDs when connections disappear. The filter is session-only, like the project scope.

This shared sidebar ships to web and desktop. Mobile has a separate thread list and is unchanged. Providers, server events, and wire contracts are also unchanged.

Validation

Refreshed onto current main at 0681d854994ec0ceed0562ae74549ccf8ef2ec41. Current PR head is 2cf51227bff7e5bf8b8b65bade27c343c2f2787c.

  • CI=true pnpm vp test run src/components/Sidebar.logic.test.ts: 120 tests passed
  • CI=true pnpm --filter @t3tools/web typecheck: passed
  • Targeted lint for the three changed files: passed
  • Targeted format check for the three changed files: passed
  • git diff --check origin/main...HEAD: passed
  • The owner confirmed the interaction works in Fork Nightly with the same client patch

Evidence

Before filtering

Before filtering: all environments enabled

After selecting one environment

After selecting one environment

Interaction

Animated environment filter interaction

WebM recording\n\n## Limits

The control is hidden when the client knows about only one environment. Relay and tunnel transports were not retested because the change only filters the client-side environment catalog.

Implemented by GPT-5.6 Sol using Codex in T3 Code.

Note

Add environment filter checklist to sidebar thread list in Sidebar

  • Adds a multi-environment menu to the Sidebar with per-environment checkboxes, labels, and optional URLs, so users can filter threads, drafts, and project-scope options by enabled environments
  • Stores filter state as a set of disabled environment IDs and derives connected environments from the catalog; the last enabled environment cannot be disabled
  • Adds toggleDisabledEnvironmentId to toggle individual environments and pruneDisabledEnvironmentIds to remove disabled IDs that disconnect from the catalog and reset to all-enabled when no enabled environment remains
  • Clears thread selection and resets settled-thread pagination when the disabled set changes; removes project groups with no members in an enabled environment and clears a project scope that becomes fully disabled
  • Risk: changing the filter resets pagination and selection state in Sidebar, so consumers relying on preserved scroll position or selected thread across filter changes will see both cleared

Macroscope summarized 2cf5122.


Note

Low Risk
Client-only sidebar filtering with guarded edge cases; no auth, server, or persistence changes. Minor UX risk when project scope resets automatically after environment toggles.

Overview
Adds a session-only environment filter to the web sidebar when two or more environments are connected, alongside the existing project scope.

Filter state is stored as disabled environment IDs (new connections stay visible; “all environments” is an empty set). Sidebar.logic gains toggleDisabledEnvironmentId and pruneDisabledEnvironmentIds to enforce at least one enabled environment, no-op on redundant toggles, and safe cleanup when the connected catalog shrinks.

The sidebar wires this through thread/draft lists, project-scope combobox options, multi-select clearing, settled-tail pagination reset, and a server-icon Environments menu with checkboxes and an “All environments” reset. Project scope auto-clears if every environment for the scoped project is disabled; empty states mention when the filter hides everything.

Reviewed by Cursor Bugbot for commit 2cf5122. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 28, 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: ed595e2f-27b7-40f6-bd25-6aaef96209b9

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

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:L 100-499 changed lines (additions + deletions). labels Aug 28, 2026
@macroscopeapp

macroscopeappBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — Adds a production sidebar environment checklist and threads the selected environments through thread, draft, search, project-scope, selection, and pagination behavior. The session-only default preserves the existing all-environments view, but the breadth of the new interactive path and its cross-cutting state effects merits review.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 28, 2026
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 258c853 to 8983e13CompareAugust 28, 2026 21:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 21:35

Dismissing prior approval to re-evaluate 8983e13

@macroscopeappmacroscopeappBot left a comment

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.

One consistency finding on the new environment-filter trigger: it is the only icon SidebarMenuButton in this header row without the coarse-pointer hit-target overlay its neighbors use. Everything else (Menu/MenuPopup/MenuCheckboxItem composition, width-class contract on MenuPopup, active-filter dot matching PullRequestListFilters) matches the shared component system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 8983e13 to 14ed67bCompareAugust 28, 2026 22:45
saphidand others added 2 commits August 29, 2026 13:47
Add an icon button next to the sidebar's project scope menu (visible only
when more than one environment is connected) that opens a checklist to
enable and disable which environments' threads the list shows. The filter
composes with the project scope, draft rows, search, and the settled-tail
pagination reset; the project menu narrows to projects with a presence in
an enabled environment.
State is the disabled set, so newly connected environments are visible by
default. The last enabled environment cannot be unchecked, and a catalog
change that would leave nothing enabled resets the filter instead of
hiding every thread behind a control that no longer renders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 14ed67b to 72c948dCompareAugust 29, 2026 03:48

@macroscopeappmacroscopeappBot left a comment

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.

Two consistency findings on the new environment filter control in apps/web/src/components/Sidebar.tsx. Everything else (dot indicator matching PullRequestListFilters, MenuPopup width contract, SidebarMenuButton icon-color indirection) lines up with the existing system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d80e30b. Configure here.

Comment threadapps/web/src/components/Sidebar.logic.ts Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the new commit: the locked environment row explains its constraint with a native title attribute instead of the shared Tooltip primitive. Details inline.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the newest commit: the environment checkbox rows now pin data-highlighted text colors, which overrides MenuCheckboxItem's accent-surface foreground contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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

@saphid
, '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

feat(web): filter sidebar threads by environment - #8530

Open
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter
Open

feat(web): filter sidebar threads by environment#8530
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter

Conversation

@saphid

@saphidsaphid commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Problem

When the client connects to more than one environment, the sidebar interleaves threads from every machine. The existing project scope cannot isolate one environment because a logical project can exist in several environments.

Fix

The web sidebar now shows an environment checklist beside the project picker when at least two environments are connected.

The selected environments filter:

  • Thread rows, drafts, and search results
  • Project picker options
  • Multi-select state
  • Settled-thread pagination and empty states

The client stores disabled environment IDs, so new connections remain visible by default. It prevents disabling the last enabled environment and removes stale disabled IDs when connections disappear. The filter is session-only, like the project scope.

This shared sidebar ships to web and desktop. Mobile has a separate thread list and is unchanged. Providers, server events, and wire contracts are also unchanged.

Validation

Refreshed onto current main at 0681d854994ec0ceed0562ae74549ccf8ef2ec41. Current PR head is 2cf51227bff7e5bf8b8b65bade27c343c2f2787c.

  • CI=true pnpm vp test run src/components/Sidebar.logic.test.ts: 120 tests passed
  • CI=true pnpm --filter @t3tools/web typecheck: passed
  • Targeted lint for the three changed files: passed
  • Targeted format check for the three changed files: passed
  • git diff --check origin/main...HEAD: passed
  • The owner confirmed the interaction works in Fork Nightly with the same client patch

Evidence

Before filtering

Before filtering: all environments enabled

After selecting one environment

After selecting one environment

Interaction

Animated environment filter interaction

WebM recording\n\n## Limits

The control is hidden when the client knows about only one environment. Relay and tunnel transports were not retested because the change only filters the client-side environment catalog.

Implemented by GPT-5.6 Sol using Codex in T3 Code.

Note

Add environment filter checklist to sidebar thread list in Sidebar

  • Adds a multi-environment menu to the Sidebar with per-environment checkboxes, labels, and optional URLs, so users can filter threads, drafts, and project-scope options by enabled environments
  • Stores filter state as a set of disabled environment IDs and derives connected environments from the catalog; the last enabled environment cannot be disabled
  • Adds toggleDisabledEnvironmentId to toggle individual environments and pruneDisabledEnvironmentIds to remove disabled IDs that disconnect from the catalog and reset to all-enabled when no enabled environment remains
  • Clears thread selection and resets settled-thread pagination when the disabled set changes; removes project groups with no members in an enabled environment and clears a project scope that becomes fully disabled
  • Risk: changing the filter resets pagination and selection state in Sidebar, so consumers relying on preserved scroll position or selected thread across filter changes will see both cleared

Macroscope summarized 2cf5122.


Note

Low Risk
Client-only sidebar filtering with guarded edge cases; no auth, server, or persistence changes. Minor UX risk when project scope resets automatically after environment toggles.

Overview
Adds a session-only environment filter to the web sidebar when two or more environments are connected, alongside the existing project scope.

Filter state is stored as disabled environment IDs (new connections stay visible; “all environments” is an empty set). Sidebar.logic gains toggleDisabledEnvironmentId and pruneDisabledEnvironmentIds to enforce at least one enabled environment, no-op on redundant toggles, and safe cleanup when the connected catalog shrinks.

The sidebar wires this through thread/draft lists, project-scope combobox options, multi-select clearing, settled-tail pagination reset, and a server-icon Environments menu with checkboxes and an “All environments” reset. Project scope auto-clears if every environment for the scoped project is disabled; empty states mention when the filter hides everything.

Reviewed by Cursor Bugbot for commit 2cf5122. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 28, 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: ed595e2f-27b7-40f6-bd25-6aaef96209b9

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

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:L 100-499 changed lines (additions + deletions). labels Aug 28, 2026
@macroscopeapp

macroscopeappBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — Adds a production sidebar environment checklist and threads the selected environments through thread, draft, search, project-scope, selection, and pagination behavior. The session-only default preserves the existing all-environments view, but the breadth of the new interactive path and its cross-cutting state effects merits review.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 28, 2026
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 258c853 to 8983e13CompareAugust 28, 2026 21:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 21:35

Dismissing prior approval to re-evaluate 8983e13

@macroscopeappmacroscopeappBot left a comment

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.

One consistency finding on the new environment-filter trigger: it is the only icon SidebarMenuButton in this header row without the coarse-pointer hit-target overlay its neighbors use. Everything else (Menu/MenuPopup/MenuCheckboxItem composition, width-class contract on MenuPopup, active-filter dot matching PullRequestListFilters) matches the shared component system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 8983e13 to 14ed67bCompareAugust 28, 2026 22:45
saphidand others added 2 commits August 29, 2026 13:47
Add an icon button next to the sidebar's project scope menu (visible only
when more than one environment is connected) that opens a checklist to
enable and disable which environments' threads the list shows. The filter
composes with the project scope, draft rows, search, and the settled-tail
pagination reset; the project menu narrows to projects with a presence in
an enabled environment.
State is the disabled set, so newly connected environments are visible by
default. The last enabled environment cannot be unchecked, and a catalog
change that would leave nothing enabled resets the filter instead of
hiding every thread behind a control that no longer renders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 14ed67b to 72c948dCompareAugust 29, 2026 03:48

@macroscopeappmacroscopeappBot left a comment

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.

Two consistency findings on the new environment filter control in apps/web/src/components/Sidebar.tsx. Everything else (dot indicator matching PullRequestListFilters, MenuPopup width contract, SidebarMenuButton icon-color indirection) lines up with the existing system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d80e30b. Configure here.

Comment threadapps/web/src/components/Sidebar.logic.ts Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the new commit: the locked environment row explains its constraint with a native title attribute instead of the shared Tooltip primitive. Details inline.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the newest commit: the environment checkbox rows now pin data-highlighted text colors, which overrides MenuCheckboxItem's accent-surface foreground contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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

@saphid
, '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

feat(web): filter sidebar threads by environment - #8530

Open
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter
Open

feat(web): filter sidebar threads by environment#8530
saphid wants to merge 10 commits into
pingdotgg:mainfrom
saphid:web/sidebar-environment-filter

Conversation

@saphid

@saphidsaphid commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Problem

When the client connects to more than one environment, the sidebar interleaves threads from every machine. The existing project scope cannot isolate one environment because a logical project can exist in several environments.

Fix

The web sidebar now shows an environment checklist beside the project picker when at least two environments are connected.

The selected environments filter:

  • Thread rows, drafts, and search results
  • Project picker options
  • Multi-select state
  • Settled-thread pagination and empty states

The client stores disabled environment IDs, so new connections remain visible by default. It prevents disabling the last enabled environment and removes stale disabled IDs when connections disappear. The filter is session-only, like the project scope.

This shared sidebar ships to web and desktop. Mobile has a separate thread list and is unchanged. Providers, server events, and wire contracts are also unchanged.

Validation

Refreshed onto current main at 0681d854994ec0ceed0562ae74549ccf8ef2ec41. Current PR head is 2cf51227bff7e5bf8b8b65bade27c343c2f2787c.

  • CI=true pnpm vp test run src/components/Sidebar.logic.test.ts: 120 tests passed
  • CI=true pnpm --filter @t3tools/web typecheck: passed
  • Targeted lint for the three changed files: passed
  • Targeted format check for the three changed files: passed
  • git diff --check origin/main...HEAD: passed
  • The owner confirmed the interaction works in Fork Nightly with the same client patch

Evidence

Before filtering

Before filtering: all environments enabled

After selecting one environment

After selecting one environment

Interaction

Animated environment filter interaction

WebM recording\n\n## Limits

The control is hidden when the client knows about only one environment. Relay and tunnel transports were not retested because the change only filters the client-side environment catalog.

Implemented by GPT-5.6 Sol using Codex in T3 Code.

Note

Add environment filter checklist to sidebar thread list in Sidebar

  • Adds a multi-environment menu to the Sidebar with per-environment checkboxes, labels, and optional URLs, so users can filter threads, drafts, and project-scope options by enabled environments
  • Stores filter state as a set of disabled environment IDs and derives connected environments from the catalog; the last enabled environment cannot be disabled
  • Adds toggleDisabledEnvironmentId to toggle individual environments and pruneDisabledEnvironmentIds to remove disabled IDs that disconnect from the catalog and reset to all-enabled when no enabled environment remains
  • Clears thread selection and resets settled-thread pagination when the disabled set changes; removes project groups with no members in an enabled environment and clears a project scope that becomes fully disabled
  • Risk: changing the filter resets pagination and selection state in Sidebar, so consumers relying on preserved scroll position or selected thread across filter changes will see both cleared

Macroscope summarized 2cf5122.


Note

Low Risk
Client-only sidebar filtering with guarded edge cases; no auth, server, or persistence changes. Minor UX risk when project scope resets automatically after environment toggles.

Overview
Adds a session-only environment filter to the web sidebar when two or more environments are connected, alongside the existing project scope.

Filter state is stored as disabled environment IDs (new connections stay visible; “all environments” is an empty set). Sidebar.logic gains toggleDisabledEnvironmentId and pruneDisabledEnvironmentIds to enforce at least one enabled environment, no-op on redundant toggles, and safe cleanup when the connected catalog shrinks.

The sidebar wires this through thread/draft lists, project-scope combobox options, multi-select clearing, settled-tail pagination reset, and a server-icon Environments menu with checkboxes and an “All environments” reset. Project scope auto-clears if every environment for the scoped project is disabled; empty states mention when the filter hides everything.

Reviewed by Cursor Bugbot for commit 2cf5122. Bugbot is set up for automated code reviews on this repo. Configure here.

@coderabbitai

coderabbitaiBot commented Aug 28, 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: ed595e2f-27b7-40f6-bd25-6aaef96209b9

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

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:L 100-499 changed lines (additions + deletions). labels Aug 28, 2026
@macroscopeapp

macroscopeappBot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — Adds a production sidebar environment checklist and threads the selected environments through thread, draft, search, project-scope, selection, and pagination behavior. The session-only default preserves the existing all-environments view, but the breadth of the new interactive path and its cross-cutting state effects merits review.

You can add or adjust custom eligibility rules. Learn more.

macroscopeapp[bot]
macroscopeappBot previously approved these changes Aug 28, 2026
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 258c853 to 8983e13CompareAugust 28, 2026 21:35
@macroscopeapp
macroscopeappBot dismissed their stale reviewAugust 28, 2026 21:35

Dismissing prior approval to re-evaluate 8983e13

@macroscopeappmacroscopeappBot left a comment

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.

One consistency finding on the new environment-filter trigger: it is the only icon SidebarMenuButton in this header row without the coarse-pointer hit-target overlay its neighbors use. Everything else (Menu/MenuPopup/MenuCheckboxItem composition, width-class contract on MenuPopup, active-filter dot matching PullRequestListFilters) matches the shared component system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 8983e13 to 14ed67bCompareAugust 28, 2026 22:45
saphidand others added 2 commits August 29, 2026 13:47
Add an icon button next to the sidebar's project scope menu (visible only
when more than one environment is connected) that opens a checklist to
enable and disable which environments' threads the list shows. The filter
composes with the project scope, draft rows, search, and the settled-tail
pagination reset; the project menu narrows to projects with a presence in
an enabled environment.
State is the disabled set, so newly connected environments are visible by
default. The last enabled environment cannot be unchecked, and a catalog
change that would leave nothing enabled resets the filter instead of
hiding every thread behind a control that no longer renders.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@saphid
saphidforce-pushed the web/sidebar-environment-filter branch from 14ed67b to 72c948dCompareAugust 29, 2026 03:48

@macroscopeappmacroscopeappBot left a comment

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.

Two consistency findings on the new environment filter control in apps/web/src/components/Sidebar.tsx. Everything else (dot indicator matching PullRequestListFilters, MenuPopup width contract, SidebarMenuButton icon-color indirection) lines up with the existing system.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated

@cursorcursorBot left a comment

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.

Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d80e30b. Configure here.

Comment threadapps/web/src/components/Sidebar.logic.ts Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the new commit: the locked environment row explains its constraint with a native title attribute instead of the shared Tooltip primitive. Details inline.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated

@macroscopeappmacroscopeappBot left a comment

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.

One finding on the newest commit: the environment checkbox rows now pin data-highlighted text colors, which overrides MenuCheckboxItem's accent-surface foreground contract.

Posted via Macroscope — UI Consistency

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/Sidebar.tsx Outdated
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 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

@saphid