diff --git a/src/components/AddWorker/index.tsx b/src/components/AddWorker/index.tsx index 44646e65..32ebd46e 100644 --- a/src/components/AddWorker/index.tsx +++ b/src/components/AddWorker/index.tsx @@ -395,6 +395,13 @@ export function AddWorker({ const activeWorkerModelOptions = workerModelOptions[workerModelMode]; + useEffect(() => { + if (!dialogOpen || !edit || !workerInfo) return; + setWorkerName(workerInfo.workerInfo?.name || ''); + setWorkerDescription(workerInfo.workerInfo?.description || ''); + setSelectedTools(workerInfo.workerInfo?.selectedTools || []); + }, [dialogOpen, edit, workerInfo]); + useEffect(() => { if (!showModelConfig) return; const options = activeWorkerModelOptions; @@ -673,7 +680,7 @@ export function AddWorker({ {showEnvConfig ? ( // environment configuration interface <> - +
{getCategoryIcon(activeMcp?.category?.name)}
@@ -772,7 +779,7 @@ export function AddWorker({ ) : ( // default add interface <> - +
diff --git a/src/components/ProjectPageSidebar/NavTab.tsx b/src/components/ProjectPageSidebar/NavTab.tsx index bac6dbec..a608e0d3 100644 --- a/src/components/ProjectPageSidebar/NavTab.tsx +++ b/src/components/ProjectPageSidebar/NavTab.tsx @@ -12,12 +12,6 @@ // limitations under the License. // ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. ========= -import { Button } from '@/components/ui/button'; -import { - Popover, - PopoverContent, - PopoverTrigger, -} from '@/components/ui/popover'; import { TooltipSimple } from '@/components/ui/tooltip'; import { cn } from '@/lib/utils'; import type { WebSocketConnectionStatus } from '@/store/triggerStore'; @@ -61,67 +55,49 @@ export function triggerListenerLeadIconClass( return 'text-ds-icon-status-error-default'; case 'disconnected': default: - return 'text-ds-icon-neutral-muted-default'; + return '!text-ds-icon-status-error-default'; } } export interface NavTabReconnectSuffixProps { wsConnectionStatus: WebSocketConnectionStatus; - reconnectHint: string; - reconnectButtonLabel: string; onReconnect: () => void; } -/** Optional right control for {@link NavTab} `layout="split"` (e.g. triggers reconnect). */ +/** Reconnect button for the triggers tab — direct click, no dropdown. */ export function NavTabReconnectSuffix({ wsConnectionStatus, - reconnectHint, - reconnectButtonLabel, onReconnect, }: NavTabReconnectSuffixProps) { return ( - - - - - -
-

- {reconnectHint} -

- -
-
-
+ aria-hidden + /> + + ); } @@ -146,6 +122,8 @@ export interface NavTabProps { suffix?: ReactNode; /** Split only: extra control after `suffix`; shown when the tab row is hovered (or focused within). */ endAction?: ReactNode; + /** Override the max-width reveal class on the endAction wrapper (default: `group-hover:max-w-10`). */ + endActionMaxWidthClass?: string; tooltip: string; /** When true, tooltips are hidden (labels are visible in the fixed-width sidebar). */ tooltipEnabledWhenCollapsed?: boolean; @@ -233,6 +211,7 @@ export function NavTab({ mainButtonClassName, folded = false, endAction, + endActionMaxWidthClass, }: NavTabProps) { const inner = tabMainInner({ leading, @@ -293,8 +272,11 @@ export function NavTab({
{endAction} diff --git a/src/components/ProjectPageSidebar/index.tsx b/src/components/ProjectPageSidebar/index.tsx index 6fad58a8..4c52f382 100644 --- a/src/components/ProjectPageSidebar/index.tsx +++ b/src/components/ProjectPageSidebar/index.tsx @@ -70,8 +70,6 @@ export default function ProjectPageSidebar({ const wsConnectionStatus = useTriggerStore((s) => s.wsConnectionStatus); const triggerReconnect = useTriggerStore((s) => s.triggerReconnect); const triggersListenerConnected = wsConnectionStatus === 'connected'; - const showTriggersDisconnectedTag = - wsConnectionStatus === 'disconnected' || wsConnectionStatus === 'unhealthy'; const projectStore = useProjectStore(); const activeProjectId = projectStore.activeProjectId; const folderTabHasUnviewedFiles = @@ -346,50 +344,38 @@ export default function ProjectPageSidebar({ ) } label="Scheduled" - trailing={ - showTriggersDisconnectedTag ? ( - - {t('layout.triggers-disconnected')} - - ) : undefined - } showNotificationDot={unviewedTabs.has('triggers')} notificationDotTone="attention" notificationDotClassName="h-2 w-2" - suffix={ - wsConnectionStatus !== 'connected' ? ( + endAction={ + triggersListenerConnected ? ( + + ) : ( - ) : undefined - } - endAction={ - + ) } tooltip={triggersTabTooltip} tooltipEnabledWhenCollapsed={!projectSidebarFolded} diff --git a/src/components/TopBar/index.tsx b/src/components/TopBar/index.tsx index 55d024ea..7afa0de2 100644 --- a/src/components/TopBar/index.tsx +++ b/src/components/TopBar/index.tsx @@ -320,6 +320,47 @@ function HeaderWin() { > {/* Leading: home ↔ dashboard / new project */}
+ {isHistoryRoute ? ( +
+ ) : ( + + + + )}
- - - void; + onEdit: () => void; onDuplicate: () => void; onDelete: () => void; + editEnabled?: boolean; duplicateEnabled?: boolean; deleteEnabled?: boolean; }; @@ -205,16 +206,19 @@ export function FoldedAgentCard({ { e.preventDefault(); - compactContextMenu.onDetail(); + if (compactContextMenu.editEnabled !== false) { + compactContextMenu.onEdit(); + } }} > - - {t('workforce.detail', { defaultValue: 'Detail' })} + {t('workforce.edit', { defaultValue: 'Edit' })} void; - onAgentDetailFromMenu: (agentId: string) => void; + onEditWorkerFromMenu: (agent: Agent) => void; onDuplicateUserAgent: (agent: Agent) => void; onDeleteUserAgent: (agentId: string) => void; onAddWorker: () => void; @@ -38,7 +38,7 @@ export function WorkforceAgentList({ sortedAgents, activeAgentId, onSelectAgent, - onAgentDetailFromMenu, + onEditWorkerFromMenu, onDuplicateUserAgent, onDeleteUserAgent, onAddWorker, @@ -65,9 +65,10 @@ export function WorkforceAgentList({ onSelect={() => onSelectAgent(agent.agent_id)} showUserAgentOverflow={false} compactContextMenu={{ - onDetail: () => onAgentDetailFromMenu(agent.agent_id), + onEdit: () => onEditWorkerFromMenu(agent), onDuplicate: () => onDuplicateUserAgent(agent), onDelete: () => onDeleteUserAgent(agent.agent_id), + editEnabled: !isBaseWorkflowAgent(agent), duplicateEnabled: !isBaseWorkflowAgent(agent), deleteEnabled: !isBaseWorkflowAgent(agent), }} diff --git a/src/components/Workspace/WorkspaceProjectPicker.tsx b/src/components/Workspace/WorkspaceProjectPicker.tsx index 4b76c51a..ffaa46e4 100644 --- a/src/components/Workspace/WorkspaceProjectPicker.tsx +++ b/src/components/Workspace/WorkspaceProjectPicker.tsx @@ -30,6 +30,7 @@ import { usePageTabStore } from '@/store/pageTabStore'; import type { ProjectGroup } from '@/types/history'; import { ChevronDown, + FolderIcon, FolderKanban, FolderOpen, PlusCircle, @@ -158,17 +159,15 @@ export function WorkspaceProjectPicker() { size="md" buttonContent="text" buttonRadius="full" - className="no-drag bg-ds-bg-neutral-subtle-default px-3 py-1 font-semibold shadow-soft hover:bg-ds-bg-neutral-default-hover inline-flex h-auto w-fit max-w-[300px] justify-between" + className="no-drag bg-ds-bg-neutral-subtle-default shadow-workspace-project-picker px-3 py-1 font-semibold hover:bg-ds-bg-neutral-default-hover inline-flex h-auto w-fit max-w-[300px] min-w-[180px] justify-between" aria-expanded={menuOpen} aria-haspopup="menu" > + {activeTaskTitle} - + ( + null + ); const [workspaceWorkWithPanelOpen, setWorkspaceWorkWithPanelOpen] = useState(false); const textareaRef = useRef(null); @@ -212,13 +215,9 @@ export default function Workspace() { [chatStore, host] ); - const onAgentDetailFromMenu = useCallback( - (agentId: string) => { - onSelectAgent(agentId); - setActiveWorkspaceTab('session'); - }, - [onSelectAgent, setActiveWorkspaceTab] - ); + const onEditWorkerFromMenu = useCallback((agent: Agent) => { + setEditingWorkerAgent(agent); + }, []); const onDuplicateUserAgent = useCallback( (agent: Agent) => { @@ -274,8 +273,8 @@ export default function Workspace() { }); return ( -
-
+
+
-
-
+
+
-
+
- + {sessionSidePanelMode === SessionMode.SINGLE_AGENT ? t('layout.workspace-cowork-single-agent', { defaultValue: 'Cowork with Single Agent', @@ -308,7 +307,7 @@ export default function Workspace() { defaultValue: 'Cowork with Workforce', })} -
+
{sessionSidePanelMode === SessionMode.SINGLE_AGENT ? ( ) : ( @@ -316,7 +315,7 @@ export default function Workspace() { sortedAgents={sortedAgents} activeAgentId={activeAgentId} onSelectAgent={onSelectAgent} - onAgentDetailFromMenu={onAgentDetailFromMenu} + onEditWorkerFromMenu={onEditWorkerFromMenu} onDuplicateUserAgent={onDuplicateUserAgent} onDeleteUserAgent={onDeleteUserAgent} onAddWorker={() => setAddWorkerDialogOpen(true)} @@ -364,11 +363,21 @@ export default function Workspace() { isOpen={addWorkerDialogOpen} onOpenChange={setAddWorkerDialogOpen} /> + {editingWorkerAgent && ( + { + if (!open) setEditingWorkerAgent(null); + }} + /> + )}
{showWorkspaceExamplePrompts ? ( @@ -395,7 +404,7 @@ export default function Workspace() { <>