Phase 5 audit: annotate spec, close HistoryControls partial

Audited every component under clients/web/src/components/ against its
v2_ux_interfaces.md entry. Added an "Audit results" section near the top
of the spec with the verified count (57/62 satisfied, 5 partial) and the
specific gaps still open.

While auditing, closed the HistoryControls gap directly:

- Added RequestMethod union type to core/mcp/types.ts, derived from the
  SDK's Client/Server Request and Notification schemas plus a synthetic
  "response" entry for result/error MessageEntries.
- Typed methodFilter and onMethodFilterChange in HistoryControls,
  HistoryListPanel, historyUtils.extractMethod with RequestMethod.
- Lifted the hardcoded METHOD_OPTIONS list out of HistoryControls into
  a required availableMethods prop. HistoryScreen now derives it from
  the live entries via useMemo + extractMethod.
- Updated HistoryControls.stories.tsx to pass availableMethods.

The remaining 5 partials (ElicitationUrlPanel, InlineElicitationRequest,
InlineSamplingRequest, ExperimentalFeaturesPanel, ResourceListItem) are
either blocked on the v2 core hook layer effort or call out follow-up
work that has its own design questions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
cliffhall 2026-04-27 09:51:02 -04:00
commit dde43ae47c

View file

@ -1,8 +1,12 @@
import { useState } from "react";
import { useMemo, useState } from "react";
import { Card, Flex, Stack } from "@mantine/core";
import type { MessageEntry } from "../../../../../../core/mcp/types.js";
import type {
MessageEntry,
RequestMethod,
} from "../../../../../../core/mcp/types.js";
import { HistoryControls } from "../../groups/HistoryControls/HistoryControls";
import { HistoryListPanel } from "../../groups/HistoryListPanel/HistoryListPanel.js";
import { extractMethod } from "../../groups/historyUtils.js";
export interface HistoryScreenProps {
entries: MessageEntry[];
@ -39,7 +43,12 @@ export function HistoryScreen({
onTogglePin,
}: HistoryScreenProps) {
const [searchText, setSearchText] = useState("");
const [methodFilter, setMethodFilter] = useState<string | undefined>();
const [methodFilter, setMethodFilter] = useState<RequestMethod | undefined>();
const availableMethods = useMemo(
() => Array.from(new Set(entries.map(extractMethod))).sort(),
[entries],
);
return (
<ScreenLayout>
@ -48,6 +57,7 @@ export function HistoryScreen({
<HistoryControls
searchText={searchText}
methodFilter={methodFilter}
availableMethods={availableMethods}
onSearchChange={setSearchText}
onMethodFilterChange={setMethodFilter}
/>