From 8c9aac6df13ea6a55eba9a5ed5e29719fff09bcf Mon Sep 17 00:00:00 2001 From: cliffhall Date: Sat, 18 Apr 2026 18:54:48 -0400 Subject: [PATCH] Address PR #1214 code review feedback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix template-expanded URIs not rendering: construct synthetic Resource from readState.uri when the URI is absent from the resources list - Fix non-image blob content rendering raw base64: show placeholder message; also handle audio blobs properly - Hide mimeType display when multiple content items to avoid confusion - Rename ResourceControls selectedTemplate → selectedTemplateUri for consistency with selectedUri and selectedResourceUri Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ResourceControls/ResourceControls.tsx | 8 ++++---- .../ResourcePreviewPanel.tsx | 10 ++++++++-- .../ResourcesScreen/ResourcesScreen.tsx | 20 +++++++++++++------ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/clients/web/src/components/groups/ResourceControls/ResourceControls.tsx b/clients/web/src/components/groups/ResourceControls/ResourceControls.tsx index 06997fcd..3ee2640a 100644 --- a/clients/web/src/components/groups/ResourceControls/ResourceControls.tsx +++ b/clients/web/src/components/groups/ResourceControls/ResourceControls.tsx @@ -22,7 +22,7 @@ export interface ResourceControlsProps { templates: ResourceTemplate[]; subscriptions: InspectorResourceSubscription[]; selectedUri?: string; - selectedTemplate?: string; + selectedTemplateUri?: string; listChanged: boolean; onRefreshList: () => void; onSelectUri: (uri: string) => void; @@ -46,7 +46,7 @@ export function ResourceControls({ templates, subscriptions, selectedUri, - selectedTemplate, + selectedTemplateUri, listChanged, onRefreshList, onSelectUri, @@ -137,9 +137,9 @@ export function ResourceControls({ { - if (template.uriTemplate !== selectedTemplate) + if (template.uriTemplate !== selectedTemplateUri) onSelectTemplate(template.uriTemplate); }} /> diff --git a/clients/web/src/components/groups/ResourcePreviewPanel/ResourcePreviewPanel.tsx b/clients/web/src/components/groups/ResourcePreviewPanel/ResourcePreviewPanel.tsx index ab97194c..8a2a0b97 100644 --- a/clients/web/src/components/groups/ResourcePreviewPanel/ResourcePreviewPanel.tsx +++ b/clients/web/src/components/groups/ResourcePreviewPanel/ResourcePreviewPanel.tsx @@ -30,7 +30,13 @@ function toContentBlock( if (mimeType.startsWith("image/")) { return { type: "image", data: item.blob, mimeType }; } - return { type: "text", text: item.blob }; + if (mimeType.startsWith("audio/")) { + return { type: "audio", data: item.blob, mimeType }; + } + return { + type: "text", + text: `[Binary content (${mimeType}) — preview not supported]`, + }; } function formatLastUpdated(date: Date): string { @@ -113,7 +119,7 @@ export function ResourcePreviewPanel({ ) : ( )} - {mimeType} + {contents.length <= 1 && {mimeType}} diff --git a/clients/web/src/components/screens/ResourcesScreen/ResourcesScreen.tsx b/clients/web/src/components/screens/ResourcesScreen/ResourcesScreen.tsx index 76039d12..85ce0816 100644 --- a/clients/web/src/components/screens/ResourcesScreen/ResourcesScreen.tsx +++ b/clients/web/src/components/screens/ResourcesScreen/ResourcesScreen.tsx @@ -96,6 +96,14 @@ export function ResourcesScreen({ ? templates.find((t) => t.uriTemplate === selectedTemplateUri) : undefined; + // For template-expanded URIs that don't appear in the resources list, + // construct a synthetic Resource so the preview panel can render. + const readResource: Resource | undefined = + selectedResource ?? + (readState?.uri && readState.uri === selectedResourceUri + ? { name: readState.uri, uri: readState.uri } + : undefined); + function renderReadState() { if (!readState) return null; @@ -120,17 +128,17 @@ export function ResourcesScreen({ ); } - if (readState.result && selectedResource) { + if (readState.result && readResource) { return ( onReadResource(selectedResource.uri)} - onSubscribe={() => onSubscribeResource(selectedResource.uri)} - onUnsubscribe={() => onUnsubscribeResource(selectedResource.uri)} + onRefresh={() => onReadResource(readResource.uri)} + onSubscribe={() => onSubscribeResource(readResource.uri)} + onUnsubscribe={() => onUnsubscribeResource(readResource.uri)} /> ); @@ -148,7 +156,7 @@ export function ResourcesScreen({ templates={templates} subscriptions={subscriptions} selectedUri={selectedResourceUri} - selectedTemplate={selectedTemplateUri} + selectedTemplateUri={selectedTemplateUri} listChanged={listChanged} onRefreshList={onRefreshList} onSelectUri={onSelectUri}