From 3ed4651b7adf0feb3c307918c7b12dc989a39934 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 11 May 2026 18:46:29 +0900 Subject: [PATCH] fix(compaction): skip autocontinue for compaction agent --- src/index.compacting.test.ts | 19 +++++++++++++++++++ src/plugin/session-compacting.ts | 8 +++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/index.compacting.test.ts b/src/index.compacting.test.ts index 2a96cde5a..a955bab93 100644 --- a/src/index.compacting.test.ts +++ b/src/index.compacting.test.ts @@ -160,6 +160,25 @@ describe("experimental.session.compacting handler", () => { }) describe("experimental.compaction.autocontinue handler", () => { + it("disables OpenCode autocontinue when the compaction agent would continue itself", async () => { + //#given + const restoreContextMock = mock(async () => true) + const restoreTodosMock = mock(async () => {}) + const handler = createCompactionAutocontinueHandler({ + compactionContextInjector: { restore: restoreContextMock }, + compactionTodoPreserver: { restore: restoreTodosMock }, + }) + const output = { enabled: true } + + //#when + await handler({ sessionID: "ses_compaction_loop", agent: "compaction" }, output) + + //#then + expect(output.enabled).toBe(false) + expect(restoreContextMock).not.toHaveBeenCalled() + expect(restoreTodosMock).not.toHaveBeenCalled() + }) + it("restores checkpointed context and todos before OpenCode adds the synthetic continue turn", async () => { //#given const callOrder: string[] = [] diff --git a/src/plugin/session-compacting.ts b/src/plugin/session-compacting.ts index 940b029a2..bb810ca76 100644 --- a/src/plugin/session-compacting.ts +++ b/src/plugin/session-compacting.ts @@ -1,5 +1,6 @@ import type { Hooks } from "@opencode-ai/plugin" +import { isCompactionAgent } from "../shared/compaction-marker" import { log } from "../shared/logger" type SessionCompactingHook = NonNullable @@ -92,8 +93,13 @@ export function createCompactionAutocontinueHandler( ): CompactionAutocontinueHook { return async ( input: CompactionAutocontinueInput, - _output: CompactionAutocontinueOutput, + output: CompactionAutocontinueOutput, ): Promise => { + if (isCompactionAgent(input.agent)) { + output.enabled = false + return + } + await runCompactionStep("compactionContextInjector.restore", input.sessionID, async () => { const restore = hooks.compactionContextInjector?.restore if (restore) {