fix(compaction): guard model update during compaction and validate checkpoint model
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
declare const require: (name: string) => any
|
||||
const { afterEach, describe, expect, test } = require("bun:test")
|
||||
import { afterEach, describe, expect, it } from "bun:test"
|
||||
|
||||
import { _resetForTesting, getSessionAgent, updateSessionAgent } from "../features/claude-code-session-state"
|
||||
import { clearSessionModel, getSessionModel, setSessionModel } from "../shared/session-model-state"
|
||||
import { createEventHandler } from "./event"
|
||||
|
||||
function createMinimalEventHandler() {
|
||||
@@ -51,9 +51,11 @@ function createMinimalEventHandler() {
|
||||
describe("createEventHandler compaction agent filtering", () => {
|
||||
afterEach(() => {
|
||||
_resetForTesting()
|
||||
clearSessionModel("ses_compaction_poisoning")
|
||||
clearSessionModel("ses_compaction_model_poisoning")
|
||||
})
|
||||
|
||||
test("does not overwrite the stored session agent with compaction", async () => {
|
||||
it("does not overwrite the stored session agent with compaction", async () => {
|
||||
// given
|
||||
const sessionID = "ses_compaction_poisoning"
|
||||
updateSessionAgent(sessionID, "atlas")
|
||||
@@ -80,4 +82,36 @@ describe("createEventHandler compaction agent filtering", () => {
|
||||
// then
|
||||
expect(getSessionAgent(sessionID)).toBe("atlas")
|
||||
})
|
||||
|
||||
it("does not overwrite the stored session model with compaction", async () => {
|
||||
// given
|
||||
const sessionID = "ses_compaction_model_poisoning"
|
||||
setSessionModel(sessionID, { providerID: "openai", modelID: "gpt-5" })
|
||||
const eventHandler = createMinimalEventHandler()
|
||||
const input: Parameters<ReturnType<typeof createEventHandler>>[0] = {
|
||||
event: {
|
||||
type: "message.updated",
|
||||
properties: {
|
||||
info: {
|
||||
id: "msg-compaction-model",
|
||||
sessionID,
|
||||
role: "user",
|
||||
agent: "compaction",
|
||||
providerID: "anthropic",
|
||||
modelID: "claude-opus-4-1",
|
||||
time: { created: Date.now() },
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
// when
|
||||
await eventHandler(input)
|
||||
|
||||
// then
|
||||
expect(getSessionModel(sessionID)).toEqual({
|
||||
providerID: "openai",
|
||||
modelID: "gpt-5",
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
+3
-2
@@ -317,12 +317,13 @@ export function createEventHandler(args: {
|
||||
const agent = info?.agent as string | undefined;
|
||||
const role = info?.role as string | undefined;
|
||||
if (sessionID && role === "user") {
|
||||
if (agent && !isCompactionAgent(agent)) {
|
||||
const isCompactionMessage = agent ? isCompactionAgent(agent) : false;
|
||||
if (agent && !isCompactionMessage) {
|
||||
updateSessionAgent(sessionID, agent);
|
||||
}
|
||||
const providerID = info?.providerID as string | undefined;
|
||||
const modelID = info?.modelID as string | undefined;
|
||||
if (providerID && modelID) {
|
||||
if (providerID && modelID && !isCompactionMessage) {
|
||||
lastKnownModelBySession.set(sessionID, { providerID, modelID });
|
||||
setSessionModel(sessionID, { providerID, modelID });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user