Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
d494800
fix(web): show Linux icon for WSL threads
UtkarshUsername Aug 27, 2026
77438fc
fix(web): show Linux icon in composer environment picker
UtkarshUsername Aug 28, 2026
63e0b66
Merge branch 'main' into fix/web-wsl-sidebar-icon
UtkarshUsername Aug 28, 2026
8f6ec6e
fix(web): use Linux icon in legacy sidebar
UtkarshUsername Aug 28, 2026
d9f2b09
refactor(web): share environment icons
UtkarshUsername Aug 28, 2026
f01bc91
refactor(web): move Linux icon to shared icons
UtkarshUsername Aug 28, 2026
020546e
fix(web): preserve server icon for remote threads
UtkarshUsername Aug 28, 2026
960e0e1
Merge branch 'main' into fix/web-wsl-sidebar-icon
UtkarshUsername Aug 28, 2026
8e21744
fix(web): identify WSL environments explicitly
UtkarshUsername Aug 28, 2026
8fc1535
fix(web): show Linux icon in sidebar tooltips
UtkarshUsername Aug 28, 2026
c041e86
fix(web): align environment icon states
UtkarshUsername Aug 28, 2026
2bd7efe
Merge branch 'main' into fix/web-wsl-sidebar-icon
UtkarshUsername Aug 28, 2026
3d64750
fix(web): center legacy sidebar environment icon
UtkarshUsername Aug 28, 2026
5b9b965
Merge branch 'main' into fix/web-wsl-sidebar-icon
UtkarshUsername Aug 28, 2026
8b345ab
Merge branch 'main' into fix/web-wsl-sidebar-icon
UtkarshUsername Aug 28, 2026
8cb96c3
Merge branch 'main' into fix/web-wsl-sidebar-icon
UtkarshUsername Aug 28, 2026
8c50438
Merge upstream/main into fix/web-wsl-sidebar-icon
UtkarshUsername Sep 5, 2026
bf5cc13
feat(environments): add Linux/WSL icon
UtkarshUsername Sep 6, 2026
ec30f95
Merge branch 'main' into fix/web-wsl-sidebar-icon
UtkarshUsername Sep 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apps/web/src/components/BranchToolbar.logic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export interface EnvironmentOption {
projectId: ProjectId;
label: string;
isPrimary: boolean;
isDesktopLocal: boolean;
Comment thread
UtkarshUsername marked this conversation as resolved.
Outdated
Comment thread
UtkarshUsername marked this conversation as resolved.
Outdated
}

export const EnvMode = Schema.Literals(["local", "worktree"]);
Expand Down
20 changes: 10 additions & 10 deletions apps/web/src/components/BranchToolbarEnvironmentSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { CloudIcon, MonitorIcon } from "lucide-react";
import { memo, useMemo } from "react";

import type { EnvironmentOption } from "./BranchToolbar.logic";
import { LinuxIcon } from "./LinuxIcon";
import {
Select,
SelectGroup,
Expand Down Expand Up @@ -31,6 +32,11 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir
const activeEnvironment = useMemo(() => {
return availableEnvironments.find((env) => env.environmentId === environmentId) ?? null;
}, [availableEnvironments, environmentId]);
const EnvironmentIcon = activeEnvironment?.isPrimary
? MonitorIcon
: activeEnvironment?.isDesktopLocal
? LinuxIcon
Comment thread
macroscopeapp[bot] marked this conversation as resolved.
Outdated
: CloudIcon;

const environmentItems = useMemo(
() =>
Expand All @@ -52,11 +58,7 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir
className="inline-flex h-7 min-w-0 max-w-full items-center gap-1 border border-transparent px-[calc(--spacing(3)-1px)] text-sm font-medium text-muted-foreground/70 sm:h-6 sm:text-xs"
data-composer-context-control
>
{activeEnvironment?.isPrimary ? (
<MonitorIcon className="size-3 shrink-0" />
) : (
<CloudIcon className="size-3 shrink-0" />
)}
<EnvironmentIcon className="size-3 shrink-0" />
<span
data-composer-label
className="min-w-0 max-w-[240px] group-data-[compact]/composer-context:max-w-0"
Expand Down Expand Up @@ -86,11 +88,7 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir
aria-label="Run on"
data-composer-context-control
>
{activeEnvironment?.isPrimary ? (
<MonitorIcon className="size-3 shrink-0" />
) : (
<CloudIcon className="size-3 shrink-0" />
)}
<EnvironmentIcon className="size-3 shrink-0" />
<span
data-composer-label
className="min-w-0 max-w-[240px] group-data-[compact]/composer-context:max-w-0"
Expand All @@ -111,6 +109,8 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir
<span className="inline-flex items-center gap-1.5">
{env.isPrimary ? (
<MonitorIcon className="size-3" />
) : env.isDesktopLocal ? (
<LinuxIcon className="size-3" />
) : (
<CloudIcon className="size-3" />
)}
Expand Down
6 changes: 6 additions & 0 deletions apps/web/src/components/ChatView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ import * as Cause from "effect/Cause";
import * as Schema from "effect/Schema";
import { AsyncResult } from "effect/unstable/reactivity";
import { isElectron } from "../env";
import { isDesktopLocalConnectionTarget } from "../connection/desktopLocal";
import { readLocalApi } from "../localApi";
import { useDiffPanelStore } from "../diffPanelStore";
import {
Expand Down Expand Up @@ -1967,17 +1968,22 @@ function ChatViewContent(props: ChatViewProps) {
projectId: ProjectId;
label: string;
isPrimary: boolean;
isDesktopLocal: boolean;
}> = [];
for (const p of memberProjects) {
if (seen.has(p.environmentId)) continue;
seen.add(p.environmentId);
const isPrimary = p.environmentId === primaryEnvironmentId;
const environment = environmentById.get(p.environmentId);
const isDesktopLocal =
environment !== undefined && isDesktopLocalConnectionTarget(environment.entry.target);
const label = environmentById.get(p.environmentId)?.label ?? p.environmentId;
envs.push({
environmentId: p.environmentId,
projectId: p.id,
label,
isPrimary,
isDesktopLocal,
});
}
// Sort: primary first, then alphabetical
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/components/LegacySidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import {
ArrowUpDownIcon,
ChevronRightIcon,
CloudIcon,
ContainerIcon,
FolderPlusIcon,
Globe2Icon,
LoaderIcon,
Expand All @@ -23,6 +22,7 @@ import {
useLinkedThreadPullRequest,
} from "./ThreadStatusIndicators";
import { ProjectFavicon } from "./ProjectFavicon";
import { LinuxIcon } from "./LinuxIcon";
import { useAtomValue } from "@effect/atom-react";
import { autoAnimate } from "@formkit/auto-animate";
import React, { useCallback, useEffect, memo, useMemo, useRef, useState } from "react";
Expand Down Expand Up @@ -2328,7 +2328,7 @@ const SidebarProjectItem = memo(function SidebarProjectItem(props: SidebarProjec
}
>
{project.allRemoteMembersAreDesktopLocal ? (
<ContainerIcon className="size-3" />
<LinuxIcon className="size-3" />
Comment thread
macroscopeapp[bot] marked this conversation as resolved.
Outdated
) : (
<CloudIcon className="size-3" />
)}
Expand Down
9 changes: 9 additions & 0 deletions apps/web/src/components/LinuxIcon.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import type { SVGProps } from "react";

export function LinuxIcon(props: SVGProps<SVGSVGElement>) {
Comment thread
macroscopeapp[bot] marked this conversation as resolved.
Outdated
return (
<svg {...props} viewBox="0 0 24 24" fill="currentColor">
<path d="M12.504 0c-.155 0-.315.008-.48.021-4.226.333-3.105 4.807-3.17 6.298-.076 1.092-.3 1.953-1.05 3.02-.885 1.051-2.127 2.75-2.716 4.521-.278.832-.41 1.684-.287 2.489a.424.424 0 00-.11.135c-.26.268-.45.6-.663.839-.199.199-.485.267-.797.4-.313.136-.658.269-.864.68-.09.189-.136.394-.132.602 0 .199.027.4.055.536.058.399.116.728.04.97-.249.68-.28 1.145-.106 1.484.174.334.535.47.94.601.81.2 1.91.135 2.774.6.926.466 1.866.67 2.616.47.526-.116.97-.464 1.208-.946.587-.003 1.23-.269 2.26-.334.699-.058 1.574.267 2.577.2.025.134.063.198.114.333l.003.003c.391.778 1.113 1.132 1.884 1.071.771-.06 1.592-.536 2.257-1.306.631-.765 1.683-1.084 2.378-1.503.348-.199.629-.469.649-.853.023-.4-.2-.811-.714-1.376v-.097l-.003-.003c-.17-.2-.25-.535-.338-.926-.085-.401-.182-.786-.492-1.046h-.003c-.059-.054-.123-.067-.188-.135a.357.357 0 00-.19-.064c.431-1.278.264-2.55-.173-3.694-.533-1.41-1.465-2.638-2.175-3.483-.796-1.005-1.576-1.957-1.56-3.368.026-2.152.236-6.133-3.544-6.139zm.529 3.405h.013c.213 0 .396.062.584.198.19.135.33.332.438.533.105.259.158.459.166.724 0-.02.006-.04.006-.06v.105a.086.086 0 01-.004-.021l-.004-.024a1.807 1.807 0 01-.15.706.953.953 0 01-.213.335.71.71 0 00-.088-.042c-.104-.045-.198-.064-.284-.133a1.312 1.312 0 00-.22-.066c.05-.06.146-.133.183-.198.053-.128.082-.264.088-.402v-.02a1.21 1.21 0 00-.061-.4c-.045-.134-.101-.2-.183-.333-.084-.066-.167-.132-.267-.132h-.016c-.093 0-.176.03-.262.132a.8.8 0 00-.205.334 1.18 1.18 0 00-.09.4v.019c.002.089.008.179.02.267-.193-.067-.438-.135-.607-.202a1.635 1.635 0 01-.018-.2v-.02a1.772 1.772 0 01.15-.768c.082-.22.232-.406.43-.533a.985.985 0 01.594-.2zm-2.962.059h.036c.142 0 .27.048.399.135.146.129.264.288.344.465.09.199.14.4.153.667v.004c.007.134.006.2-.002.266v.08c-.03.007-.056.018-.083.024-.152.055-.274.135-.393.2.012-.09.013-.18.003-.267v-.015c-.012-.133-.04-.2-.082-.333a.613.613 0 00-.166-.267.248.248 0 00-.183-.064h-.021c-.071.006-.13.04-.186.132a.552.552 0 00-.12.27.944.944 0 00-.023.33v.015c.012.135.037.2.08.334.046.134.098.2.166.268.01.009.02.018.034.024-.07.057-.117.07-.176.136a.304.304 0 01-.131.068 2.62 2.62 0 01-.275-.402 1.772 1.772 0 01-.155-.667 1.759 1.759 0 01.08-.668 1.43 1.43 0 01.283-.535c.128-.133.26-.2.418-.2zm1.37 1.706c.332 0 .733.065 1.216.399.293.2.523.269 1.052.468h.003c.255.136.405.266.478.399v-.131a.571.571 0 01.016.47c-.123.31-.516.643-1.063.842v.002c-.268.135-.501.333-.775.465-.276.135-.588.292-1.012.267a1.139 1.139 0 01-.448-.067 3.566 3.566 0 01-.322-.198c-.195-.135-.363-.332-.612-.465v-.005h-.005c-.4-.246-.616-.512-.686-.71-.07-.268-.005-.47.193-.6.224-.135.38-.271.483-.336.104-.074.143-.102.176-.131h.002v-.003c.169-.202.436-.47.839-.601.139-.036.294-.065.466-.065zm2.8 2.142c.358 1.417 1.196 3.475 1.735 4.473.286.534.855 1.659 1.102 3.024.156-.005.33.018.513.064.646-1.671-.546-3.467-1.089-3.966-.22-.2-.232-.335-.123-.335.59.534 1.365 1.572 1.646 2.757.13.535.16 1.104.021 1.67.067.028.135.06.205.067 1.032.534 1.413.938 1.23 1.537v-.043c-.06-.003-.12 0-.18 0h-.016c.151-.467-.182-.825-1.065-1.224-.915-.4-1.646-.336-1.77.465-.008.043-.013.066-.018.135-.068.023-.139.053-.209.064-.43.268-.662.669-.793 1.187-.13.533-.17 1.156-.205 1.869v.003c-.02.334-.17.838-.319 1.35-1.5 1.072-3.58 1.538-5.348.334a2.645 2.645 0 00-.402-.533 1.45 1.45 0 00-.275-.333c.182 0 .338-.03.465-.067a.615.615 0 00.314-.334c.108-.267 0-.697-.345-1.163-.345-.467-.931-.995-1.788-1.521-.63-.4-.986-.87-1.15-1.396-.165-.534-.143-1.085-.015-1.645.245-1.07.873-2.11 1.274-2.763.107-.065.037.135-.408.974-.396.751-1.14 2.497-.122 3.854a8.123 8.123 0 01.647-2.876c.564-1.278 1.743-3.504 1.836-5.268.048.036.217.135.289.202.218.133.38.333.59.465.21.201.477.335.876.335.039.003.075.006.11.006.412 0 .73-.134.997-.268.29-.134.52-.334.74-.4h.005c.467-.135.835-.402 1.044-.7zm2.185 8.958c.037.6.343 1.245.882 1.377.588.134 1.434-.333 1.791-.765l.211-.01c.315-.007.577.01.847.268l.003.003c.208.199.305.53.391.876.085.4.154.78.409 1.066.486.527.645.906.636 1.14l.003-.007v.018l-.003-.012c-.015.262-.185.396-.498.595-.63.401-1.746.712-2.457 1.57-.618.737-1.37 1.14-2.036 1.191-.664.053-1.237-.2-1.574-.898l-.005-.003c-.21-.4-.12-1.025.056-1.69.176-.668.428-1.344.463-1.897.037-.714.076-1.335.195-1.814.12-.465.308-.797.641-.984l.045-.022zm-10.814.049h.01c.053 0 .105.005.157.014.376.055.706.333 1.023.752l.91 1.664.003.003c.243.533.754 1.064 1.189 1.637.434.598.77 1.131.729 1.57v.006c-.057.744-.48 1.148-1.125 1.294-.645.135-1.52.002-2.395-.464-.968-.536-2.118-.469-2.857-.602-.369-.066-.61-.2-.723-.4-.11-.2-.113-.602.123-1.23v-.004l.002-.003c.117-.334.03-.752-.027-1.118-.055-.401-.083-.71.043-.94.16-.334.396-.4.69-.533.294-.135.64-.202.915-.47h.002v-.002c.256-.268.445-.601.668-.838.19-.201.38-.336.663-.336zm7.159-9.074c-.435.201-.945.535-1.488.535-.542 0-.97-.267-1.28-.466-.154-.134-.28-.268-.373-.335-.164-.134-.144-.333-.074-.333.109.016.129.134.199.2.096.066.215.2.36.333.292.2.68.467 1.167.467.485 0 1.053-.267 1.398-.466.195-.135.445-.334.648-.467.156-.136.149-.267.279-.267.128.016.034.134-.147.332a8.097 8.097 0 01-.69.468zm-1.082-1.583V5.64c-.006-.02.013-.042.029-.05.074-.043.18-.027.26.004.063 0 .16.067.15.135-.006.049-.085.066-.135.066-.055 0-.092-.043-.141-.068-.052-.018-.146-.008-.163-.065zm-.551 0c-.02.058-.113.049-.166.066-.047.025-.086.068-.14.068-.05 0-.13-.02-.136-.068-.01-.066.088-.133.15-.133.08-.031.184-.047.259-.005.019.009.036.03.03.05v.02h.003z" />
</svg>
);
}
21 changes: 20 additions & 1 deletion apps/web/src/components/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ import {
squashAtomCommandFailure,
} from "@t3tools/client-runtime/state/runtime";
import { isElectron } from "../env";
import { isDesktopLocalConnectionTarget } from "../connection/desktopLocal";
import {
resolveShortcutCommand,
shortcutLabelForCommand,
Expand Down Expand Up @@ -166,6 +167,7 @@ import {
type SnoozePreset,
} from "./Sidebar.snooze";
import { ProjectFavicon } from "./ProjectFavicon";
import { LinuxIcon } from "./LinuxIcon";
import { ProviderInstanceIcon } from "./chat/ProviderInstanceIcon";
import { getTriggerDisplayModelLabel } from "./chat/providerIconUtils";
import {
Expand Down Expand Up @@ -723,6 +725,7 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: {
jumpLabel: string | null;
currentEnvironmentId: string | null;
environmentLabel: string | null;
isDesktopLocalEnvironment: boolean;
projectCwd: string | null;
projectFaviconPath: string | null;
projectTitle: string | null;
Expand Down Expand Up @@ -1574,7 +1577,11 @@ const SidebarThreadRow = memo(function SidebarThreadRow(props: {
>
{isRemote ? (
<span className="inline-flex shrink-0 items-center text-sidebar-muted-foreground/70">
<ServerIcon aria-hidden className="size-3.5" />
{props.isDesktopLocalEnvironment ? (
<LinuxIcon aria-hidden className="size-3.5" />
Comment thread
macroscopeapp[bot] marked this conversation as resolved.
Outdated
) : (
<ServerIcon aria-hidden className="size-3.5" />
)}
</span>
) : null}
{driverKind ? (
Expand Down Expand Up @@ -1811,6 +1818,15 @@ export default function Sidebar() {
);
const { environments } = useEnvironments();
const primaryEnvironmentId = usePrimaryEnvironmentId();
const desktopLocalEnvironmentIds = useMemo(
() =>
new Set(
environments
.filter((environment) => isDesktopLocalConnectionTarget(environment.entry.target))
.map((environment) => environment.environmentId),
),
[environments],
);
const clearSelection = useThreadSelectionStore((s) => s.clearSelection);
const setSelectionAnchor = useThreadSelectionStore((s) => s.setAnchor);
const toggleThreadSelection = useThreadSelectionStore((s) => s.toggleThread);
Expand Down Expand Up @@ -3727,6 +3743,9 @@ export default function Sidebar() {
}
currentEnvironmentId={primaryEnvironmentId}
environmentLabel={environmentLabelById.get(thread.environmentId) ?? null}
isDesktopLocalEnvironment={desktopLocalEnvironmentIds.has(
thread.environmentId,
)}
projectCwd={
projectCwdByKey.get(`${thread.environmentId}:${thread.projectId}`) ?? null
}
Expand Down
Loading