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:
parent
f104e6e21a
commit
986659ae8f
3 changed files with 24 additions and 25 deletions
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
8
clients/web/src/components/groups/historyUtils.ts
Normal file
8
clients/web/src/components/groups/historyUtils.ts
Normal 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";
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue