fix(compaction): ignore compaction agent updates

Fixes #3819
This commit is contained in:
YeonGyu-Kim
2026-05-11 13:25:29 +09:00
parent 726c82e131
commit 49ff4b5f8d
4 changed files with 120 additions and 1 deletions
+75 -1
View File
@@ -55,7 +55,9 @@ function setupImmediateTimeouts(): () => void {
globalThis.setTimeout = ((callback: (...args: unknown[]) => void, _delay?: number, ...args: unknown[]) => {
callback(...args)
return 1 as unknown as ReturnType<typeof setTimeout>
const timeoutID = originalSetTimeout(() => undefined, 0)
originalClearTimeout(timeoutID)
return timeoutID
}) as typeof setTimeout
globalThis.clearTimeout = (() => {}) as typeof clearTimeout
@@ -637,6 +639,78 @@ describe("preemptive-compaction", () => {
Date.now = originalNow
})
// #given compaction already succeeded for a session
// #when the compaction agent emits its summary message update
// #then it should not clear the compaction guard or trigger a duplicate summary
it("should ignore compaction-agent message updates after successful compaction", async () => {
const hook = createPreemptiveCompactionHook(ctx as never, {} as never)
const sessionID = "ses_compaction_agent_update"
await hook.event({
event: {
type: "message.updated",
properties: {
info: {
role: "assistant",
sessionID,
providerID: "anthropic",
modelID: "claude-sonnet-4-6",
finish: true,
tokens: {
input: 170000,
output: 0,
reasoning: 0,
cache: { read: 10000, write: 0 },
},
},
},
},
})
await hook["tool.execute.after"](
{ tool: "bash", sessionID, callID: "call_1" },
{ title: "", output: "test", metadata: null }
)
expect(ctx.client.session.summarize).toHaveBeenCalledTimes(1)
const originalNow = Date.now
try {
Date.now = () => originalNow() + 61_000
await hook.event({
event: {
type: "message.updated",
properties: {
info: {
agent: "compaction",
role: "assistant",
sessionID,
providerID: "anthropic",
modelID: "claude-sonnet-4-6",
finish: true,
tokens: {
input: 170000,
output: 0,
reasoning: 0,
cache: { read: 10000, write: 0 },
},
},
},
},
})
await hook["tool.execute.after"](
{ tool: "bash", sessionID, callID: "call_2" },
{ title: "", output: "test", metadata: null }
)
expect(ctx.client.session.summarize).toHaveBeenCalledTimes(1)
} finally {
Date.now = originalNow
}
})
// #given modelContextLimitsCache has model-specific limit (256k)
// #when tokens are above default 78% of 200k but below 78% of 256k
// #then should NOT trigger compaction