You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ProxyStatsModal shell with a Segmented [Config|Stats] tab control (Config
default); hamburger retry-config now opens this unified ui.proxyStats.title
panel on every viewport, the standalone RetryConfigModal wrapper is removed
so RetryConfigForm is the only settings surface, and config uses a grouped
two-column layout (Strategy / Execution Parameters) in a widened 1120px
container with mobile fallbacks. Body is a sectioned ProxyStatsDashboard
(Range Overview / Availability / Retry Analysis / Duration / By Dimension /
Recent Errors) rendering the dual upstream-vs-downstream availability grouped
bars, retry-count histogram, and retry-burden bucket bars via the new BarChart;
each dimension table gains a Dominant Fail Code column. RetryStatsHelpers
renamed .js -> .jsx (contains JSX). The side-by-side UnifiedProxyRetryPage +
ProxyStatsPage are removed. i18n: removed dead viewRetryConfig, added
tabConfig/tabStats/groupStrategy/groupExecution x18 locales. Tests: expanded
retry-config-layout.test.js as a regression guard; modal-mask reverted to the
parent-modal mask model (ProxyStatsModal/RetryConfigModal must not consume
BLUR_MASK_STYLE). history.md updated.
Copy file name to clipboardExpand all lines: history.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,8 @@
2
2
3
3
## Unreleased
4
4
5
+
- ui(proxy-stats): **retry stats UI redesign — unified tabbed Config|Stats modal** — the hamburger `retry-config` entry now opens a single `ProxyStatsModal` with an antd `Segmented` `[Config | Stats]` switch (Config default, the surface most users open this for); the previously divergent desktop (stats-first modal) and mobile (config-only drawer) paths collapse into one shell on every viewport, and the standalone `RetryConfigModal` wrapper is removed so `RetryConfigForm` is the only settings surface. The Stats tab body is a sectioned `ProxyStatsDashboard` (Range Overview / Availability / Retry Analysis / Duration / By Dimension / Recent Errors) rendered with a new dependency-free `BarChart.jsx` (pure SVG/CSS, ResizeObserver-responsive — no chart library added): dual upstream-vs-downstream availability grouped bars (the gap = requests the retry engine rescued), a retry-count histogram, and a retry-burden bucket chart. The Config tab uses a grouped two-column layout (`Strategy` / `Execution Parameters`) inside a widened `1120px` container with mobile fallbacks. Backend `aggregateRecords` (`server/lib/proxy-stats.js`) gains a global `retryBurden` (5 buckets: 0 / 1-5 / 6-20 / 21-50 / >50) and per-bucket `retryCodeCounts` (top-5, sorted desc) / `dominantFailStatus` / `dominantFailCount` on byModel/byPath/byProfile, so each dimension table shows a "Dominant Fail Code" column; `emptyStats()` returns `null` (not `0`) for latency fields so "no data" is distinguishable from a genuine sub-ms value. New `RetryStatsHelpers.jsx` (`fmtMs`/`statusColor`/`availColor`/`dominantFailCell`/`burdenBucketLabel`). New i18n keys across all 18 locales: `ui.proxyStats.{tabConfig,tabStats,upstreamVsDownstream,retryBurden,dominantFail}` and `ui.retryConfig.{groupStrategy,groupExecution}`; the dead `ui.proxyStats.viewRetryConfig` key is removed. The side-by-side `UnifiedProxyRetryPage` + `ProxyStatsPage` are removed. `ProxyStatsDashboard.fetchData` uses a per-request `AbortController` (supersede-on-retrigger + abort-on-unmount) so stale polls can't clobber newer state. New `test/proxy-stats.test.js` pins the bucket boundaries, per-bucket top-5 cap, and null dominant-fail contract; `test/retry-config-layout.test.js` guards the tabbed layout; `test/modal-mask.test.js` reflects the parent-modal mask model (`ProxyStatsModal.jsx`/`RetryConfigModal.jsx` must not consume `BLUR_MASK_STYLE`).
6
+
5
7
## 1.7.5 (2026-07-18)
6
8
7
9
- ui(proxy): **fuse retry config and stats into a unified split-page** — `RetryConfigForm` extracted from RetryConfigModal as inline component; `UnifiedProxyRetryPage` with left config / right stats panels (independent scroll); recent records table filtered to errors only. Shared `isProxyMode()` utility eliminates duplicated proxy-detection logic. Proxy stats toolbar/sidebar buttons removed; unified page now reachable via hamburger menu. P1–P2 code-review fixes applied.
0 commit comments