From 6237bb0c1c41ef869d3147abf0d43fe0f1017c79 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 9 Apr 2026 11:21:17 -0700 Subject: [PATCH 1/4] Clarify environment picker labels - Label the primary environment as "This device" when appropriate - Group workspace and run-on options in the selectors - Reuse shared label resolution logic in chat and toolbar --- .../components/BranchToolbar.logic.test.ts | 49 ++++++++++++++++- .../web/src/components/BranchToolbar.logic.ts | 31 +++++++++++ .../BranchToolbarEnvModeSelector.tsx | 47 ++++++++++------ .../BranchToolbarEnvironmentSelector.tsx | 55 +++++++++++++------ apps/web/src/components/ChatView.tsx | 10 +++- 5 files changed, 154 insertions(+), 38 deletions(-) diff --git a/apps/web/src/components/BranchToolbar.logic.test.ts b/apps/web/src/components/BranchToolbar.logic.test.ts index 2f66e063ad..bcddf01ecd 100644 --- a/apps/web/src/components/BranchToolbar.logic.test.ts +++ b/apps/web/src/components/BranchToolbar.logic.test.ts @@ -1,14 +1,19 @@ -import type { GitBranch } from "@t3tools/contracts"; +import { EnvironmentId, type GitBranch } from "@t3tools/contracts"; import { describe, expect, it } from "vitest"; import { dedupeRemoteBranchesWithLocalMatches, deriveLocalBranchNameFromRemoteRef, + resolveEnvironmentOptionLabel, resolveBranchSelectionTarget, resolveDraftEnvModeAfterBranchChange, + resolveEnvModeLabel, resolveBranchToolbarValue, shouldIncludeBranchPickerItem, } from "./BranchToolbar.logic"; +const localEnvironmentId = EnvironmentId.makeUnsafe("environment-local"); +const remoteEnvironmentId = EnvironmentId.makeUnsafe("environment-remote"); + describe("resolveDraftEnvModeAfterBranchChange", () => { it("switches to local mode when returning from an existing worktree to the main worktree", () => { expect( @@ -76,6 +81,48 @@ describe("resolveBranchToolbarValue", () => { }); }); +describe("resolveEnvironmentOptionLabel", () => { + it("prefers the primary environment's machine label", () => { + expect( + resolveEnvironmentOptionLabel({ + isPrimary: true, + environmentId: localEnvironmentId, + runtimeLabel: "Julius's Mac mini", + savedLabel: "Local environment", + }), + ).toBe("Julius's Mac mini"); + }); + + it("falls back to 'This device' for generic primary labels", () => { + expect( + resolveEnvironmentOptionLabel({ + isPrimary: true, + environmentId: localEnvironmentId, + runtimeLabel: "Local environment", + savedLabel: "Local", + }), + ).toBe("This device"); + }); + + it("keeps configured labels for non-primary environments", () => { + expect( + resolveEnvironmentOptionLabel({ + isPrimary: false, + environmentId: remoteEnvironmentId, + runtimeLabel: null, + savedLabel: "Build box", + }), + ).toBe("Build box"); + }); +}); + +describe("resolveEnvModeLabel", () => { + it("uses explicit workspace labels", () => { + expect(resolveEnvModeLabel("local")).toBe("Current checkout"); + expect(resolveEnvModeLabel("worktree")).toBe("New worktree"); + }); +}); + describe("deriveLocalBranchNameFromRemoteRef", () => { it("strips the remote prefix from a remote ref", () => { expect(deriveLocalBranchNameFromRemoteRef("origin/feature/demo")).toBe("feature/demo"); diff --git a/apps/web/src/components/BranchToolbar.logic.ts b/apps/web/src/components/BranchToolbar.logic.ts index adc6495953..293ab15934 100644 --- a/apps/web/src/components/BranchToolbar.logic.ts +++ b/apps/web/src/components/BranchToolbar.logic.ts @@ -15,6 +15,37 @@ export interface EnvironmentOption { export const EnvMode = Schema.Literals(["local", "worktree"]); export type EnvMode = typeof EnvMode.Type; +const GENERIC_LOCAL_ENVIRONMENT_LABELS = new Set(["local", "local environment"]); + +function normalizeDisplayLabel(value: string | null | undefined): string | null { + const trimmed = value?.trim(); + return trimmed && trimmed.length > 0 ? trimmed : null; +} + +export function resolveEnvironmentOptionLabel(input: { + isPrimary: boolean; + environmentId: EnvironmentId; + runtimeLabel?: string | null; + savedLabel?: string | null; +}): string { + const runtimeLabel = normalizeDisplayLabel(input.runtimeLabel); + const savedLabel = normalizeDisplayLabel(input.savedLabel); + + if (input.isPrimary) { + const preferredLocalLabel = [runtimeLabel, savedLabel].find((label) => { + if (!label) return false; + return !GENERIC_LOCAL_ENVIRONMENT_LABELS.has(label.toLowerCase()); + }); + return preferredLocalLabel ?? "This device"; + } + + return runtimeLabel ?? savedLabel ?? input.environmentId; +} + +export function resolveEnvModeLabel(mode: EnvMode): string { + return mode === "worktree" ? "New worktree" : "Current checkout"; +} + export function resolveEffectiveEnvMode(input: { activeWorktreePath: string | null; hasServerThread: boolean; diff --git a/apps/web/src/components/BranchToolbarEnvModeSelector.tsx b/apps/web/src/components/BranchToolbarEnvModeSelector.tsx index e1145f65f4..0eb679eed1 100644 --- a/apps/web/src/components/BranchToolbarEnvModeSelector.tsx +++ b/apps/web/src/components/BranchToolbarEnvModeSelector.tsx @@ -1,12 +1,20 @@ import { FolderIcon, GitForkIcon } from "lucide-react"; import { memo } from "react"; -import type { EnvMode } from "./BranchToolbar.logic"; -import { Select, SelectItem, SelectPopup, SelectTrigger, SelectValue } from "./ui/select"; +import { resolveEnvModeLabel, type EnvMode } from "./BranchToolbar.logic"; +import { + Select, + SelectGroup, + SelectGroupLabel, + SelectItem, + SelectPopup, + SelectTrigger, + SelectValue, +} from "./ui/select"; const envModeItems = [ - { value: "local", label: "Local" }, - { value: "worktree", label: "New worktree" }, + { value: "local", label: resolveEnvModeLabel("local") }, + { value: "worktree", label: resolveEnvModeLabel("worktree") }, ] as const; interface BranchToolbarEnvModeSelectorProps { @@ -33,7 +41,7 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe ) : ( <> - Local + {resolveEnvModeLabel("local")} )} @@ -46,7 +54,7 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe onValueChange={(value) => onEnvModeChange(value as EnvMode)} items={envModeItems} > - + {effectiveEnvMode === "worktree" ? ( ) : ( @@ -55,18 +63,21 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe - - - - Local - - - - - - New worktree - - + + Workspace + + + + {resolveEnvModeLabel("local")} + + + + + + {resolveEnvModeLabel("worktree")} + + + ); diff --git a/apps/web/src/components/BranchToolbarEnvironmentSelector.tsx b/apps/web/src/components/BranchToolbarEnvironmentSelector.tsx index 1725e8e909..c4f5abfa5e 100644 --- a/apps/web/src/components/BranchToolbarEnvironmentSelector.tsx +++ b/apps/web/src/components/BranchToolbarEnvironmentSelector.tsx @@ -1,9 +1,17 @@ import type { EnvironmentId } from "@t3tools/contracts"; -import { CloudIcon, FolderIcon, ServerIcon } from "lucide-react"; +import { MonitorIcon, ServerIcon } from "lucide-react"; import { memo, useMemo } from "react"; import type { EnvironmentOption } from "./BranchToolbar.logic"; -import { Select, SelectItem, SelectPopup, SelectTrigger, SelectValue } from "./ui/select"; +import { + Select, + SelectGroup, + SelectGroupLabel, + SelectItem, + SelectPopup, + SelectTrigger, + SelectValue, +} from "./ui/select"; interface BranchToolbarEnvironmentSelectorProps { envLocked: boolean; @@ -18,8 +26,8 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir availableEnvironments, onEnvironmentChange, }: BranchToolbarEnvironmentSelectorProps) { - const activeEnvironmentLabel = useMemo(() => { - return availableEnvironments.find((env) => env.environmentId === environmentId)?.label ?? null; + const activeEnvironment = useMemo(() => { + return availableEnvironments.find((env) => env.environmentId === environmentId) ?? null; }, [availableEnvironments, environmentId]); const environmentItems = useMemo( @@ -34,8 +42,12 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir if (envLocked) { return ( - - {activeEnvironmentLabel ?? "Environment"} + {activeEnvironment?.isPrimary ? ( + + ) : ( + + )} + {activeEnvironment?.label ?? "Run on"} ); } @@ -46,19 +58,30 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir onValueChange={(value) => onEnvironmentChange(value as EnvironmentId)} items={environmentItems} > - - + + {activeEnvironment?.isPrimary ? ( + + ) : ( + + )} - {availableEnvironments.map((env) => ( - - - {env.isPrimary ? : } - {env.label} - - - ))} + + Run on + {availableEnvironments.map((env) => ( + + + {env.isPrimary ? ( + + ) : ( + + )} + {env.label} + + + ))} + ); diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 53bfe2324b..8702940b72 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -184,6 +184,7 @@ import { ComposerPrimaryActions } from "./chat/ComposerPrimaryActions"; import { ComposerPendingApprovalPanel } from "./chat/ComposerPendingApprovalPanel"; import { ComposerPendingUserInputPanel } from "./chat/ComposerPendingUserInputPanel"; import { ComposerPlanFollowUpBanner } from "./chat/ComposerPlanFollowUpBanner"; +import { resolveEnvironmentOptionLabel } from "./BranchToolbar.logic"; import { getComposerProviderState, renderProviderTraitsMenuContent, @@ -1029,9 +1030,12 @@ export default function ChatView(props: ChatViewProps) { const isPrimary = p.environmentId === primaryEnvironmentId; const savedRecord = savedEnvironmentRegistry[p.environmentId]; const runtimeState = savedEnvironmentRuntimeById[p.environmentId]; - const label = isPrimary - ? "Local" - : (runtimeState?.descriptor?.label ?? savedRecord?.label ?? p.environmentId); + const label = resolveEnvironmentOptionLabel({ + isPrimary, + environmentId: p.environmentId, + runtimeLabel: runtimeState?.descriptor?.label ?? null, + savedLabel: savedRecord?.label ?? null, + }); envs.push({ environmentId: p.environmentId, projectId: p.id, From 638670cb46ccfb97a1c0f1a0010dd979ff64a08f Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 9 Apr 2026 11:43:37 -0700 Subject: [PATCH 2/4] Clarify workspace picker labels and env mode - Show current checkout vs current worktree labels consistently - Lock env mode when a server thread is attached to a worktree - Update chat env mode derivation and selection behavior - Adjust picker icon labels and browser test viewport --- .../components/BranchToolbar.logic.test.ts | 34 +++++++++++++++++++ .../web/src/components/BranchToolbar.logic.ts | 14 ++++++-- apps/web/src/components/BranchToolbar.tsx | 3 +- .../BranchToolbarEnvModeSelector.tsx | 22 ++++++++---- .../BranchToolbarEnvironmentSelector.tsx | 8 ++--- apps/web/src/components/ChatView.browser.tsx | 2 +- apps/web/src/components/ChatView.tsx | 27 ++++++++++----- 7 files changed, 85 insertions(+), 25 deletions(-) diff --git a/apps/web/src/components/BranchToolbar.logic.test.ts b/apps/web/src/components/BranchToolbar.logic.test.ts index bcddf01ecd..6137b77c52 100644 --- a/apps/web/src/components/BranchToolbar.logic.test.ts +++ b/apps/web/src/components/BranchToolbar.logic.test.ts @@ -5,7 +5,9 @@ import { deriveLocalBranchNameFromRemoteRef, resolveEnvironmentOptionLabel, resolveBranchSelectionTarget, + resolveCurrentWorkspaceLabel, resolveDraftEnvModeAfterBranchChange, + resolveEffectiveEnvMode, resolveEnvModeLabel, resolveBranchToolbarValue, shouldIncludeBranchPickerItem, @@ -116,6 +118,28 @@ describe("resolveEnvironmentOptionLabel", () => { }); }); +describe("resolveEffectiveEnvMode", () => { + it("treats draft threads already attached to a worktree as current-checkout mode", () => { + expect( + resolveEffectiveEnvMode({ + activeWorktreePath: "/repo/.t3/worktrees/feature-a", + hasServerThread: false, + draftThreadEnvMode: "worktree", + }), + ).toBe("local"); + }); + + it("keeps explicit new-worktree mode for draft threads without a worktree path", () => { + expect( + resolveEffectiveEnvMode({ + activeWorktreePath: null, + hasServerThread: false, + draftThreadEnvMode: "worktree", + }), + ).toBe("worktree"); + }); +}); + describe("resolveEnvModeLabel", () => { it("uses explicit workspace labels", () => { expect(resolveEnvModeLabel("local")).toBe("Current checkout"); @@ -123,6 +147,16 @@ describe("resolveEnvModeLabel", () => { }); }); +describe("resolveCurrentWorkspaceLabel", () => { + it("describes the main repo checkout when no worktree path is active", () => { + expect(resolveCurrentWorkspaceLabel(null)).toBe("Current checkout"); + }); + + it("describes the active checkout as a worktree when one is attached", () => { + expect(resolveCurrentWorkspaceLabel("/repo/.t3/worktrees/feature-a")).toBe("Current worktree"); + }); +}); + describe("deriveLocalBranchNameFromRemoteRef", () => { it("strips the remote prefix from a remote ref", () => { expect(deriveLocalBranchNameFromRemoteRef("origin/feature/demo")).toBe("feature/demo"); diff --git a/apps/web/src/components/BranchToolbar.logic.ts b/apps/web/src/components/BranchToolbar.logic.ts index 293ab15934..54ec4370f4 100644 --- a/apps/web/src/components/BranchToolbar.logic.ts +++ b/apps/web/src/components/BranchToolbar.logic.ts @@ -46,15 +46,23 @@ export function resolveEnvModeLabel(mode: EnvMode): string { return mode === "worktree" ? "New worktree" : "Current checkout"; } +export function resolveCurrentWorkspaceLabel(activeWorktreePath: string | null): string { + return activeWorktreePath ? "Current worktree" : resolveEnvModeLabel("local"); +} + export function resolveEffectiveEnvMode(input: { activeWorktreePath: string | null; hasServerThread: boolean; draftThreadEnvMode: EnvMode | undefined; }): EnvMode { const { activeWorktreePath, hasServerThread, draftThreadEnvMode } = input; - return activeWorktreePath || (!hasServerThread && draftThreadEnvMode === "worktree") - ? "worktree" - : "local"; + if (!hasServerThread) { + if (activeWorktreePath) { + return "local"; + } + return draftThreadEnvMode === "worktree" ? "worktree" : "local"; + } + return activeWorktreePath ? "worktree" : "local"; } export function resolveDraftEnvModeAfterBranchChange(input: { diff --git a/apps/web/src/components/BranchToolbar.tsx b/apps/web/src/components/BranchToolbar.tsx index 94d11ae7bd..10e6023a41 100644 --- a/apps/web/src/components/BranchToolbar.tsx +++ b/apps/web/src/components/BranchToolbar.tsx @@ -62,6 +62,7 @@ export function BranchToolbar({ hasServerThread: serverThread !== undefined, draftThreadEnvMode: draftThread?.envMode, }); + const envModeLocked = envLocked || (serverThread !== undefined && activeWorktreePath !== null); const showEnvironmentPicker = availableEnvironments && availableEnvironments.length > 1 && onEnvironmentChange; @@ -83,7 +84,7 @@ export function BranchToolbar({ )} {activeWorktreePath ? ( <> - Worktree + {resolveCurrentWorkspaceLabel(activeWorktreePath)} ) : ( <> - {resolveEnvModeLabel("local")} + {resolveCurrentWorkspaceLabel(activeWorktreePath)} )} @@ -55,7 +59,7 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe items={envModeItems} > - {effectiveEnvMode === "worktree" ? ( + {effectiveEnvMode === "worktree" || activeWorktreePath ? ( ) : ( @@ -67,8 +71,12 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe Workspace - - {resolveEnvModeLabel("local")} + {activeWorktreePath ? ( + + ) : ( + + )} + {resolveCurrentWorkspaceLabel(activeWorktreePath)} diff --git a/apps/web/src/components/BranchToolbarEnvironmentSelector.tsx b/apps/web/src/components/BranchToolbarEnvironmentSelector.tsx index c4f5abfa5e..abfa21365e 100644 --- a/apps/web/src/components/BranchToolbarEnvironmentSelector.tsx +++ b/apps/web/src/components/BranchToolbarEnvironmentSelector.tsx @@ -1,5 +1,5 @@ import type { EnvironmentId } from "@t3tools/contracts"; -import { MonitorIcon, ServerIcon } from "lucide-react"; +import { CloudIcon, MonitorIcon } from "lucide-react"; import { memo, useMemo } from "react"; import type { EnvironmentOption } from "./BranchToolbar.logic"; @@ -45,7 +45,7 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir {activeEnvironment?.isPrimary ? ( ) : ( - + )} {activeEnvironment?.label ?? "Run on"} @@ -62,7 +62,7 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir {activeEnvironment?.isPrimary ? ( ) : ( - + )} @@ -75,7 +75,7 @@ export const BranchToolbarEnvironmentSelector = memo(function BranchToolbarEnvir {env.isPrimary ? ( ) : ( - + )} {env.label} diff --git a/apps/web/src/components/ChatView.browser.tsx b/apps/web/src/components/ChatView.browser.tsx index ae2397d316..98a0e0f7bb 100644 --- a/apps/web/src/components/ChatView.browser.tsx +++ b/apps/web/src/components/ChatView.browser.tsx @@ -1993,7 +1993,7 @@ describe("ChatView timeline estimator parity (full app)", () => { }); const mounted = await mountChatView({ - viewport: DEFAULT_VIEWPORT, + viewport: WIDE_FOOTER_VIEWPORT, snapshot: withProjectScripts(createDraftOnlySnapshot(), [ { id: "setup", diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index e4dd94d450..578c679798 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -187,7 +187,7 @@ import { ComposerPrimaryActions } from "./chat/ComposerPrimaryActions"; import { ComposerPendingApprovalPanel } from "./chat/ComposerPendingApprovalPanel"; import { ComposerPendingUserInputPanel } from "./chat/ComposerPendingUserInputPanel"; import { ComposerPlanFollowUpBanner } from "./chat/ComposerPlanFollowUpBanner"; -import { resolveEnvironmentOptionLabel } from "./BranchToolbar.logic"; +import { resolveEffectiveEnvMode, resolveEnvironmentOptionLabel } from "./BranchToolbar.logic"; import { getComposerProviderState, renderProviderTraitsMenuContent, @@ -2894,12 +2894,12 @@ export default function ChatView(props: ChatViewProps) { return () => window.removeEventListener("keydown", onKeyDown); }, [closeExpandedImage, expandedImage, navigateExpandedImage]); - const activeWorktreePath = activeThread?.worktreePath; - const envMode: DraftThreadEnvMode = activeWorktreePath - ? "worktree" - : isLocalDraftThread - ? (draftThread?.envMode ?? "local") - : "local"; + const activeWorktreePath = activeThread?.worktreePath ?? null; + const envMode: DraftThreadEnvMode = resolveEffectiveEnvMode({ + activeWorktreePath, + hasServerThread: isServerThread, + draftThreadEnvMode: isLocalDraftThread ? draftThread?.envMode : undefined, + }); useEffect(() => { if (!activeThreadId) { @@ -4035,11 +4035,20 @@ export default function ChatView(props: ChatViewProps) { const onEnvModeChange = useCallback( (mode: DraftThreadEnvMode) => { if (isLocalDraftThread) { - setDraftThreadContext(composerDraftTarget, { envMode: mode }); + setDraftThreadContext(composerDraftTarget, { + envMode: mode, + ...(mode === "worktree" && draftThread?.worktreePath ? { worktreePath: null } : {}), + }); } scheduleComposerFocus(); }, - [composerDraftTarget, isLocalDraftThread, scheduleComposerFocus, setDraftThreadContext], + [ + composerDraftTarget, + draftThread?.worktreePath, + isLocalDraftThread, + scheduleComposerFocus, + setDraftThreadContext, + ], ); const applyPromptReplacement = useCallback( From d85ffd5dc0484bee56fc8f1a4c05ca6e89d938b8 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 9 Apr 2026 12:36:55 -0700 Subject: [PATCH 3/4] Clarify environment picker labels - Show the current workspace label for local mode - Keep worktree label unchanged --- .../components/BranchToolbarEnvModeSelector.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/BranchToolbarEnvModeSelector.tsx b/apps/web/src/components/BranchToolbarEnvModeSelector.tsx index 10b6eab00c..4fa540b995 100644 --- a/apps/web/src/components/BranchToolbarEnvModeSelector.tsx +++ b/apps/web/src/components/BranchToolbarEnvModeSelector.tsx @@ -1,5 +1,5 @@ import { FolderIcon, GitForkIcon } from "lucide-react"; -import { memo } from "react"; +import { memo, useMemo } from "react"; import { resolveCurrentWorkspaceLabel, @@ -16,11 +16,6 @@ import { SelectValue, } from "./ui/select"; -const envModeItems = [ - { value: "local", label: resolveEnvModeLabel("local") }, - { value: "worktree", label: resolveEnvModeLabel("worktree") }, -] as const; - interface BranchToolbarEnvModeSelectorProps { envLocked: boolean; effectiveEnvMode: EnvMode; @@ -34,6 +29,14 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe activeWorktreePath, onEnvModeChange, }: BranchToolbarEnvModeSelectorProps) { + const envModeItems = useMemo( + () => [ + { value: "local", label: resolveCurrentWorkspaceLabel(activeWorktreePath) }, + { value: "worktree", label: resolveEnvModeLabel("worktree") }, + ], + [activeWorktreePath], + ); + if (envLocked) { return ( From 72cb14f2335c15853dc328ded7111f07f964423f Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Thu, 9 Apr 2026 12:42:47 -0700 Subject: [PATCH 4/4] Clarify workspace picker labels - Use distinct folder/git icons for local and worktree modes - Improve toolbar and menu affordance when a worktree is active --- .../components/BranchToolbarEnvModeSelector.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/BranchToolbarEnvModeSelector.tsx b/apps/web/src/components/BranchToolbarEnvModeSelector.tsx index 4fa540b995..39bf50359d 100644 --- a/apps/web/src/components/BranchToolbarEnvModeSelector.tsx +++ b/apps/web/src/components/BranchToolbarEnvModeSelector.tsx @@ -1,4 +1,4 @@ -import { FolderIcon, GitForkIcon } from "lucide-react"; +import { FolderGit2Icon, FolderGitIcon, FolderIcon } from "lucide-react"; import { memo, useMemo } from "react"; import { @@ -42,7 +42,7 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe {activeWorktreePath ? ( <> - + {resolveCurrentWorkspaceLabel(activeWorktreePath)} ) : ( @@ -62,8 +62,10 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe items={envModeItems} > - {effectiveEnvMode === "worktree" || activeWorktreePath ? ( - + {effectiveEnvMode === "worktree" ? ( + + ) : activeWorktreePath ? ( + ) : ( )} @@ -75,7 +77,7 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe {activeWorktreePath ? ( - + ) : ( )} @@ -84,7 +86,7 @@ export const BranchToolbarEnvModeSelector = memo(function BranchToolbarEnvModeSe - + {resolveEnvModeLabel("worktree")}