From 0037e55ca3a28967488acec1ac3dbbb90d9eb525 Mon Sep 17 00:00:00 2001 From: CasualDeveloper <10153929+CasualDeveloper@users.noreply.github.com> Date: Fri, 16 Jan 2026 03:09:55 +0800 Subject: [PATCH] feat(tui): add configurable session_list_limit for session picker Adds session_list_limit config option to limit sessions displayed in the session list dialog (default: 150). Limit only applies when not searching; search uses server-side limit of 30. Remove message_limit as it conflicts with cursor-based pagination (#8535) and is now redundant. --- .../src/cli/cmd/tui/component/dialog-session-list.tsx | 3 +++ packages/opencode/src/config/config.ts | 7 +++++++ packages/sdk/js/src/v2/gen/types.gen.ts | 4 ++++ packages/sdk/openapi.json | 6 ++++++ 4 files changed, 20 insertions(+) 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 85c174c1dcb..6f23a5082d5 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 @@ -35,12 +35,15 @@ export function DialogSessionList() { const spinnerFrames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"] const sessions = createMemo(() => searchResults() ?? sync.data.session) + const isSearching = createMemo(() => search().length > 0) const options = createMemo(() => { const today = new Date().toDateString() + const limit = sync.data.config.tui?.session_list_limit ?? 150 return sessions() .filter((x) => x.parentID === undefined) .toSorted((a, b) => b.time.updated - a.time.updated) + .slice(0, isSearching() ? undefined : limit) .map((x) => { const date = new Date(x.time.updated) let category = date.toDateString() diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index ddb3af4b0a8..46eb9174727 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -796,6 +796,13 @@ export namespace Config { .enum(["auto", "stacked"]) .optional() .describe("Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column"), + session_list_limit: z + .number() + .int() + .min(1) + .max(10000) + .optional() + .describe("Maximum number of sessions to display in session list (default: 150)"), }) export const Server = z diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index b7e72fbad8f..cddc3d74042 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1609,6 +1609,10 @@ export type Config = { * Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column */ diff_style?: "auto" | "stacked" + /** + * Maximum number of sessions to display in session list (default: 150) + */ + session_list_limit?: number } server?: ServerConfig /** diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index c1be820f262..db59efa7072 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -9343,6 +9343,12 @@ "description": "Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column", "type": "string", "enum": ["auto", "stacked"] + }, + "session_list_limit": { + "description": "Maximum number of sessions to display in session list (default: 150)", + "type": "integer", + "minimum": 1, + "maximum": 10000 } } },