Clear stale context window on session reset

This commit is contained in:
小马哥
2026-03-09 23:39:15 +08:00
committed by Josh Lehman
parent f7137ae821
commit 61affb9e8d
4 changed files with 11 additions and 7 deletions

View File

@@ -1266,6 +1266,7 @@ describe("runReplyAgent typing (heartbeat)", () => {
sessionFile: transcriptPath,
modelProvider: "qwencode",
model: "qwen3.5-plus-2026-02-15",
contextTokens: 123456,
systemPromptReport: {
source: "run",
generatedAt: Date.now(),
@@ -1316,11 +1317,13 @@ describe("runReplyAgent typing (heartbeat)", () => {
expect(sessionStore.main.modelProvider).toBeUndefined();
expect(sessionStore.main.model).toBeUndefined();
expect(sessionStore.main.contextTokens).toBeUndefined();
expect(sessionStore.main.systemPromptReport).toBeUndefined();
const persisted = JSON.parse(await fs.readFile(storePath, "utf-8"));
expect(persisted.main.modelProvider).toBeUndefined();
expect(persisted.main.model).toBeUndefined();
expect(persisted.main.contextTokens).toBeUndefined();
expect(persisted.main.systemPromptReport).toBeUndefined();
});
});

View File

@@ -280,6 +280,7 @@ export async function runReplyAgent(params: {
abortedLastRun: false,
modelProvider: undefined,
model: undefined,
contextTokens: undefined,
systemPromptReport: undefined,
fallbackNoticeSelectedModel: undefined,
fallbackNoticeActiveModel: undefined,

View File

@@ -136,6 +136,7 @@ function stripRuntimeModelState(entry?: SessionEntry): SessionEntry | undefined
...entry,
model: undefined,
modelProvider: undefined,
contextTokens: undefined,
systemPromptReport: undefined,
};
}
@@ -519,13 +520,10 @@ export const sessionsHandlers: GatewayRequestHandlers = {
const next = await updateSessionStore(storePath, (store) => {
const { primaryKey } = migrateAndPruneSessionStoreKey({ cfg, key, store });
const entry = store[primaryKey];
const resetEntry = stripRuntimeModelState(entry);
const parsed = parseAgentSessionKey(primaryKey);
const sessionAgentId = normalizeAgentId(parsed?.agentId ?? resolveDefaultAgentId(cfg));
const resolvedModel = resolveSessionModelRef(
cfg,
stripRuntimeModelState(entry),
sessionAgentId,
);
const resolvedModel = resolveSessionModelRef(cfg, resetEntry, sessionAgentId);
oldSessionId = entry?.sessionId;
oldSessionFile = entry?.sessionFile;
const now = Date.now();
@@ -540,7 +538,7 @@ export const sessionsHandlers: GatewayRequestHandlers = {
responseUsage: entry?.responseUsage,
model: resolvedModel.model,
modelProvider: resolvedModel.provider,
contextTokens: entry?.contextTokens,
contextTokens: resetEntry?.contextTokens,
sendPolicy: entry?.sendPolicy,
label: entry?.label,
origin: snapshotSessionOrigin(entry),

View File

@@ -606,6 +606,7 @@ describe("gateway server sessions", () => {
updatedAt: Date.now(),
modelProvider: "qwencode",
model: "qwen3.5-plus-2026-02-15",
contextTokens: 123456,
},
},
});
@@ -614,7 +615,7 @@ describe("gateway server sessions", () => {
const reset = await rpcReq<{
ok: true;
key: string;
entry: { sessionId: string; modelProvider?: string; model?: string };
entry: { sessionId: string; modelProvider?: string; model?: string; contextTokens?: number };
}>(ws, "sessions.reset", { key: "main" });
expect(reset.ok).toBe(true);
@@ -622,6 +623,7 @@ describe("gateway server sessions", () => {
expect(reset.payload?.entry.sessionId).not.toBe("sess-stale-model");
expect(reset.payload?.entry.modelProvider).toBe("openai");
expect(reset.payload?.entry.model).toBe("gpt-test-a");
expect(reset.payload?.entry.contextTokens).toBeUndefined();
ws.close();
});