From a9bc5f23e72282a1b9a2e2c79bc78655b81f8c37 Mon Sep 17 00:00:00 2001 From: Solomon Date: Fri, 9 Jan 2026 18:34:31 +0000 Subject: [PATCH] fix: empty process list regression (#1896) * fix: empty process list regression * tyecheck fix --- .../DisplayConversationEntry.tsx | 1 + .../NormalizedConversation/NextActionCard.tsx | 8 +++++--- .../dialogs/tasks/ViewProcessesDialog.tsx | 6 +++--- .../src/components/panels/AttemptHeaderActions.tsx | 4 ++-- .../components/tasks/TaskDetails/ProcessesTab.tsx | 14 +++++++------- frontend/src/components/ui/actions-dropdown.tsx | 6 +++--- 6 files changed, 21 insertions(+), 18 deletions(-) diff --git a/frontend/src/components/NormalizedConversation/DisplayConversationEntry.tsx b/frontend/src/components/NormalizedConversation/DisplayConversationEntry.tsx index a7e2950f..4803d365 100644 --- a/frontend/src/components/NormalizedConversation/DisplayConversationEntry.tsx +++ b/frontend/src/components/NormalizedConversation/DisplayConversationEntry.tsx @@ -800,6 +800,7 @@ function DisplayConversationEntry({
{ - if (attemptId) { + if (sessionId) { ViewProcessesDialog.show({ - attemptId, + sessionId, initialProcessId: latestDevServerProcess?.id, }); } - }, [attemptId, latestDevServerProcess?.id]); + }, [sessionId, latestDevServerProcess?.id]); const handleOpenDiffs = useCallback(() => { navigate({ search: '?view=diffs' }); diff --git a/frontend/src/components/dialogs/tasks/ViewProcessesDialog.tsx b/frontend/src/components/dialogs/tasks/ViewProcessesDialog.tsx index bdd04052..fd5a1b4a 100644 --- a/frontend/src/components/dialogs/tasks/ViewProcessesDialog.tsx +++ b/frontend/src/components/dialogs/tasks/ViewProcessesDialog.tsx @@ -11,12 +11,12 @@ import ProcessesTab from '@/components/tasks/TaskDetails/ProcessesTab'; import { ProcessSelectionProvider } from '@/contexts/ProcessSelectionContext'; export interface ViewProcessesDialogProps { - attemptId: string; + sessionId: string | undefined; initialProcessId?: string | null; } const ViewProcessesDialogImpl = NiceModal.create( - ({ attemptId, initialProcessId }) => { + ({ sessionId, initialProcessId }) => { const { t } = useTranslation('tasks'); const modal = useModal(); @@ -46,7 +46,7 @@ const ViewProcessesDialogImpl = NiceModal.create(
- +
diff --git a/frontend/src/components/panels/AttemptHeaderActions.tsx b/frontend/src/components/panels/AttemptHeaderActions.tsx index 062280e0..d219baaa 100644 --- a/frontend/src/components/panels/AttemptHeaderActions.tsx +++ b/frontend/src/components/panels/AttemptHeaderActions.tsx @@ -10,17 +10,17 @@ import { } from '../ui/tooltip'; import type { LayoutMode } from '../layout/TasksLayout'; import type { TaskWithAttemptStatus } from 'shared/types'; -import type { Workspace } from 'shared/types'; import { ActionsDropdown } from '../ui/actions-dropdown'; import { usePostHog } from 'posthog-js/react'; import type { SharedTaskRecord } from '@/hooks/useProjectTasks'; +import { WorkspaceWithSession } from '@/types/attempt'; interface AttemptHeaderActionsProps { onClose: () => void; mode?: LayoutMode; onModeChange?: (mode: LayoutMode) => void; task: TaskWithAttemptStatus; - attempt?: Workspace | null; + attempt?: WorkspaceWithSession | null; sharedTask?: SharedTaskRecord; } diff --git a/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx b/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx index a85b7188..226f1ecc 100644 --- a/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx +++ b/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx @@ -20,10 +20,10 @@ import { useProcessSelection } from '@/contexts/ProcessSelectionContext'; import { useRetryUi } from '@/contexts/RetryUiContext'; interface ProcessesTabProps { - attemptId?: string; + sessionId?: string; } -function ProcessesTab({ attemptId }: ProcessesTabProps) { +function ProcessesTab({ sessionId }: ProcessesTabProps) { const { t } = useTranslation('tasks'); const { executionProcesses, @@ -31,7 +31,7 @@ function ProcessesTab({ attemptId }: ProcessesTabProps) { isLoading: processesLoading, isConnected, error: processesError, - } = useExecutionProcesses(attemptId ?? '', { showSoftDeleted: true }); + } = useExecutionProcesses(sessionId ?? '', { showSoftDeleted: true }); const { selectedProcessId, setSelectedProcessId } = useProcessSelection(); const [loadingProcessId, setLoadingProcessId] = useState(null); const [localProcessDetails, setLocalProcessDetails] = useState< @@ -49,7 +49,7 @@ function ProcessesTab({ attemptId }: ProcessesTabProps) { useEffect(() => { setLocalProcessDetails({}); setLoadingProcessId(null); - }, [attemptId]); + }, [sessionId]); const handleCopyLogs = useCallback(async () => { if (logs.length === 0) return; @@ -121,7 +121,7 @@ function ProcessesTab({ attemptId }: ProcessesTabProps) { // Automatically fetch process details when selectedProcessId changes useEffect(() => { - if (!attemptId || !selectedProcessId) { + if (!sessionId || !selectedProcessId) { return; } @@ -132,7 +132,7 @@ function ProcessesTab({ attemptId }: ProcessesTabProps) { fetchProcessDetails(selectedProcessId); } }, [ - attemptId, + sessionId, selectedProcessId, localProcessDetails, loadingProcessId, @@ -150,7 +150,7 @@ function ProcessesTab({ attemptId }: ProcessesTabProps) { const { isProcessGreyed } = useRetryUi(); - if (!attemptId) { + if (!sessionId) { return (
diff --git a/frontend/src/components/ui/actions-dropdown.tsx b/frontend/src/components/ui/actions-dropdown.tsx index d90a1601..410c5bd2 100644 --- a/frontend/src/components/ui/actions-dropdown.tsx +++ b/frontend/src/components/ui/actions-dropdown.tsx @@ -10,7 +10,6 @@ import { } from '@/components/ui/dropdown-menu'; import { MoreHorizontal } from 'lucide-react'; import type { TaskWithAttemptStatus } from 'shared/types'; -import type { Workspace } from 'shared/types'; import { useOpenInEditor } from '@/hooks/useOpenInEditor'; import { DeleteTaskConfirmationDialog } from '@/components/dialogs/tasks/DeleteTaskConfirmationDialog'; import { ViewProcessesDialog } from '@/components/dialogs/tasks/ViewProcessesDialog'; @@ -27,10 +26,11 @@ import { openTaskForm } from '@/lib/openTaskForm'; import { useNavigate } from 'react-router-dom'; import type { SharedTaskRecord } from '@/hooks/useProjectTasks'; import { useAuth } from '@/hooks'; +import { WorkspaceWithSession } from '@/types/attempt'; interface ActionsDropdownProps { task?: TaskWithAttemptStatus | null; - attempt?: Workspace | null; + attempt?: WorkspaceWithSession | null; sharedTask?: SharedTaskRecord; } @@ -84,7 +84,7 @@ export function ActionsDropdown({ const handleViewProcesses = (e: React.MouseEvent) => { e.stopPropagation(); if (!attempt?.id) return; - ViewProcessesDialog.show({ attemptId: attempt.id }); + ViewProcessesDialog.show({ sessionId: attempt.session?.id }); }; const handleViewRelatedTasks = (e: React.MouseEvent) => {