fix: correct MCP link text and prevent evidence reopening on Escape

- DiscussionPanel: relabel MCP link to 'Anthropic MCP' for accuracy
- close_overlay now sets evidenceModeOverride to 'hidden' instead of
  clearing it, preventing beat-default evidence from reopening on
  repeated Escape; only 'reset overrides' clears it
- Add regression test for repeated Escape after force-close
- Update existing overlay-priority tests for new 'hidden' semantics
This commit is contained in:
lda
2026-07-05 01:19:19 +07:00 Verified
parent c06809b080
commit 9b0f9658f9
3 changed files with 23 additions and 8 deletions
@@ -28,7 +28,7 @@ export const DiscussionPanel = ({ branchId, onClose }: DiscussionPanelProps) =>
)}
{branchId === "mcp-agent-scale" && (
<p className="discussion-panel__detail">
<a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">Model Context Protocol</a> ·{" "}
<a href="https://modelcontextprotocol.io/" target="_blank" rel="noopener noreferrer">Anthropic MCP</a> ·{" "}
<a href="https://developers.cloudflare.com/workers-ai/configuration/code-mode/" target="_blank" rel="noopener noreferrer">Cloudflare Code Mode</a>
{" "} both are external context.
</p>
@@ -92,7 +92,7 @@ describe("presentationReducer", () => {
expect(closed1.location.kind).toBe("discussion");
const closed2 = presentationReducer(closed1, { type: "close_overlay" });
expect(closed2.evidenceModeOverride).toBeNull();
expect(closed2.evidenceModeOverride).toBe("hidden");
const closed3 = presentationReducer(closed2, { type: "close_overlay" });
expect(closed3.location.kind).toBe("main");
@@ -129,7 +129,22 @@ describe("presentationReducer", () => {
mode: "open",
});
const closed = presentationReducer(opened, { type: "close_overlay" });
expect(closed.evidenceModeOverride).toBeNull();
expect(closed.evidenceModeOverride).toBe("hidden");
expect(closed.location).toEqual(initialPresentationState.location);
});
it("does not reopen evidence on repeated Escape after force-close", () => {
const stateAtTrace = presentationReducer(initialPresentationState, {
type: "jump",
location: { kind: "main", sceneId: "interrupt-evidence", beatId: "trace" },
});
expect(stateAtTrace.evidenceModeOverride).toBeNull();
const closed = presentationReducer(stateAtTrace, { type: "close_overlay" });
expect(closed.evidenceModeOverride).toBe("hidden");
const secondEscape = presentationReducer(closed, { type: "close_overlay" });
expect(secondEscape.evidenceModeOverride).toBe("hidden");
expect(secondEscape.location.kind).toBe("main");
});
});
@@ -180,14 +180,14 @@ export const presentationReducer = (
return { ...state, evidenceModeOverride: action.mode };
case "close_overlay": {
if (state.selectedNodeId !== null) return { ...state, selectedNodeId: null };
if (state.evidenceModeOverride !== null) return { ...state, evidenceModeOverride: null };
const derivedEvidenceMode = (() => {
if (state.location.kind === "discussion") return "hidden" as const;
const isEvidenceVisible = (() => {
if (state.evidenceModeOverride !== null) return state.evidenceModeOverride !== "hidden";
if (state.location.kind === "discussion") return false;
const scene = findScene(state.location.sceneId);
const beat = scene?.beats.find((b) => b.id === (state.location as MainLocation).beatId);
return beat?.evidenceMode ?? "hidden";
return beat?.evidenceMode === "open" || beat?.evidenceMode === "peek";
})();
if (derivedEvidenceMode !== "hidden") return { ...state, evidenceModeOverride: "hidden" };
if (isEvidenceVisible) return { ...state, evidenceModeOverride: "hidden" };
if (state.discussionIndexOpen) return { ...state, discussionIndexOpen: false };
if (state.controlsOpen) return { ...state, controlsOpen: false };
if (state.location.kind === "discussion") {