diff --git a/src/agents/cli-session.test.ts b/src/agents/cli-session.test.ts index c3ee719dbfd..6fc2d94c155 100644 --- a/src/agents/cli-session.test.ts +++ b/src/agents/cli-session.test.ts @@ -178,6 +178,37 @@ describe("cli-session helpers", () => { ).toEqual({ invalidatedReason: "mcp" }); }); + it("falls back to legacy MCP config hashes when stored resume hashes are absent", () => { + const binding = { + sessionId: "cli-session-1", + authProfileId: "anthropic:work", + authEpoch: "auth-epoch-a", + extraSystemPromptHash: "prompt-a", + mcpConfigHash: "mcp-config-a", + }; + + expect( + resolveCliSessionReuse({ + binding, + authProfileId: "anthropic:work", + authEpoch: "auth-epoch-a", + extraSystemPromptHash: "prompt-a", + mcpConfigHash: "mcp-config-a", + mcpResumeHash: "mcp-resume-a", + }), + ).toEqual({ sessionId: "cli-session-1" }); + expect( + resolveCliSessionReuse({ + binding, + authProfileId: "anthropic:work", + authEpoch: "auth-epoch-a", + extraSystemPromptHash: "prompt-a", + mcpConfigHash: "mcp-config-b", + mcpResumeHash: "mcp-resume-a", + }), + ).toEqual({ invalidatedReason: "mcp" }); + }); + it("clears provider-scoped and global CLI session state", () => { const entry: SessionEntry = { sessionId: "openclaw-session", diff --git a/src/agents/cli-session.ts b/src/agents/cli-session.ts index 6f721f00d73..20cd18d6730 100644 --- a/src/agents/cli-session.ts +++ b/src/agents/cli-session.ts @@ -152,7 +152,7 @@ export function resolveCliSessionReuse(params: { return { invalidatedReason: "system-prompt" }; } const storedMcpResumeHash = normalizeOptionalString(binding?.mcpResumeHash); - if (storedMcpResumeHash || currentMcpResumeHash) { + if (storedMcpResumeHash && currentMcpResumeHash) { if (storedMcpResumeHash !== currentMcpResumeHash) { return { invalidatedReason: "mcp" }; }