From b1d43f264b36483307efc341cd2524bf72fc30d3 Mon Sep 17 00:00:00 2001 From: Lifei Zhou Date: Fri, 17 Apr 2026 18:33:13 +1000 Subject: [PATCH 1/7] Rename path-related variables to reflect their purpose --- ui/goose2/src/app/AppShell.tsx | 20 ++--- .../__tests__/useChat.attachments.test.ts | 2 +- .../chat/hooks/__tests__/useChat.test.ts | 2 +- .../stores/__tests__/chatSessionStore.test.ts | 2 +- .../features/chat/stores/chatSessionStore.ts | 26 +++---- ui/goose2/src/features/chat/ui/ChatView.tsx | 78 +++++++++---------- .../src/features/chat/ui/ContextPanel.tsx | 30 +++---- .../chat/ui/widgets/WorkingContextPicker.tsx | 8 +- .../chat/ui/widgets/WorkspaceActionsMenu.tsx | 6 +- .../chat/ui/widgets/WorkspaceCreateDialog.tsx | 4 +- .../chat/ui/widgets/WorkspaceWidget.tsx | 20 ++--- .../projects/lib/chatProjectContext.test.ts | 38 ++++----- .../projects/lib/chatProjectContext.ts | 35 ++++++--- 13 files changed, 141 insertions(+), 130 deletions(-) diff --git a/ui/goose2/src/app/AppShell.tsx b/ui/goose2/src/app/AppShell.tsx index 6c316b98f9ac..eaa49ee37b4a 100644 --- a/ui/goose2/src/app/AppShell.tsx +++ b/ui/goose2/src/app/AppShell.tsx @@ -22,7 +22,7 @@ import { getAndDeleteReplayBuffer, } from "@/features/chat/hooks/replayBuffer"; import { getHomeDir } from "@/shared/api/system"; -import { resolveEffectiveWorkingDir } from "@/features/projects/lib/chatProjectContext"; +import { resolveDefaultSessionCwd } from "@/features/projects/lib/chatProjectContext"; export type AppView = | "home" @@ -93,12 +93,12 @@ export function AppShell({ children }: { children?: React.ReactNode }) { .projects.find((candidate) => candidate.id === session.projectId) ?? null) : null; - const workingDir = - resolveEffectiveWorkingDir(project) ?? + const sessionCwd = + resolveDefaultSessionCwd(project) ?? (!project - ? resolveEffectiveWorkingDir(null, await getHomeDir()) + ? resolveDefaultSessionCwd(null, await getHomeDir()) : undefined); - await acpLoadSession(sessionId, gooseSessionId, workingDir); + await acpLoadSession(sessionId, gooseSessionId, sessionCwd); useChatStore.getState().setSessionLoading(sessionId, false); const buffer = getAndDeleteReplayBuffer(sessionId); if (buffer && buffer.length > 0) { @@ -315,19 +315,19 @@ export function AppShell({ children }: { children?: React.ReactNode }) { : (useProjectStore .getState() .projects.find((project) => project.id === projectId) ?? null); - const nextWorkingDir = - resolveEffectiveWorkingDir(nextProject) ?? + const nextSessionCwd = + resolveDefaultSessionCwd(nextProject) ?? (nextProject == null - ? resolveEffectiveWorkingDir(null, await getHomeDir()) + ? resolveDefaultSessionCwd(null, await getHomeDir()) : undefined); - if (!nextWorkingDir) { + if (!nextSessionCwd) { return; } await acpPrepareSession( sessionId, session.providerId ?? agentStore.selectedProvider ?? "goose", { - workingDir: nextWorkingDir, + workingDir: nextSessionCwd, personaId: session.personaId, }, ); diff --git a/ui/goose2/src/features/chat/hooks/__tests__/useChat.attachments.test.ts b/ui/goose2/src/features/chat/hooks/__tests__/useChat.attachments.test.ts index da14807a0702..2cf709efe792 100644 --- a/ui/goose2/src/features/chat/hooks/__tests__/useChat.attachments.test.ts +++ b/ui/goose2/src/features/chat/hooks/__tests__/useChat.attachments.test.ts @@ -32,7 +32,7 @@ describe("useChat attachments", () => { activeSessionId: null, isLoading: false, contextPanelOpenBySession: {}, - activeWorkingContextBySession: {}, + activeWorkspaceBySession: {}, modelsBySession: {}, modelCacheByProvider: {}, }); diff --git a/ui/goose2/src/features/chat/hooks/__tests__/useChat.test.ts b/ui/goose2/src/features/chat/hooks/__tests__/useChat.test.ts index 546bcfc7c472..6a650b695f70 100644 --- a/ui/goose2/src/features/chat/hooks/__tests__/useChat.test.ts +++ b/ui/goose2/src/features/chat/hooks/__tests__/useChat.test.ts @@ -65,7 +65,7 @@ describe("useChat", () => { activeSessionId: null, isLoading: false, contextPanelOpenBySession: {}, - activeWorkingContextBySession: {}, + activeWorkspaceBySession: {}, modelsBySession: {}, modelCacheByProvider: {}, }); diff --git a/ui/goose2/src/features/chat/stores/__tests__/chatSessionStore.test.ts b/ui/goose2/src/features/chat/stores/__tests__/chatSessionStore.test.ts index 202909ad233f..497869fa5d88 100644 --- a/ui/goose2/src/features/chat/stores/__tests__/chatSessionStore.test.ts +++ b/ui/goose2/src/features/chat/stores/__tests__/chatSessionStore.test.ts @@ -20,7 +20,7 @@ function resetStore() { activeSessionId: null, isLoading: false, contextPanelOpenBySession: {}, - activeWorkingContextBySession: {}, + activeWorkspaceBySession: {}, modelsBySession: {}, modelCacheByProvider: {}, }); diff --git a/ui/goose2/src/features/chat/stores/chatSessionStore.ts b/ui/goose2/src/features/chat/stores/chatSessionStore.ts index 8915037b4613..a1c30b948880 100644 --- a/ui/goose2/src/features/chat/stores/chatSessionStore.ts +++ b/ui/goose2/src/features/chat/stores/chatSessionStore.ts @@ -37,7 +37,7 @@ export interface ChatSession { userSetName?: boolean; } -export interface WorkingContext { +export interface ActiveWorkspace { path: string; branch: string | null; } @@ -47,7 +47,7 @@ interface ChatSessionStoreState { activeSessionId: string | null; isLoading: boolean; contextPanelOpenBySession: Record; - activeWorkingContextBySession: Record; + activeWorkspaceBySession: Record; modelsBySession: Record; modelCacheByProvider: Record; } @@ -83,8 +83,8 @@ interface ChatSessionStoreActions { setActiveSession: (sessionId: string | null) => void; setContextPanelOpen: (sessionId: string, open: boolean) => void; - setActiveWorkingContext: (sessionId: string, context: WorkingContext) => void; - clearActiveWorkingContext: (sessionId: string) => void; + setActiveWorkspace: (sessionId: string, context: ActiveWorkspace) => void; + clearActiveWorkspace: (sessionId: string) => void; setSessionModels: (sessionId: string, models: ModelOption[]) => void; switchSessionProvider: ( sessionId: string, @@ -300,7 +300,7 @@ export const useChatSessionStore = create((set, get) => ({ activeSessionId: null, isLoading: false, contextPanelOpenBySession: {}, - activeWorkingContextBySession: {}, + activeWorkspaceBySession: {}, modelsBySession: {}, modelCacheByProvider: loadModelCache(), @@ -346,7 +346,7 @@ export const useChatSessionStore = create((set, get) => ({ const { [id]: _ignoredPanelState, ...remainingPanelState } = get().contextPanelOpenBySession; const { [id]: _ignoredContext, ...remainingContextState } = - get().activeWorkingContextBySession; + get().activeWorkspaceBySession; const remainingModels = { ...get().modelsBySession }; delete remainingModels[id]; set((state) => ({ @@ -354,7 +354,7 @@ export const useChatSessionStore = create((set, get) => ({ activeSessionId: state.activeSessionId === id ? null : state.activeSessionId, contextPanelOpenBySession: remainingPanelState, - activeWorkingContextBySession: remainingContextState, + activeWorkspaceBySession: remainingContextState, modelsBySession: remainingModels, })); removeDraftSessionRecord(id); @@ -544,19 +544,19 @@ export const useChatSessionStore = create((set, get) => ({ })); }, - setActiveWorkingContext: (sessionId, context) => { + setActiveWorkspace: (sessionId, context) => { set((state) => ({ - activeWorkingContextBySession: { - ...state.activeWorkingContextBySession, + activeWorkspaceBySession: { + ...state.activeWorkspaceBySession, [sessionId]: context, }, })); }, - clearActiveWorkingContext: (sessionId) => { + clearActiveWorkspace: (sessionId) => { set((state) => { - const { [sessionId]: _, ...rest } = state.activeWorkingContextBySession; - return { activeWorkingContextBySession: rest }; + const { [sessionId]: _, ...rest } = state.activeWorkspaceBySession; + return { activeWorkspaceBySession: rest }; }); }, diff --git a/ui/goose2/src/features/chat/ui/ChatView.tsx b/ui/goose2/src/features/chat/ui/ChatView.tsx index 0478343dae04..698ab4d80f3c 100644 --- a/ui/goose2/src/features/chat/ui/ChatView.tsx +++ b/ui/goose2/src/features/chat/ui/ChatView.tsx @@ -17,9 +17,9 @@ import { acpPrepareSession, acpSetModel } from "@/shared/api/acp"; import { buildProjectSystemPrompt, composeSystemPrompt, - defaultArtifactsDir, + defaultGlobalArtifactRoot, getProjectArtifactRoots, - resolveProjectWorkingDir, + resolveProjectDefaultArtifactRoot, } from "@/features/projects/lib/chatProjectContext"; import { getHomeDir } from "@/shared/api/system"; import { ArtifactPolicyProvider } from "../hooks/ArtifactPolicyContext"; @@ -55,11 +55,11 @@ export function ChatView({ (s) => s.contextPanelOpenBySession[activeSessionId] ?? false, ); const setContextPanelOpen = useChatSessionStore((s) => s.setContextPanelOpen); - const activeWorkingContext = useChatSessionStore( - (s) => s.activeWorkingContextBySession[activeSessionId], + const activeWorkspace = useChatSessionStore( + (s) => s.activeWorkspaceBySession[activeSessionId], ); - const clearActiveWorkingContext = useChatSessionStore( - (s) => s.clearActiveWorkingContext, + const clearActiveWorkspace = useChatSessionStore( + (s) => s.clearActiveWorkspace, ); const { @@ -85,7 +85,7 @@ export function ChatView({ ? s.projects.find((candidate) => candidate.id === session.projectId) : undefined, ); - const [homeArtifactsRoot, setHomeArtifactsRoot] = useState( + const [globalArtifactRoot, setGlobalArtifactRoot] = useState( null, ); const project = storedProject ?? null; @@ -115,36 +115,36 @@ export function ChatView({ () => getProjectArtifactRoots(project), [project], ); - const resolvedProjectWorkingDir = useMemo( - () => resolveProjectWorkingDir(project), + const projectDefaultArtifactRoot = useMemo( + () => resolveProjectDefaultArtifactRoot(project), [project], ); const projectMetadataPending = Boolean( - session?.projectId && !resolvedProjectWorkingDir && projectsLoading, + session?.projectId && !projectDefaultArtifactRoot && projectsLoading, ); - const defaultWorkingDir = resolvedProjectWorkingDir - ? resolvedProjectWorkingDir + const defaultSessionCwd = projectDefaultArtifactRoot + ? projectDefaultArtifactRoot : !session?.projectId - ? (homeArtifactsRoot ?? undefined) + ? (globalArtifactRoot ?? undefined) : undefined; - const effectiveWorkingDir = activeWorkingContext?.path ?? defaultWorkingDir; + const effectiveSessionCwd = activeWorkspace?.path ?? defaultSessionCwd; const allowedArtifactRoots = useMemo(() => { const roots = [ ...projectArtifactRoots.map((path) => path.trim()).filter(Boolean), ]; - if (homeArtifactsRoot) { - roots.push(homeArtifactsRoot); + if (globalArtifactRoot) { + roots.push(globalArtifactRoot); } return [...new Set(roots)]; - }, [homeArtifactsRoot, projectArtifactRoots]); + }, [globalArtifactRoot, projectArtifactRoots]); const projectSystemPrompt = useMemo( () => buildProjectSystemPrompt(project), [project], ); const workingContextPrompt = useMemo(() => { - if (!activeWorkingContext?.branch) return undefined; - return `\nActive branch: ${activeWorkingContext.branch}\nWorking directory: ${activeWorkingContext.path}\n`; - }, [activeWorkingContext?.branch, activeWorkingContext?.path]); + if (!activeWorkspace?.branch) return undefined; + return `\nActive branch: ${activeWorkspace.branch}\nWorking directory: ${activeWorkspace.path}\n`; + }, [activeWorkspace?.branch, activeWorkspace?.path]); const effectiveSystemPrompt = useMemo( () => @@ -161,11 +161,11 @@ export function ChatView({ getHomeDir() .then((homeDir) => { if (cancelled) return; - setHomeArtifactsRoot(defaultArtifactsDir(homeDir)); + setGlobalArtifactRoot(defaultGlobalArtifactRoot(homeDir)); }) .catch(() => { if (cancelled) return; - setHomeArtifactsRoot(null); + setGlobalArtifactRoot(null); }); return () => { cancelled = true; @@ -177,31 +177,31 @@ export function ChatView({ const prevProjectId = prevProjectIdRef.current; prevProjectIdRef.current = session?.projectId; if (prevProjectId !== undefined && prevProjectId !== session?.projectId) { - clearActiveWorkingContext(activeSessionId); + clearActiveWorkspace(activeSessionId); } - }, [session?.projectId, activeSessionId, clearActiveWorkingContext]); + }, [session?.projectId, activeSessionId, clearActiveWorkspace]); - const prevContextRef = useRef(activeWorkingContext); + const prevWorkspaceRef = useRef(activeWorkspace); useEffect(() => { - const prev = prevContextRef.current; + const prev = prevWorkspaceRef.current; if ( - !activeWorkingContext || + !activeWorkspace || !selectedProvider || session?.draft || - activeWorkingContext === prev + activeWorkspace === prev ) { return; } - prevContextRef.current = activeWorkingContext; - if (prev && prev.path === activeWorkingContext.path) return; + prevWorkspaceRef.current = activeWorkspace; + if (prev && prev.path === activeWorkspace.path) return; void acpPrepareSession(activeSessionId, selectedProvider, { - workingDir: activeWorkingContext.path, + workingDir: activeWorkspace.path, personaId: selectedPersonaId ?? undefined, }).catch((error) => { console.error("Failed to prepare ACP session:", error); }); }, [ - activeWorkingContext, + activeWorkspace, activeSessionId, selectedProvider, selectedPersonaId, @@ -230,17 +230,17 @@ export function ChatView({ .getState() .projects.find((candidate) => candidate.id === projectId) ?? null); - const nextWorkingDir = - resolveProjectWorkingDir(nextProject) ?? - (projectId == null ? (homeArtifactsRoot ?? undefined) : undefined); + const nextSessionCwd = + resolveProjectDefaultArtifactRoot(nextProject) ?? + (projectId == null ? (globalArtifactRoot ?? undefined) : undefined); useChatSessionStore .getState() .updateSession(activeSessionId, { projectId }); - if (!session?.draft && selectedProvider && nextWorkingDir) { + if (!session?.draft && selectedProvider && nextSessionCwd) { void acpPrepareSession(activeSessionId, selectedProvider, { - workingDir: nextWorkingDir, + workingDir: nextSessionCwd, personaId: selectedPersonaId ?? undefined, }).catch((error) => { console.error( @@ -252,7 +252,7 @@ export function ChatView({ }, [ activeSessionId, - homeArtifactsRoot, + globalArtifactRoot, selectedPersonaId, selectedProvider, session?.draft, @@ -343,7 +343,7 @@ export function ChatView({ selectedProvider, effectiveSystemPrompt, personaInfo, - effectiveWorkingDir, + effectiveSessionCwd, ); const isLoadingHistory = useChatStore( (s) => diff --git a/ui/goose2/src/features/chat/ui/ContextPanel.tsx b/ui/goose2/src/features/chat/ui/ContextPanel.tsx index 69e804d0a431..4c392d0f75e3 100644 --- a/ui/goose2/src/features/chat/ui/ContextPanel.tsx +++ b/ui/goose2/src/features/chat/ui/ContextPanel.tsx @@ -15,7 +15,7 @@ import { import type { CreatedWorktree } from "@/shared/types/git"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/shared/ui/tabs"; import { useChatSessionStore } from "../stores/chatSessionStore"; -import type { WorkingContext } from "../stores/chatSessionStore"; +import type { ActiveWorkspace } from "../stores/chatSessionStore"; import { WorkspaceWidget } from "./widgets/WorkspaceWidget"; import { ChangesWidget } from "./widgets/ChangesWidget"; import { ArtifactsWidget } from "./widgets/ArtifactsWidget"; @@ -39,35 +39,35 @@ export function ContextPanel({ }: ContextPanelProps) { const { t } = useTranslation("chat"); const [activeTab, setActiveTab] = useState("details"); - const primaryWorkingDir = projectWorkingDirs[0] ?? null; + const primaryWorkspaceRoot = projectWorkingDirs[0] ?? null; const activeContext = useChatSessionStore( - (s) => s.activeWorkingContextBySession[sessionId], + (s) => s.activeWorkspaceBySession[sessionId], ); - const setActiveWorkingContext = useChatSessionStore( - (s) => s.setActiveWorkingContext, + const setActiveWorkspace = useChatSessionStore( + (s) => s.setActiveWorkspace, ); - const gitQueryPath = activeContext?.path ?? primaryWorkingDir; + const gitTargetPath = activeContext?.path ?? primaryWorkspaceRoot; const { data: gitState, error, isLoading, isFetching, refetch, - } = useGitState(gitQueryPath, activeTab === "details"); + } = useGitState(gitTargetPath, activeTab === "details"); const { data: changedFiles, isLoading: isFilesLoading, refetch: refetchFiles, - } = useChangedFiles(gitQueryPath, activeTab === "details"); + } = useChangedFiles(gitTargetPath, activeTab === "details"); const handleContextChange = useCallback( - (context: WorkingContext) => { - setActiveWorkingContext(sessionId, context); + (context: ActiveWorkspace) => { + setActiveWorkspace(sessionId, context); }, - [sessionId, setActiveWorkingContext], + [sessionId, setActiveWorkspace], ); const refetchAll = useCallback(async () => { @@ -149,11 +149,11 @@ export function ContextPanel({ const handleOpenChangedFile = useCallback( (filePath: string) => { - if (!gitQueryPath) return; - const fullPath = `${gitQueryPath}/${filePath}`; + if (!gitTargetPath) return; + const fullPath = `${gitTargetPath}/${filePath}`; void openPath(fullPath); }, - [gitQueryPath], + [gitTargetPath], ); const handleRefresh = useCallback(() => { @@ -202,7 +202,7 @@ export function ContextPanel({ files={changedFiles} isLoading={isFilesLoading} currentBranch={gitState?.currentBranch ?? null} - repoPath={gitQueryPath ?? ""} + repoPath={gitTargetPath ?? ""} onOpenFile={handleOpenChangedFile} /> diff --git a/ui/goose2/src/features/chat/ui/widgets/WorkingContextPicker.tsx b/ui/goose2/src/features/chat/ui/widgets/WorkingContextPicker.tsx index 1fc4cf86d198..87c1787c8d2f 100644 --- a/ui/goose2/src/features/chat/ui/widgets/WorkingContextPicker.tsx +++ b/ui/goose2/src/features/chat/ui/widgets/WorkingContextPicker.tsx @@ -20,13 +20,13 @@ import { import { buttonVariants } from "@/shared/ui/button"; import { cn } from "@/shared/lib/cn"; import type { GitState } from "@/shared/types/git"; -import type { WorkingContext } from "../../stores/chatSessionStore"; +import type { ActiveWorkspace } from "../../stores/chatSessionStore"; interface WorkingContextPickerProps { currentProjectPath: string | null; gitState: GitState | undefined; - activeContext: WorkingContext | undefined; - onSelect: (context: WorkingContext) => void; + activeContext: ActiveWorkspace | undefined; + onSelect: (context: ActiveWorkspace) => void; onSwitchBranch: (path: string, branch: string) => Promise; onStashAndSwitch: (path: string, branch: string) => Promise; } @@ -63,7 +63,7 @@ export function WorkingContextPicker({ }: WorkingContextPickerProps) { const { t } = useTranslation("chat"); const [open, setOpen] = useState(false); - const [pendingSwitch, setPendingSwitch] = useState( + const [pendingSwitch, setPendingSwitch] = useState( null, ); const [switching, setSwitching] = useState(false); diff --git a/ui/goose2/src/features/chat/ui/widgets/WorkspaceActionsMenu.tsx b/ui/goose2/src/features/chat/ui/widgets/WorkspaceActionsMenu.tsx index 184554a9d921..0aff95e64863 100644 --- a/ui/goose2/src/features/chat/ui/widgets/WorkspaceActionsMenu.tsx +++ b/ui/goose2/src/features/chat/ui/widgets/WorkspaceActionsMenu.tsx @@ -5,7 +5,7 @@ import type { CreatedWorktree, GitState } from "@/shared/types/git"; import { Button } from "@/shared/ui/button"; import { SplitButton } from "@/shared/ui/split-button"; import { Spinner } from "@/shared/ui/spinner"; -import type { WorkingContext } from "../../stores/chatSessionStore"; +import type { ActiveWorkspace } from "../../stores/chatSessionStore"; import { formatErrorMessage } from "./formatError"; import { WorkspaceCreateDialog, @@ -15,9 +15,9 @@ import { interface WorkspaceActionsMenuProps { currentProjectPath: string; gitState: GitState; - activeContext: WorkingContext | undefined; + activeContext: ActiveWorkspace | undefined; disabled?: boolean; - onContextChange: (context: WorkingContext) => void; + onContextChange: (context: ActiveWorkspace) => void; onFetch: (path: string) => Promise; onPull: (path: string) => Promise; onCreateBranch: ( diff --git a/ui/goose2/src/features/chat/ui/widgets/WorkspaceCreateDialog.tsx b/ui/goose2/src/features/chat/ui/widgets/WorkspaceCreateDialog.tsx index 78bd26e4e0f2..5d8963dbfbd9 100644 --- a/ui/goose2/src/features/chat/ui/widgets/WorkspaceCreateDialog.tsx +++ b/ui/goose2/src/features/chat/ui/widgets/WorkspaceCreateDialog.tsx @@ -21,7 +21,7 @@ import { SelectTrigger, SelectValue, } from "@/shared/ui/select"; -import type { WorkingContext } from "../../stores/chatSessionStore"; +import type { ActiveWorkspace } from "../../stores/chatSessionStore"; import { formatErrorMessage } from "./formatError"; import { shortenPath } from "./WorkingContextPicker"; @@ -35,7 +35,7 @@ interface WorkspaceCreateDialogProps { currentPath: string; activeBranch: string | null; onClose: () => void; - onContextChange: (context: WorkingContext) => void; + onContextChange: (context: ActiveWorkspace) => void; onCreateBranch: ( path: string, name: string, diff --git a/ui/goose2/src/features/chat/ui/widgets/WorkspaceWidget.tsx b/ui/goose2/src/features/chat/ui/widgets/WorkspaceWidget.tsx index 695be9f44cb4..752a925ad37b 100644 --- a/ui/goose2/src/features/chat/ui/widgets/WorkspaceWidget.tsx +++ b/ui/goose2/src/features/chat/ui/widgets/WorkspaceWidget.tsx @@ -3,7 +3,7 @@ import { IconFolder, IconGitBranch, IconRefresh } from "@tabler/icons-react"; import type { CreatedWorktree, GitState } from "@/shared/types/git"; import { Button } from "@/shared/ui/button"; import { Spinner } from "@/shared/ui/spinner"; -import type { WorkingContext } from "../../stores/chatSessionStore"; +import type { ActiveWorkspace } from "../../stores/chatSessionStore"; import { Widget } from "./Widget"; import { WorkspaceActionsMenu } from "./WorkspaceActionsMenu"; import { WorkingContextPicker, shortenPath } from "./WorkingContextPicker"; @@ -16,8 +16,8 @@ interface WorkspaceWidgetProps { isLoading: boolean; isFetching: boolean; error: Error | null; - activeContext: WorkingContext | undefined; - onContextChange: (context: WorkingContext) => void; + activeContext: ActiveWorkspace | undefined; + onContextChange: (context: ActiveWorkspace) => void; onSwitchBranch: (path: string, branch: string) => Promise; onStashAndSwitch: (path: string, branch: string) => Promise; onInitRepo: (path: string) => Promise; @@ -58,7 +58,7 @@ export function WorkspaceWidget({ onRefresh, }: WorkspaceWidgetProps) { const { t } = useTranslation("chat"); - const primaryWorkingDir = projectWorkingDirs[0] ?? null; + const primaryWorkspaceRoot = projectWorkingDirs[0] ?? null; const gitErrorMessage = error instanceof Error ? error.message : t("contextPanel.errors.gitRead"); @@ -73,7 +73,7 @@ export function WorkspaceWidget({ variant="ghost" size="icon-xs" onClick={onRefresh} - disabled={!primaryWorkingDir || isFetching} + disabled={!primaryWorkspaceRoot || isFetching} className="rounded-md" aria-label={t("contextPanel.actions.refreshGitStatus")} title={t("contextPanel.actions.refreshGitStatus")} @@ -103,7 +103,7 @@ export function WorkspaceWidget({

)} - {!primaryWorkingDir ? ( + {!primaryWorkspaceRoot ? (

{t("contextPanel.empty.folderNotSet")}

) : isLoading && !gitState ? (
@@ -115,7 +115,7 @@ export function WorkspaceWidget({ ) : gitState?.isGitRepo ? (

- {shortenPath(primaryWorkingDir)} + {shortenPath(primaryWorkspaceRoot)}