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