diff --git a/packages/ui/src/components/session/sidebar/hooks/useSessionActions.ts b/packages/ui/src/components/session/sidebar/hooks/useSessionActions.ts index 7b4bc9ac..11eb1337 100644 --- a/packages/ui/src/components/session/sidebar/hooks/useSessionActions.ts +++ b/packages/ui/src/components/session/sidebar/hooks/useSessionActions.ts @@ -214,16 +214,18 @@ export const useSessionActions = (args: Args) => { const ids = [session.id, ...descendantIds]; if (shouldHardDelete) { - const { deletedIds, failedIds } = await args.deleteSessions(ids); - if (deletedIds.length > 0) { - toast.success(deletedIds.length === 1 - ? t('sessions.sidebar.bulkActions.deletedSingle', { count: deletedIds.length }) - : t('sessions.sidebar.bulkActions.deletedPlural', { count: deletedIds.length })); - } - if (failedIds.length > 0) { - toast.error(failedIds.length === 1 - ? t('sessions.sidebar.bulkActions.failedDeleteSingle', { count: failedIds.length }) - : t('sessions.sidebar.bulkActions.failedDeletePlural', { count: failedIds.length })); + // The server cascade-deletes all descendant sessions when the parent + // is removed. Only send the root session delete request; sending + // individual requests for each descendant would hit 404 (already + // deleted by cascade) and trigger rollback that restores them. + const success = await args.deleteSession(session.id); + if (success) { + const totalDeleted = descendantIds.length + 1; + toast.success(totalDeleted === 1 + ? t('sessions.sidebar.bulkActions.deletedSingle', { count: totalDeleted }) + : t('sessions.sidebar.bulkActions.deletedPlural', { count: totalDeleted })); + } else { + toast.error(t('sessions.sidebar.session.delete.error')); } return; } diff --git a/packages/ui/src/sync/session-actions.ts b/packages/ui/src/sync/session-actions.ts index 5e5af61c..2b7fadb4 100644 --- a/packages/ui/src/sync/session-actions.ts +++ b/packages/ui/src/sync/session-actions.ts @@ -483,6 +483,12 @@ export async function deleteSession(sessionId: string, _options?: Record