diff --git a/apps/desktop/src/app/shell/hooks/use-statusbar-items.tsx b/apps/desktop/src/app/shell/hooks/use-statusbar-items.tsx index 753c3893bbd5..26a8a172632b 100644 --- a/apps/desktop/src/app/shell/hooks/use-statusbar-items.tsx +++ b/apps/desktop/src/app/shell/hooks/use-statusbar-items.tsx @@ -8,15 +8,18 @@ import { GatewayMenuPanel } from '@/app/shell/gateway-menu-panel' import { Codicon } from '@/components/ui/codicon' import { GlyphSpinner } from '@/components/ui/glyph-spinner' import { useI18n } from '@/i18n' -import { Activity, AlertCircle, Clock, Command, Hash, Loader2, Terminal, Zap, ZapFilled } from '@/lib/icons' +import { Activity, AlertCircle, Clock, Command, CopyIcon, FolderOpen, Hash, Loader2, Terminal, Zap, ZapFilled } from '@/lib/icons' import type { RuntimeReadinessResult } from '@/lib/runtime-readiness' import { contextBarLabel, LiveDuration, usageContextLabel } from '@/lib/statusbar' import { cn } from '@/lib/utils' import { setGlobalYolo, setSessionYolo } from '@/lib/yolo-session' +import { copyFilePath, revealFile } from '@/store/file-actions' +import { revealFileInTree } from '@/store/layout' import { $activeSessionId, $busy, $connection, + $currentCwd, $currentUsage, $sessionStartedAt, $turnStartedAt, @@ -38,6 +41,13 @@ import type { StatusResponse } from '@/types/hermes' import { CRON_ROUTE } from '../../routes' import type { StatusbarItem, StatusbarSelectModifiers } from '../statusbar-controls' +function workspaceLabel(cwd: string): string { + const normalized = cwd.replace(/[\\/]+$/, '') + const leaf = normalized.split(/[\\/]/).filter(Boolean).pop() + + return leaf || cwd +} + interface StatusbarItemsOptions { agentsOpen: boolean chatOpen: boolean @@ -71,10 +81,12 @@ export function useStatusbarItems({ }: StatusbarItemsOptions) { const { t } = useI18n() const copy = t.shell.statusbar + const fileMenu = t.fileMenu const activeSessionId = useStore($activeSessionId) const terminalTakeover = useStore($terminalTakeover) const yoloActive = useStore($yoloActive) const busy = useStore($busy) + const currentCwd = useStore($currentCwd) const currentUsage = useStore($currentUsage) const gatewayRestarting = useStore($gatewayRestarting) const sessionStartedAt = useStore($sessionStartedAt) @@ -299,6 +311,39 @@ export function useStatusbarItems({ title: inferenceStatus?.reason || copy.gatewayTitle, variant: 'menu' }, + { + hidden: !currentCwd, + icon: , + id: 'workspace-cwd', + label: currentCwd ? workspaceLabel(currentCwd) : undefined, + menuItems: currentCwd + ? [ + { + icon: , + id: 'copy-workspace-path', + label: fileMenu.copyPath, + onSelect: () => void copyFilePath(currentCwd), + title: currentCwd + }, + { + icon: , + id: 'reveal-workspace-finder', + label: fileMenu.revealFileManager, + onSelect: () => void revealFile(currentCwd), + title: currentCwd + }, + { + icon: , + id: 'reveal-workspace-sidebar', + label: fileMenu.revealInSidebar, + onSelect: () => revealFileInTree(currentCwd), + title: currentCwd + } + ] + : undefined, + title: currentCwd || undefined, + variant: 'menu' + }, { className: cn( agentsOpen && 'bg-accent/55 text-foreground', @@ -337,6 +382,10 @@ export function useStatusbarItems({ agentsOpen, commandCenterOpen, copy, + currentCwd, + fileMenu.copyPath, + fileMenu.revealFileManager, + fileMenu.revealInSidebar, gatewayMenuContent, gatewayClassName, gatewayDetail,