From 90d8f1226762cdca355368e71871e323dfc99ff9 Mon Sep 17 00:00:00 2001 From: malventano Date: Sun, 24 May 2026 13:52:19 -0400 Subject: [PATCH] fix(tui): prune messages on prompt submit instead of during streaming --- .../cli/cmd/tui/component/prompt/index.tsx | 2 ++ .../opencode/src/cli/cmd/tui/context/sync.tsx | 35 +++++++++---------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index e87035568421..066e0e3c5e93 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -1089,6 +1089,8 @@ export function Prompt(props: PromptProps) { sessionID = res.data.id } + sync.session.prune(sessionID) + const messageID = MessageID.ascending() let inputText = store.prompt.input diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index 9f8a384f777f..1c729a6d463f 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -268,25 +268,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ draft.splice(result.index, 0, event.properties.info) }), ) - const updated = store.message[event.properties.info.sessionID] - if (updated.length > 100) { - const oldest = updated[0] - batch(() => { - setStore( - "message", - event.properties.info.sessionID, - produce((draft) => { - draft.shift() - }), - ) - setStore( - "part", - produce((draft) => { - delete draft[oldest.id] - }), - ) - }) - } break } case "message.removed": { @@ -543,6 +524,22 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ ) fullSyncedSessions.add(sessionID) }, + prune(sessionID: string) { + const messages = store.message[sessionID] + if (!messages || messages.length <= 100) return + const excess = messages.length - 100 + const toRemove = messages.slice(0, excess) + batch(() => { + setStore("message", sessionID, produce((draft) => { + draft.splice(0, excess) + })) + setStore("part", produce((draft) => { + for (const msg of toRemove) { + delete draft[msg.id] + } + })) + }) + }, }, bootstrap, }