From d8a15e7bc97f15eaec6247b643d9a55a9468be3e Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Thu, 16 Oct 2025 10:53:49 -0400 Subject: [PATCH] try to avoid persisting empty thinking/text blocks --- packages/opencode/src/session/index.ts | 17 +++++++++++++++ packages/opencode/src/session/prompt.ts | 29 ++++++++++++++----------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index 521dcfe7..4107e6eb 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -342,6 +342,23 @@ export namespace Session { return part }) + export const removePart = fn( + z.object({ + sessionID: Identifier.schema("session"), + messageID: Identifier.schema("message"), + partID: Identifier.schema("part"), + }), + async (input) => { + await Storage.remove(["part", input.messageID, input.partID]) + Bus.publish(MessageV2.Event.PartRemoved, { + sessionID: input.sessionID, + messageID: input.messageID, + partID: input.partID, + }) + return input.partID + }, + ) + export const getUsage = fn( z.object({ model: z.custom(), diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 29940dda..479980ac 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -916,7 +916,7 @@ export namespace SessionPrompt { const part = reasoningMap[value.id] part.text += value.text if (value.providerMetadata) part.metadata = value.providerMetadata - if (part.text) await Session.updatePart(part) + if (part.text.trim()) await Session.updatePart(part) } break @@ -924,13 +924,14 @@ export namespace SessionPrompt { if (value.id in reasoningMap) { const part = reasoningMap[value.id] part.text = part.text.trimEnd() - - part.time = { - ...part.time, - end: Date.now(), + if (part.text) { + part.time = { + ...part.time, + end: Date.now(), + } + if (value.providerMetadata) part.metadata = value.providerMetadata + await Session.updatePart(part) } - if (value.providerMetadata) part.metadata = value.providerMetadata - await Session.updatePart(part) delete reasoningMap[value.id] } break @@ -1085,19 +1086,21 @@ export namespace SessionPrompt { if (currentText) { currentText.text += value.text if (value.providerMetadata) currentText.metadata = value.providerMetadata - if (currentText.text) await Session.updatePart(currentText) + if (currentText.text.trim()) await Session.updatePart(currentText) } break case "text-end": if (currentText) { currentText.text = currentText.text.trimEnd() - currentText.time = { - start: Date.now(), - end: Date.now(), + if (currentText.text) { + currentText.time = { + start: Date.now(), + end: Date.now(), + } + if (value.providerMetadata) currentText.metadata = value.providerMetadata + await Session.updatePart(currentText) } - if (value.providerMetadata) currentText.metadata = value.providerMetadata - await Session.updatePart(currentText) } currentText = undefined break