From fe3d2d07ba41f5284bd53c6cacde5b1b16f95005 Mon Sep 17 00:00:00 2001 From: CasualDeveloper <10153929+CasualDeveloper@users.noreply.github.com> Date: Thu, 25 Dec 2025 07:45:38 +0800 Subject: [PATCH 1/2] feat(tui): add configurable message_limit for session history Allow users to configure maximum messages loaded per session via tui.message_limit config option (default: 100, max: 10000). Previously hardcoded to 100, which prevented scrolling to earlier messages in long conversations. --- .../cli/cmd/tui/component/dialog-session-list.tsx | 2 +- packages/opencode/src/cli/cmd/tui/context/sync.tsx | 4 ++-- packages/opencode/src/config/config.ts | 14 ++++++++++++++ packages/sdk/js/src/gen/types.gen.ts | 4 ++++ packages/sdk/js/src/v2/gen/types.gen.ts | 8 ++++++++ packages/sdk/openapi.json | 12 ++++++++++++ 6 files changed, 41 insertions(+), 3 deletions(-) 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 cb7b5d282ee..67c520b6030 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 @@ -54,7 +54,7 @@ export function DialogSessionList() { ) : undefined, } }) - .slice(0, 150) + .slice(0, sync.data.config.tui?.session_list_limit ?? 150) }) createEffect(() => { diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index 2528a499896..961ae59fe43 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -188,7 +188,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ event.properties.info.sessionID, produce((draft) => { draft.splice(result.index, 0, event.properties.info) - if (draft.length > 100) draft.shift() + if (draft.length > (store.config.tui?.message_limit ?? 100)) draft.shift() }), ) break @@ -345,7 +345,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ if (fullSyncedSessions.has(sessionID)) return const [session, messages, todo, diff] = await Promise.all([ sdk.client.session.get({ sessionID }, { throwOnError: true }), - sdk.client.session.messages({ sessionID, limit: 100 }), + sdk.client.session.messages({ sessionID, limit: store.config.tui?.message_limit ?? 100 }), sdk.client.session.todo({ sessionID }), sdk.client.session.diff({ sessionID }), ]) diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index c94a34be0e6..06efe73c801 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -593,6 +593,20 @@ export namespace Config { .enum(["auto", "stacked"]) .optional() .describe("Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column"), + message_limit: z + .number() + .int() + .min(1) + .max(10000) + .optional() + .describe("Maximum number of messages to load per session (default: 100)"), + 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/gen/types.gen.ts b/packages/sdk/js/src/gen/types.gen.ts index 32f33f66219..6d3b3500bf7 100644 --- a/packages/sdk/js/src/gen/types.gen.ts +++ b/packages/sdk/js/src/gen/types.gen.ts @@ -1199,6 +1199,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 messages to load per session (default: 100) + */ + message_limit?: number } /** * Command configuration, see https://opencode.ai/docs/commands diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 5c4cc69423d..31895a43939 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -1433,6 +1433,14 @@ export type Config = { * Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column */ diff_style?: "auto" | "stacked" + /** + * Maximum number of messages to load per session (default: 100) + */ + message_limit?: number + /** + * 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 3903566b91e..93425ed631f 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -8233,6 +8233,18 @@ "description": "Control diff rendering style: 'auto' adapts to terminal width, 'stacked' always shows single column", "type": "string", "enum": ["auto", "stacked"] + }, + "message_limit": { + "description": "Maximum number of messages to load per session (default: 100)", + "type": "integer", + "minimum": 1, + "maximum": 10000 + }, + "session_list_limit": { + "description": "Maximum number of sessions to display in session list (default: 150)", + "type": "integer", + "minimum": 1, + "maximum": 10000 } } }, From 1625af19b1f6f5939010568931b7356f4420670a Mon Sep 17 00:00:00 2001 From: CasualDeveloper <10153929+CasualDeveloper@users.noreply.github.com> Date: Sun, 28 Dec 2025 07:57:58 +0800 Subject: [PATCH 2/2] chore: generate --- packages/plugin/package.json | 2 +- packages/sdk/js/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 4d82f2a5fd8..63174acec23 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -24,4 +24,4 @@ "typescript": "catalog:", "@typescript/native-preview": "catalog:" } -} \ No newline at end of file +} diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index ac6f8480269..7933647718b 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -29,4 +29,4 @@ "publishConfig": { "directory": "dist" } -} \ No newline at end of file +}