inspector/clients/web/src/components/groups
Repository files (latest commit first)
Filename Latest commit message Latest commit date
cliffhall 3153f0305a fix: key resource list rows by position so duplicate URIs cannot collide
The Resources sidebar keyed every row on its `uri` (and templates on
`uriTemplate`), but nothing in MCP makes those unique — a server may return
the same URI twice, and `ManagedListState.applyItems` replaces the list
wholesale, so a repeat is what the server actually sent. React logged
`Encountered two children with the same key` on every render, and a
filtered-out row survived reconciliation instead of unmounting.

This is the resources counterpart of #1957. The row identity is now the same
`listRowKey(id, sourceIndex)` the Tools sidebar has used since then, extracted
so the two formats cannot drift; `toolRowKey` delegates to it. Applied to all
three Resources lists and to `RootsTable`, whose user-maintained list can
collect a duplicate URI the same way.

Selection stays keyed on the URI, deliberately: unlike a duplicated tool name
(#2001), duplicate rows here denote the same resource — a `resources/read`
takes the URI — so highlighting both is correct. Only the React key needs to
tell them apart.

Adds `ServerConfig.duplicateResourceUris` and the
`duplicate-resource-uris-http.json` showcase config, the `resources/list`
mirror of `duplicateToolNames`, so the defect has a fixture to reproduce it —
appended rather than adjacent, for the reason #1957 documented.

Closes #2206

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yVgAJz4wpkS4mkGk7DQnp
Signed-off-by: cliffhall <cliff@futurescale.com>
2026-09-06 19:43:47 -04:00
..
AppControls SDK v2 migration (behavior-neutral, versionNegotiation: 'legacy') (#1624) 2026-07-15 10:44:24 -04:00
AppDetailPanel fix(web): refuse a raw-JSON tool argument the schema would retype (#2171) 2026-08-27 22:57:29 -04:00
AppListItem refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ClientSettingsForm refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ClientSettingsModal feat(web): state the file store as a sentence, and copy its path on click 2026-08-22 14:05:13 -04:00
ConnectionInfoContent fix(web): make the Connection Info extension sections say something 2026-09-04 22:57:51 -04:00
ConnectionInfoModal fix(web): render the connected header when a modern server omits serverInfo (#1773) 2026-07-25 11:40:31 -04:00
EditReplayModal fix(web): reject a negative-zero literal, which loses its sign when serialized 2026-08-27 06:11:23 -04:00
ElicitationFormPanel fix: gate submission on unsendable field text, and on required tool args 2026-08-15 21:19:04 -04:00
ElicitationUrlPanel refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ExperimentalFeaturesPanel feat(web): use the Ace JSON editor everywhere, and restore the raw-JSON toggle 2026-08-27 02:24:22 -04:00
ImportServerJsonPanel feat(web): use the Ace JSON editor everywhere, and restore the raw-JSON toggle 2026-08-27 02:24:22 -04:00
InlineElicitationRequest fix: gate submission on unsendable field text, and on required tool args 2026-08-15 21:19:04 -04:00
InlineSamplingRequest MRTR: drive input_required manually to keep pending-request UX (#1704) (#1719) 2026-07-17 23:15:19 -04:00
LogControls refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
LogStreamPanel chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
MessageDirectionFilter chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
MonitoringControls chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
MonitoringScreen chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
MrtrConversation fix(web): read the literal, not the parsed number; project cursors and tool args 2026-08-27 04:56:22 -04:00
NetworkControls fix(web): section-header hover outline + clear buttons out of tab order (#1487) (#1488) 2026-06-14 22:27:46 -04:00
NetworkEntry fix(web): reject a reshaped replay param, and forward a declared JSON body 2026-08-27 04:17:19 -04:00
NetworkStreamPanel chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
OutputValidationModal chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
PendingClientRequestModal chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
PendingClientRequests refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
PromptArgumentsForm chore(deps): migrate to eslint 10 to clear the brace-expansion DoS advisory (#1900) 2026-08-01 20:13:30 -04:00
PromptControls fix: salvage a list result's valid entries when one is malformed (#1909) 2026-08-15 16:52:11 -04:00
PromptListItem refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
PromptMessagesDisplay chore(web): address Copilot review on the tab smoke 2026-08-26 23:35:58 -04:00
ProtocolControls refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ProtocolEntry fix(web): resolve the replay tool from the draft, and say why a draft is stuck 2026-08-27 05:16:23 -04:00
ProtocolListPanel fix(web): read the literal, not the parsed number; project cursors and tool args 2026-08-27 04:56:22 -04:00
ReAuthBanner fix: cap the re-auth banner width and move its flat CSS into the Paper theme (#2218) 2026-09-05 23:11:23 -04:00
ResourceControls fix: key resource list rows by position so duplicate URIs cannot collide 2026-09-06 19:43:47 -04:00
ResourceLink feat(web): use the Ace JSON editor everywhere, and restore the raw-JSON toggle 2026-08-27 02:24:22 -04:00
ResourceListItem refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ResourcePreviewPanel feat: make Conformance the one place a skill verdict is reported (#2263) 2026-09-05 23:45:14 -04:00
ResourceSubscribedItem test: raise per-file coverage gate to 90 across all clients (closes #1271) (#1532) 2026-06-27 15:26:03 -04:00
ResourceTemplatePanel fix: read the completions map by own property, not through the prototype 2026-08-17 01:25:58 -04:00
RootsTable fix: key resource list rows by position so duplicate URIs cannot collide 2026-09-06 19:43:47 -04:00
SamplingRequestPanel refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
SchemaForm fix(web): refuse a raw-JSON tool argument the schema would retype (#2171) 2026-08-27 22:57:29 -04:00
ServerAddMenu feat(web,core): import client configs and registry server.json (#1348) (#1511) 2026-06-23 19:52:08 -04:00
ServerCard refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ServerConfigModal fix(auth): make the durability guard provenance-aware, and harden the claim 2026-08-22 22:10:07 -04:00
ServerImportConfigModal refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ServerImportJsonModal fix(web): remove the wall-clock race in the import-JSON debounce guard test 2026-09-05 00:57:03 -04:00
ServerListControls refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ServerRemoveConfirmModal refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ServerSettingsForm fix(auth): keep the failure path total, and align the docs with the new order (#2144) 2026-08-28 05:55:00 -04:00
ServerSettingsModal feat(auth): revoke OAuth tokens at the authorization server on clear (#2144) 2026-08-28 00:48:57 -04:00
SortableServerCard refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
StepUpAuthModal refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
StructuredOutputPanel fix(web): address Copilot review on the shared JSON editor 2026-08-27 02:44:21 -04:00
TaskCard chore(deps): migrate to eslint 10 to clear the brace-expansion DoS advisory (#1900) 2026-08-01 20:13:30 -04:00
TaskControls refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
TaskListPanel refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ToolControls fix(web): key tool selection by row identity, not name 2026-08-17 00:02:13 -04:00
ToolDetailPanel fix(web): refuse a raw-JSON tool argument the schema would retype (#2171) 2026-08-27 22:57:29 -04:00
ToolListItem fix: count severities correctly, gate remote-ref on $id, order --strict checks 2026-08-25 02:54:21 -04:00
ToolResultPanel feat(web): use the Ace JSON editor everywhere, and restore the raw-JSON toggle 2026-08-27 02:24:22 -04:00
UrlElicitationErrorModal chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
ViewHeader test(web): settle real-timer Transitions so the coverage gate can't leak 'window is not defined' (#1786) (#1793) 2026-07-26 15:49:33 -04:00
protocolUtils.test.ts Resources: subscriptions/listen model on modern servers (era fork) (#1630) (#1730) 2026-07-20 19:33:40 -04:00
protocolUtils.ts chore(web): address Copilot review on #2127 2026-08-26 18:24:09 -04:00