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:
@@ -28,7 +28,7 @@ export const DiscussionPanel = ({ branchId, onClose }: DiscussionPanelProps) =>
|
|||||||
)}
|
)}
|
||||||
{branchId === "mcp-agent-scale" && (
|
{branchId === "mcp-agent-scale" && (
|
||||||
<p className="discussion-panel__detail">
|
<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>
|
<a href="https://developers.cloudflare.com/workers-ai/configuration/code-mode/" target="_blank" rel="noopener noreferrer">Cloudflare Code Mode</a>
|
||||||
{" "}— both are external context.
|
{" "}— both are external context.
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ describe("presentationReducer", () => {
|
|||||||
expect(closed1.location.kind).toBe("discussion");
|
expect(closed1.location.kind).toBe("discussion");
|
||||||
|
|
||||||
const closed2 = presentationReducer(closed1, { type: "close_overlay" });
|
const closed2 = presentationReducer(closed1, { type: "close_overlay" });
|
||||||
expect(closed2.evidenceModeOverride).toBeNull();
|
expect(closed2.evidenceModeOverride).toBe("hidden");
|
||||||
|
|
||||||
const closed3 = presentationReducer(closed2, { type: "close_overlay" });
|
const closed3 = presentationReducer(closed2, { type: "close_overlay" });
|
||||||
expect(closed3.location.kind).toBe("main");
|
expect(closed3.location.kind).toBe("main");
|
||||||
@@ -129,7 +129,22 @@ describe("presentationReducer", () => {
|
|||||||
mode: "open",
|
mode: "open",
|
||||||
});
|
});
|
||||||
const closed = presentationReducer(opened, { type: "close_overlay" });
|
const closed = presentationReducer(opened, { type: "close_overlay" });
|
||||||
expect(closed.evidenceModeOverride).toBeNull();
|
expect(closed.evidenceModeOverride).toBe("hidden");
|
||||||
expect(closed.location).toEqual(initialPresentationState.location);
|
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 };
|
return { ...state, evidenceModeOverride: action.mode };
|
||||||
case "close_overlay": {
|
case "close_overlay": {
|
||||||
if (state.selectedNodeId !== null) return { ...state, selectedNodeId: null };
|
if (state.selectedNodeId !== null) return { ...state, selectedNodeId: null };
|
||||||
if (state.evidenceModeOverride !== null) return { ...state, evidenceModeOverride: null };
|
const isEvidenceVisible = (() => {
|
||||||
const derivedEvidenceMode = (() => {
|
if (state.evidenceModeOverride !== null) return state.evidenceModeOverride !== "hidden";
|
||||||
if (state.location.kind === "discussion") return "hidden" as const;
|
if (state.location.kind === "discussion") return false;
|
||||||
const scene = findScene(state.location.sceneId);
|
const scene = findScene(state.location.sceneId);
|
||||||
const beat = scene?.beats.find((b) => b.id === (state.location as MainLocation).beatId);
|
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.discussionIndexOpen) return { ...state, discussionIndexOpen: false };
|
||||||
if (state.controlsOpen) return { ...state, controlsOpen: false };
|
if (state.controlsOpen) return { ...state, controlsOpen: false };
|
||||||
if (state.location.kind === "discussion") {
|
if (state.location.kind === "discussion") {
|
||||||
|
|||||||
Reference in New Issue
Block a user