inspector/clients/web/src/utils
Repository files (latest commit first)
Filename Latest commit message Latest commit date
cliffhall af3d940e78 fix(auth): stop a config-only PUT deleting stored secrets (#2084)
Round 24 produced no inline comments again. Of the three suppressed items, one
is a pre-existing data-loss bug that predates #1950 entirely.

**Editing a server's config deletes its stored OAuth client secret — from the
keychain, not only from the stores this PR adds.** Filed as #2084 and fixed
here, since the review surfaced it and these lines were already changing.

`useServers.updateServer` deliberately sends `{ id, config }` with no
`settings`, so a config-only save cannot wipe persisted settings. The route
reads that as `preserve` and re-derives settings from the *on-disk* entry —
which by #1356's design no longer holds the secrets. The submitted secret set
is therefore empty, `expectedSecretFields` always lists the OAuth slot, and
the reconcile deleted a value the user never touched. The rename branch was
given `mergeRenameKeychainSecrets` for exactly this reason; the in-place
branch never got the equivalent.

The first fix was too broad — skip obsolete deletion whenever the intent is
`preserve` — and an existing test caught it immediately: stdio `env` is part
of `config`, so a config-only PUT that drops a key really has retired that
secret. Obsolete detection is per-field now:

- **`env:` fields** are implied by the entry's shape, so the new entry no
  longer expecting one is proof it was retired.
- **The OAuth slot** is implied by nothing, so absence counts as "cleared"
  only when the caller spoke about settings at all.

Both directions are tested, and the pre-existing env-key reconcile test still
passes.

Also:

- `refreshingPersist` moves to `lib/`. The combinator computes nothing, but
  what it exists to do is sequence side effects, which is the `lib` half of
  the repo's split; I judged it the other way on the grounds that the
  function is a pure higher-order one, and the rule is about what a module is
  *for*.
- `SecretStorageInfo.plaintext` is documented as file-only and *omitted*
  elsewhere rather than "always false", which is what the producer does and
  what `usableSecretStorage` enforces — the old wording invited a consumer to
  build the exact shape the web client discards.

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

Signed-off-by: cliffhall <cliff@futurescale.com>
2026-08-22 23:30:17 -04:00
..
correlateTransportErrors.test.ts Network: modern Mcp-* headers, new error codes, cancellation-as-abort (#1628) (#1722) 2026-07-18 17:32:05 -04:00
correlateTransportErrors.ts Network: modern Mcp-* headers, new error codes, cancellation-as-abort (#1628) (#1722) 2026-07-18 17:32:05 -04:00
customHeaders.test.ts refactor(web): sharpen the src/lib vs src/utils rule and move misfiled modules (#1784) 2026-07-25 22:24:30 -04:00
customHeaders.ts refactor(web): sharpen the src/lib vs src/utils rule and move misfiled modules (#1784) 2026-07-25 22:24:30 -04:00
deepLink.test.ts web: deep-link auto-connect + machine-readable connection status (#1576) 2026-07-11 22:48:28 -04:00
deepLink.ts web: deep-link auto-connect + machine-readable connection status (#1576) 2026-07-11 22:48:28 -04:00
inspectorTabs.test.ts refactor(web): rename "History" tab/feature to "Protocol" (#1623) 2026-07-09 19:04:54 -04:00
inspectorTabs.ts refactor(web): rename "History" tab/feature to "Protocol" (#1623) 2026-07-09 19:04:54 -04:00
jsonUtils.test.ts fix: address Copilot review round 3 — typed consts, null admission, preset coverage 2026-08-15 18:15:38 -04:00
jsonUtils.ts fix: address Copilot review round 3 — typed consts, null admission, preset coverage 2026-08-15 18:15:38 -04:00
malformedListReport.test.ts fix: return the era-parsed tool, and hide aggregate reports in paginated mode (#1909) 2026-08-15 20:08:03 -04:00
malformedListReport.ts fix: return the era-parsed tool, and hide aggregate reports in paginated mode (#1909) 2026-08-15 20:08:03 -04:00
maskSecrets.test.ts feat(network): show auth response bodies with masked secrets + reveal toggle (#1386) (#1387) 2026-05-31 08:52:13 -04:00
maskSecrets.ts feat(network): show auth response bodies with masked secrets + reveal toggle (#1386) (#1387) 2026-05-31 08:52:13 -04:00
mcpNetworkHeaders.test.ts Network: modern Mcp-* headers, new error codes, cancellation-as-abort (#1628) (#1722) 2026-07-18 17:32:05 -04:00
mcpNetworkHeaders.ts Network: modern Mcp-* headers, new error codes, cancellation-as-abort (#1628) (#1722) 2026-07-18 17:32:05 -04:00
oauthFlow.test.ts Auth hardening CI gaps + SDK consolidation: EMA leg 2 / scopes (#1527) (#1725) 2026-07-19 22:36:21 -04:00
oauthFlow.ts Guided-auth removal, OAuth smoke testing, and TUI/CLI support (#1531) 2026-06-29 15:35:51 -04:00
oauthNetworkPhase.test.ts OAuth: re-key store to (server, issuer) + SEP-837/2350/2352 auth UX (#1694) 2026-07-16 16:52:53 -04:00
oauthNetworkPhase.ts OAuth: re-key store to (server, issuer) + SEP-837/2350/2352 auth UX (#1694) 2026-07-16 16:52:53 -04:00
oauthUx.test.ts All of the mid-session and step-up auth work 2026-07-02 16:35:31 -07:00
oauthUx.ts fix(auth): explicit re-authorize when the OAuth callback state was lost (#1808) (#1810) 2026-07-27 18:08:31 -04:00
pendingReauth.test.ts All of the mid-session and step-up auth work 2026-07-02 16:35:31 -07:00
pendingReauth.ts refactor(web): sharpen the src/lib vs src/utils rule and move misfiled modules (#1784) 2026-07-25 22:24:30 -04:00
sandbox-csp.test.ts refactor(web): sharpen the src/lib vs src/utils rule and move misfiled modules (#1784) 2026-07-25 22:24:30 -04:00
sandbox-csp.ts refactor(web): sharpen the src/lib vs src/utils rule and move misfiled modules (#1784) 2026-07-25 22:24:30 -04:00
schemaUtils.test.ts fix: centralize the nullable-union collapse in core and apply it in the TUI 2026-08-15 16:59:37 -04:00
schemaUtils.ts fix: centralize the nullable-union collapse in core and apply it in the TUI 2026-08-15 16:59:37 -04:00
toolUtils.test.ts fix(web): key tool selection by row identity, not name 2026-08-17 00:02:13 -04:00
toolUtils.ts fix(web): key tool selection by row identity, not name 2026-08-17 00:02:13 -04:00
uriTemplate.test.ts fix: scope the value ceiling to the names a template references 2026-08-17 01:54:37 -04:00
uriTemplate.ts fix: scope the value ceiling to the names a template references 2026-08-17 01:54:37 -04:00