npm audit is clean in four of the five installs and reports 1 high in clients/tui:
browserslist <=4.28.6
Severity: high
GHSA-c83g-rgw3-j3cx — unbounded memory growth (no cache eviction) via distinct query results, eventual OOM
GHSA-73wf-gq98-2v4g — uncaught crash / prototype write via untrusted browserslist-stats.json (normalizeStats)
node_modules/browserslist
Where it comes from
It is transitive, through the tui-local ESLint plugin:
@modelcontextprotocol/inspector-tui
└─┬ eslint-plugin-react-hooks@7.1.1
└─┬ @babel/core@7.29.7
└─┬ @babel/helper-compilation-targets@7.29.7
└─┬ browserslist@4.28.2
└─┬ update-browserslist-db@1.2.3
└── browserslist@4.28.2 deduped
This is exactly the peer-shadow case AGENTS.md already documents under
Dependency placement: deleting a root-only
declaration does not delete the client copy, because npm auto-installs an unmet peer into
the install that needs it, and a client-only ESLint plugin drags a client-local tree in with it.
Nothing published is affected
npm audit --omit=dev in clients/tui — 0 vulnerabilities.
- The tarball ships only each client's
build/; pack:verify installs clean into a throwaway
consumer and drives web/cli/tui end to end.
It is not new to v2.5.0
origin/main's tui lockfile pins the same browserslist@4.28.2, so v2.4.0 shipped with this
exact tree — the advisory was published since. The root (4.28.8) and clients/web
(4.28.7) copies float above the 4.28.7 fix line only because #2200 / #2196 refreshed their
lockfiles in this milestone while tui's was not touched.
So this is a reporting change, not a regression, and it does not block the v2.5.0 release
(#2214). But it does mean npm audit across the five installs is no longer clean, which is the
state #2062 established and which the v2.4.0 smoke ledger recorded.
Fix
Per AGENTS.md: pin a transitive with an overrides entry, not with npm audit fix —
which "resolves" an advisory with no upward escape by silently downgrading. clients/tui
already carries an overrides block (ink-select-input, esbuild), so this is one more entry:
"overrides": { "browserslist": "^4.28.7" }
Done when
Found while smoke-testing the v2.5.0 payload — see the note on
#2215 (comment)
npm auditis clean in four of the five installs and reports 1 high inclients/tui:Where it comes from
It is transitive, through the tui-local ESLint plugin:
This is exactly the peer-shadow case
AGENTS.mdalready documents underDependency placement: deleting a root-only
declaration does not delete the client copy, because npm auto-installs an unmet peer into
the install that needs it, and a client-only ESLint plugin drags a client-local tree in with it.
Nothing published is affected
npm audit --omit=devinclients/tui— 0 vulnerabilities.build/;pack:verifyinstalls clean into a throwawayconsumer and drives web/cli/tui end to end.
It is not new to v2.5.0
origin/main's tui lockfile pins the samebrowserslist@4.28.2, so v2.4.0 shipped with thisexact tree — the advisory was published since. The root (
4.28.8) andclients/web(
4.28.7) copies float above the4.28.7fix line only because #2200 / #2196 refreshed theirlockfiles in this milestone while tui's was not touched.
So this is a reporting change, not a regression, and it does not block the v2.5.0 release
(#2214). But it does mean
npm auditacross the five installs is no longer clean, which is thestate #2062 established and which the v2.4.0 smoke ledger recorded.
Fix
Per
AGENTS.md: pin a transitive with anoverridesentry, not withnpm audit fix—which "resolves" an advisory with no upward escape by silently downgrading.
clients/tuialready carries an
overridesblock (ink-select-input,esbuild), so this is one more entry:Done when
npm auditreports 0 vulnerabilities in all five installs, dev includednpm audit --omit=devstill clean in all fivenpm run local:gatepasses (the tui lint stage is what pulls the plugin in)Found while smoke-testing the v2.5.0 payload — see the note on
#2215 (comment)