diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx index 775969bfcb3..9641301bec2 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx @@ -1,5 +1,5 @@ import { useDialog } from "@tui/ui/dialog" -import { DialogSelect } from "@tui/ui/dialog-select" +import { DialogSelect, type DialogSelectRef } from "@tui/ui/dialog-select" import { useRoute } from "@tui/context/route" import { useSync } from "@tui/context/sync" import { createMemo, createSignal, createResource, onMount, Show } from "solid-js" @@ -23,6 +23,8 @@ export function DialogSessionList() { const [toDelete, setToDelete] = createSignal() const [search, setSearch] = createDebouncedSignal("", 150) + const [selectRef, setSelectRef] = createSignal>() + const [searchResults] = createResource(search, async (query) => { if (!query) return undefined @@ -65,6 +67,7 @@ export function DialogSessionList() { return ( { if (toDelete() === option.value) { + // Find current index before deletion + const ref = selectRef() + const currentIndex = ref?.filtered.findIndex((opt) => opt.value === option.value) ?? -1 + sdk.client.session.delete({ sessionID: option.value, }) setToDelete(undefined) + + // Move to adjacent item after deletion + if (ref && currentIndex >= 0) { + setTimeout(() => { + // Try to stay at same index (which will be next item after deletion) + // Or go to previous if we were at the end + const newIndex = Math.min(currentIndex, ref.filtered.length - 1) + if (newIndex >= 0) { + ref.moveTo(newIndex, true) + } + }, 50) + } return } setToDelete(option.value) diff --git a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx index 151f73cf7c0..1d0f3cbe657 100644 --- a/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx +++ b/packages/opencode/src/cli/cmd/tui/ui/dialog-select.tsx @@ -45,6 +45,7 @@ export interface DialogSelectOption { export type DialogSelectRef = { filter: string filtered: DialogSelectOption[] + moveTo: (index: number, center?: boolean) => void } export function DialogSelect(props: DialogSelectProps) { @@ -224,6 +225,7 @@ export function DialogSelect(props: DialogSelectProps) { get filtered() { return filtered() }, + moveTo, } props.ref?.(ref)