diff --git a/desktop/src/api/cliTasks.ts b/desktop/src/api/cliTasks.ts index d659e91a..5e50993d 100644 --- a/desktop/src/api/cliTasks.ts +++ b/desktop/src/api/cliTasks.ts @@ -21,6 +21,11 @@ export const cliTasksApi = { return api.get(`/api/tasks/lists/${encodeURIComponent(taskListId)}/${taskId}`) }, + /** Clear all persisted tasks for a completed task list */ + resetTaskList(taskListId: string) { + return api.post<{ ok: true }>(`/api/tasks/lists/${encodeURIComponent(taskListId)}/reset`) + }, + /** List all tasks across all task lists */ listAll() { return api.get('/api/tasks') diff --git a/desktop/src/components/chat/ComputerUsePermissionModal.test.tsx b/desktop/src/components/chat/ComputerUsePermissionModal.test.tsx index c2bfce00..c8e372f2 100644 --- a/desktop/src/components/chat/ComputerUsePermissionModal.test.tsx +++ b/desktop/src/components/chat/ComputerUsePermissionModal.test.tsx @@ -60,6 +60,7 @@ vi.mock('../../stores/cliTaskStore', () => ({ clearTasks: vi.fn(), setTasksFromTodos: vi.fn(), markCompletedAndDismissed: vi.fn(), + resetCompletedTasks: vi.fn(async () => {}), refreshTasks: vi.fn(), }), }, diff --git a/desktop/src/components/chat/SessionTaskBar.test.tsx b/desktop/src/components/chat/SessionTaskBar.test.tsx index 3b7f6bf7..b5607f31 100644 --- a/desktop/src/components/chat/SessionTaskBar.test.tsx +++ b/desktop/src/components/chat/SessionTaskBar.test.tsx @@ -4,6 +4,13 @@ import '@testing-library/jest-dom' import { SessionTaskBar } from './SessionTaskBar' import { useCLITaskStore } from '../../stores/cliTaskStore' +vi.mock('../../api/cliTasks', () => ({ + cliTasksApi: { + getTasksForList: vi.fn(), + resetTaskList: vi.fn(async () => ({ ok: true })), + }, +})) + vi.mock('../../i18n', () => ({ useTranslation: () => (key: string) => { const translations: Record = { @@ -46,7 +53,7 @@ describe('SessionTaskBar', () => { expect(screen.queryByRole('button', { name: 'Hide completed tasks' })).toBeNull() }) - it('hides the bar after dismissing a completed task set', () => { + it('hides the bar after dismissing a completed task set', async () => { act(() => { useCLITaskStore.getState().setTasksFromTodos([ { content: 'first', status: 'completed' }, @@ -58,10 +65,13 @@ describe('SessionTaskBar', () => { render() }) - fireEvent.click(screen.getByRole('button', { name: 'Hide completed tasks' })) + await act(async () => { + fireEvent.click(screen.getByRole('button', { name: 'Hide completed tasks' })) + await Promise.resolve() + }) expect(screen.queryByText('Tasks')).toBeNull() - expect(useCLITaskStore.getState().completedAndDismissed).toBe(true) + expect(useCLITaskStore.getState().tasks).toEqual([]) }) it('shows the bar again for a new task cycle after a previous completed set was dismissed', () => { diff --git a/desktop/src/components/chat/SessionTaskBar.tsx b/desktop/src/components/chat/SessionTaskBar.tsx index 2bc9b05d..07af20f9 100644 --- a/desktop/src/components/chat/SessionTaskBar.tsx +++ b/desktop/src/components/chat/SessionTaskBar.tsx @@ -26,7 +26,7 @@ export function SessionTaskBar() { expanded, toggleExpanded, completedAndDismissed, - markCompletedAndDismissed, + resetCompletedTasks, } = useCLITaskStore() const t = useTranslation() @@ -91,7 +91,7 @@ export function SessionTaskBar() {