Skip to content

Commit 7e09660

Browse files
authored
fix(opencode): respect disabled auto compaction on overflow (#30749)
1 parent 6d4f3b4 commit 7e09660

2 files changed

Lines changed: 37 additions & 0 deletions

File tree

packages/opencode/src/session/processor.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,13 @@ export const layer = Layer.effect(
909909
const error = parse(e)
910910
yield* flushV2Fragments()
911911
if (SessionV1.ContextOverflowError.isInstance(error)) {
912+
if ((yield* config.get()).compaction?.auto === false && !ctx.assistantMessage.summary) {
913+
ctx.assistantMessage.error = error
914+
ctx.assistantMessage.finish = "error"
915+
yield* events.publish(Session.Event.Error, { sessionID: ctx.sessionID, error })
916+
yield* status.set(ctx.sessionID, { type: "idle" })
917+
return
918+
}
912919
ctx.needsCompaction = true
913920
yield* events.publish(Session.Event.Error, { sessionID: ctx.sessionID, error })
914921
return

packages/opencode/test/session/prompt.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,36 @@ it.instance("loop calls LLM and returns assistant message", () =>
513513
}),
514514
)
515515

516+
it.instance("loop stops provider overflow instead of auto-compacting when disabled", () =>
517+
Effect.gen(function* () {
518+
const { llm } = yield* useServerConfig((url) => ({
519+
...providerCfg(url),
520+
compaction: { auto: false },
521+
}))
522+
const prompt = yield* SessionPrompt.Service
523+
const sessions = yield* Session.Service
524+
const chat = yield* sessions.create({ title: "Pinned" })
525+
526+
yield* llm.error(413, { error: { message: "request entity too large" } })
527+
yield* prompt.prompt({
528+
sessionID: chat.id,
529+
agent: "build",
530+
noReply: true,
531+
parts: [{ type: "text", text: "hello" }],
532+
})
533+
534+
const result = yield* prompt.loop({ sessionID: chat.id })
535+
const messages = yield* sessions.messages({ sessionID: chat.id })
536+
537+
expect(result.info.role).toBe("assistant")
538+
if (result.info.role === "assistant") {
539+
expect(result.info.error?.name).toBe("ContextOverflowError")
540+
expect(result.info.finish).toBe("error")
541+
}
542+
expect(messages.some((message) => message.parts.some((part) => part.type === "compaction"))).toBe(false)
543+
}),
544+
)
545+
516546
noLLMServer.instance.skip(
517547
"prompt emits v2 prompted and synthetic events (v2 projector disabled)",
518548
() =>

0 commit comments

Comments
 (0)