summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-10-16 10:53:49 -0400
committerDax Raad <[email protected]>2025-10-16 10:54:10 -0400
commitd8a15e7bc97f15eaec6247b643d9a55a9468be3e (patch)
treed145356d1120a800fe5bd2a08a2bae6f215d667a
parent542b9fa342e820c64946334225787f8f8c4f4894 (diff)
downloadopencode-d8a15e7bc97f15eaec6247b643d9a55a9468be3e.tar.gz
opencode-d8a15e7bc97f15eaec6247b643d9a55a9468be3e.zip
try to avoid persisting empty thinking/text blocks
-rw-r--r--packages/opencode/src/session/index.ts17
-rw-r--r--packages/opencode/src/session/prompt.ts29
2 files changed, 33 insertions, 13 deletions
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index 521dcfe72..4107e6ebc 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<ModelsDev.Model>(),
diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts
index 29940ddac..479980acd 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