inspector/clients/web/src/components/groups
Repository files (latest commit first)
Filename Latest commit message Latest commit date
cliffhall 15e9260484 fix(auth): make the durability guard provenance-aware, and harden the claim
Round 20, and almost all of it is fallout from round 19's two changes. Both
were right in direction and wrong in the detail, in the same way: each solved
its case by treating a broad thing as a proxy for a narrow one.

**The durability guard wrote newly entered secrets to disk in plaintext.**
Preserving legacy plaintext for a session-scoped store is correct — stripping
it moves the only durable copy into RAM. Using *the whole submitted entry* as
the proxy for "legacy" was not: it turned
`MCP_INSPECTOR_SECRET_STORE=memory` into "write every new secret to
`mcp.json` in the clear", while the footer for that very store says secrets
are written nowhere. A security regression introduced by a data-loss fix, and
the same overshoot in `client.json`.

Provenance decides now. A secret field is kept on disk only when it was
already there, unchanged, in the file being overwritten; a newly entered or
changed value is stripped and lives in the session store, which is exactly
what the footer promises. Where provenance cannot be established — an
unparseable prior file — the value is treated as new, because writing a
secret to disk on a guess is the failure that matters.

**The atomic claim was not as safe as its comments said.** Four ways:

- A crash between the claim and the copy left only
  `secrets.json.migrating-<pid>`. The next run checked the canonical path,
  found nothing, selected the keychain, and every stored credential vanished
  with no warning. Orphans are now adopted at startup.
- Restoring used `rename`, which on POSIX **replaces** its destination — so
  the restore path could overwrite a `secrets.json` a concurrent writer had
  recreated, destroying the later successful write that claiming exists to
  protect. The comment beside it asserted the opposite. `link` + `unlink` is
  the no-clobber primitive this needed.
- Every claim failure was read as a lost race. `EACCES`/`EROFS` leave the
  file exactly where it is, and returning quietly selected the keychain while
  file-backed secrets sat there invisible. Only `ENOENT` is benign now.
- A failed cleanup left a plaintext-capable snapshot on disk with a silent
  catch, while the app reported the keychain as the only store. It names the
  path now.

**A third secret-entry surface had no disclosure at all.** `ServerConfigModal`
takes stdio `env` values, which are extracted into the store exactly as
Server Settings' are — and the footer's own doc comment claimed there were
only two such dialogs. It has the footer now, and every server write that can
carry a secret (config submit, both import flows) refreshes the descriptor,
not just the settings save.

Full `npm run ci` green, staged tree verified first.

Signed-off-by: cliffhall <cliff@futurescale.com>
2026-08-22 22:10:07 -04:00
..
AppControls SDK v2 migration (behavior-neutral, versionNegotiation: 'legacy') (#1624) 2026-07-15 10:44:24 -04:00
AppDetailPanel fix: gate submission on unsendable field text, and on required tool args 2026-08-15 21:19:04 -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 Merge pull request #2039 from modelcontextprotocol/v2/chore/1959-no-floating-promises 2026-08-16 22:35:52 -04:00
ConnectionInfoModal fix(web): render the connected header when a modern server omits serverInfo (#1773) 2026-07-25 11:40:31 -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 refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ImportServerJsonPanel refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -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 chore(deps): migrate to eslint 10 to clear the brace-expansion DoS advisory (#1900) 2026-08-01 20:13:30 -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 chore(deps): migrate to eslint 10 to clear the brace-expansion DoS advisory (#1900) 2026-08-01 20:13:30 -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 SDK v2 migration (behavior-neutral, versionNegotiation: 'legacy') (#1624) 2026-07-15 10:44:24 -04:00
ProtocolControls refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ProtocolEntry fix: mark a rejected standalone response entry as an error too 2026-08-08 17:11:34 -04:00
ProtocolListPanel chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
ReAuthBanner fix(auth): explicit re-authorize when the OAuth callback state was lost (#1808) (#1810) 2026-07-27 18:08:31 -04:00
ResourceControls chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
ResourceLink chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -04:00
ResourceListItem refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ResourcePreviewPanel SDK v2 migration (behavior-neutral, versionNegotiation: 'legacy') (#1624) 2026-07-15 10:44:24 -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 SDK v2 migration (behavior-neutral, versionNegotiation: 'legacy') (#1624) 2026-07-15 10:44:24 -04:00
SamplingRequestPanel refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
SchemaForm docs: correct how a null reaches the number field 2026-08-16 01:08:40 -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 refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -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 Merge branch 'v2/main' into v2/feat/1915-manual-server-headers 2026-08-16 23:21:17 -04:00
ServerSettingsModal style(web): bold the "Secrets:" prefix in the settings-modal footers 2026-08-22 13:31:04 -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 chore(lint): enable no-floating-promises in all five ESLint scopes 2026-08-16 20:57:32 -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: gate submission on unsendable field text, and on required tool args 2026-08-15 21:19:04 -04:00
ToolListItem refactor(web): sweep AGENTS.md TypeScript + Mantine rule violations (#1771) 2026-07-25 11:38:49 -04:00
ToolResultPanel fix(web): name an empty tool result instead of "No results yet" (#1860) 2026-08-16 18:31:01 -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 Resources: subscriptions/listen model on modern servers (era fork) (#1630) (#1730) 2026-07-20 19:33:40 -04:00