Address PR #1218 code review feedback

- Extract duplicated extractMethod into shared historyUtils.ts
- Include response content in search (was accidentally dropped)
- Show Parameters instead of raw Request in expanded view; gate on
  params existing so parameterless requests don't show empty block

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
cliffhall 2026-04-20 17:23:49 -04:00
commit 986659ae8f
3 changed files with 24 additions and 25 deletions

View file

@ -11,6 +11,7 @@ import {
} from "@mantine/core"; } from "@mantine/core";
import type { MessageEntry } from "../../../../../../core/mcp/types.js"; import type { MessageEntry } from "../../../../../../core/mcp/types.js";
import { ContentViewer } from "../../elements/ContentViewer/ContentViewer"; import { ContentViewer } from "../../elements/ContentViewer/ContentViewer";
import { extractMethod } from "../historyUtils.js";
export interface HistoryEntryProps { export interface HistoryEntryProps {
entry: MessageEntry; entry: MessageEntry;
@ -63,13 +64,6 @@ function formatPinLabel(isPinned: boolean): string {
return isPinned ? "Unpin" : "Pin"; return isPinned ? "Unpin" : "Pin";
} }
function extractMethod(entry: MessageEntry): string {
if ("method" in entry.message) {
return entry.message.method;
}
return "response";
}
function extractTarget(entry: MessageEntry): string | undefined { function extractTarget(entry: MessageEntry): string | undefined {
const msg = entry.message; const msg = entry.message;
if (!("params" in msg) || !msg.params) return undefined; if (!("params" in msg) || !msg.params) return undefined;
@ -147,16 +141,18 @@ export function HistoryEntry({
<Collapse in={isExpanded}> <Collapse in={isExpanded}>
<Stack gap="sm"> <Stack gap="sm">
<Divider /> <Divider />
<Stack gap="xs"> {"params" in entry.message && entry.message.params && (
<Text size="sm">Request:</Text> <Stack gap="xs">
<ContentViewer <Text size="sm">Parameters:</Text>
block={{ <ContentViewer
type: "text", block={{
text: serializeMessage(entry.message), type: "text",
}} text: serializeMessage(entry.message.params),
copyable }}
/> copyable
</Stack> />
</Stack>
)}
{entry.response && ( {entry.response && (
<Stack gap="xs"> <Stack gap="xs">
<Text size="sm">Response:</Text> <Text size="sm">Response:</Text>

View file

@ -11,6 +11,7 @@ import {
import type { MessageEntry } from "../../../../../../core/mcp/types.js"; import type { MessageEntry } from "../../../../../../core/mcp/types.js";
import { HistoryEntry } from "../HistoryEntry/HistoryEntry"; import { HistoryEntry } from "../HistoryEntry/HistoryEntry";
import { ListToggle } from "../../elements/ListToggle/ListToggle"; import { ListToggle } from "../../elements/ListToggle/ListToggle";
import { extractMethod } from "../historyUtils.js";
export interface HistoryListPanelProps { export interface HistoryListPanelProps {
entries: MessageEntry[]; entries: MessageEntry[];
@ -49,13 +50,6 @@ function formatHistoryTitle(count: number): string {
return `History (${count})`; return `History (${count})`;
} }
function extractMethod(entry: MessageEntry): string {
if ("method" in entry.message) {
return entry.message.method;
}
return "response";
}
function matchesFilters( function matchesFilters(
entry: MessageEntry, entry: MessageEntry,
searchText: string, searchText: string,
@ -65,8 +59,9 @@ function matchesFilters(
if (methodFilter && method !== methodFilter) return false; if (methodFilter && method !== methodFilter) return false;
if (searchText) { if (searchText) {
const term = searchText.toLowerCase(); const term = searchText.toLowerCase();
const responseText = entry.response ? JSON.stringify(entry.response) : "";
const searchable = const searchable =
`${method} ${entry.id} ${JSON.stringify(entry.message)}`.toLowerCase(); `${method} ${entry.id} ${JSON.stringify(entry.message)} ${responseText}`.toLowerCase();
if (!searchable.includes(term)) return false; if (!searchable.includes(term)) return false;
} }
return true; return true;

View file

@ -0,0 +1,8 @@
import type { MessageEntry } from "../../../../../core/mcp/types.js";
export function extractMethod(entry: MessageEntry): string {
if ("method" in entry.message) {
return entry.message.method;
}
return "response";
}