feat: surface 429 Retry-After as cooldown toast on invite resend - #15676
feat: surface 429 Retry-After as cooldown toast on invite resend#15676christian-byrne wants to merge 2 commits into
Conversation
WorkspaceApiError gains a retryAfter field parsed from the Retry-After header (integer seconds only). handleResendInvite in useMembersPanel now shows a dismissible warn toast with pluralised countdown instead of the generic error toast when the server rate-limits. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
Included review availability: 9 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 10 reviews per hour. 📝 WalkthroughWalkthroughThe workspace API now parses ChangesInvite resend cooldown
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to This change adds a clearer cooldown toast for rate-limited invite resends while preserving existing handling for other outcomes; no actionable merge-blocking risk remains beyond normal checks and review. Sequence Diagram(s)sequenceDiagram
participant MembersPanel
participant WorkspaceApi
participant WorkspaceApiError
participant Toast
MembersPanel->>WorkspaceApi: resend invite
WorkspaceApi-->>WorkspaceApiError: HTTP 429 with retryAfter
WorkspaceApiError-->>MembersPanel: throw rate-limit error
MembersPanel->>Toast: show localized cooldown warning
Suggested reviewers: Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 inconclusive)
✅ Passed checks (6 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1980 passed, 0 failed · 2 flaky📊 Browser Reports
📦 Bundle: 9.11 MB gzip 🔴 +295 BDetailsSummary
Category Glance App Entry Points — 3.71 kB (baseline 3.71 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.38 MB (baseline 1.38 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 2 added / 2 removed / 1 unchanged Views & Navigation — 124 kB (baseline 124 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 13 added / 13 removed / 4 unchanged Panels & Settings — 591 kB (baseline 591 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 11 added / 11 removed / 16 unchanged User & Accounts — 27.5 kB (baseline 27.5 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 6 added / 6 removed / 5 unchanged Editors & Dialogs — 125 kB (baseline 125 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 7 added / 7 removed / 1 unchanged UI Components — 67.1 kB (baseline 67.1 kB) • ⚪ 0 BReusable component library chunks
Status: 6 added / 6 removed / 8 unchanged Data & Services — 3.53 MB (baseline 3.53 MB) • 🔴 +429 BStores, services, APIs, and repositories
Status: 14 added / 14 removed / 3 unchanged Utilities & Hooks — 549 kB (baseline 549 kB) • ⚪ 0 BHelpers, composables, and utility bundles
Status: 21 added / 21 removed / 16 unchanged Vendor & Third-Party — 18.1 MB (baseline 18.1 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 18 unchanged Other — 14.1 MB (baseline 14.1 MB) • 🔴 +587 BBundles that do not match a named category
Status: 74 added / 74 removed / 211 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-08-23T06:09:13.643Z",
"gitSha": "441fcd8c2be2d9fc4f1c4f55f9ab0ed42a460f8e",
"branch": "fix/resend-invite-layering",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2024.5780000000195,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.586999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 501.2559999999999,
"heapDeltaBytes": 332520,
"heapUsedBytes": 62354652,
"domNodes": -282,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 7.218000000000001,
"eventListeners": -181,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-idle",
"durationMs": 2017.0630000000074,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.539999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 503.68199999999996,
"heapDeltaBytes": 20004060,
"heapUsedBytes": 81720496,
"domNodes": -282,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 8.332,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2111.507999999986,
"styleRecalcs": 79,
"styleRecalcDurationMs": 54.226,
"layouts": 12,
"layoutDurationMs": 3.8579999999999997,
"taskDurationMs": 1043.854,
"heapDeltaBytes": 10038044,
"heapUsedBytes": 72212900,
"domNodes": -276,
"jsHeapTotalBytes": 5758976,
"scriptDurationMs": 106.601,
"eventListeners": -185,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1794.6590000000242,
"styleRecalcs": 75,
"styleRecalcDurationMs": 32.938,
"layouts": 12,
"layoutDurationMs": 3.3819999999999997,
"taskDurationMs": 848.838,
"heapDeltaBytes": 8983060,
"heapUsedBytes": 71586136,
"domNodes": -279,
"jsHeapTotalBytes": 5758976,
"scriptDurationMs": 99.19699999999999,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1724.9889999999937,
"styleRecalcs": 30,
"styleRecalcDurationMs": 16.460999999999995,
"layouts": 6,
"layoutDurationMs": 0.6629999999999999,
"taskDurationMs": 360.47200000000004,
"heapDeltaBytes": 3261420,
"heapUsedBytes": 65868184,
"domNodes": 76,
"jsHeapTotalBytes": 4718592,
"scriptDurationMs": 9.134,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1717.8199999999606,
"styleRecalcs": 31,
"styleRecalcDurationMs": 16.598000000000003,
"layouts": 6,
"layoutDurationMs": 0.6100000000000001,
"taskDurationMs": 367.80400000000003,
"heapDeltaBytes": 3256240,
"heapUsedBytes": 65723740,
"domNodes": 75,
"jsHeapTotalBytes": 5505024,
"scriptDurationMs": 10.449000000000002,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 618.504999999999,
"styleRecalcs": 11,
"styleRecalcDurationMs": 6.931,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 374.40000000000003,
"heapDeltaBytes": 9806784,
"heapUsedBytes": 72098552,
"domNodes": 18,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 51.477,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "dom-widget-clipping",
"durationMs": 559.8919999999907,
"styleRecalcs": 13,
"styleRecalcDurationMs": 8.705,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 348.92400000000004,
"heapDeltaBytes": 10817260,
"heapUsedBytes": 73338636,
"domNodes": 22,
"jsHeapTotalBytes": 5505024,
"scriptDurationMs": 49.522,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2022.3470000000248,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.177,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 607.151,
"heapDeltaBytes": 12930848,
"heapUsedBytes": 88751000,
"domNodes": -284,
"jsHeapTotalBytes": 3928064,
"scriptDurationMs": 13.562999999999999,
"eventListeners": -177,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2022.2009999999955,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.752999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 616.614,
"heapDeltaBytes": 12884256,
"heapUsedBytes": 88789460,
"domNodes": -278,
"jsHeapTotalBytes": 3403776,
"scriptDurationMs": 15.855999999999995,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2135.1420000000303,
"styleRecalcs": 68,
"styleRecalcDurationMs": 12.786999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1160.861,
"heapDeltaBytes": -5768992,
"heapUsedBytes": 71878308,
"domNodes": -278,
"jsHeapTotalBytes": -565248,
"scriptDurationMs": 323.256,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2149.836999999934,
"styleRecalcs": 70,
"styleRecalcDurationMs": 17.433999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1148.747,
"heapDeltaBytes": -4801488,
"heapUsedBytes": 72853068,
"domNodes": -238,
"jsHeapTotalBytes": -40960,
"scriptDurationMs": 322.831,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-zoom",
"durationMs": 3161.230000000046,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.177999999999995,
"layouts": 60,
"layoutDurationMs": 7.414000000000001,
"taskDurationMs": 1355.0680000000002,
"heapDeltaBytes": -13218664,
"heapUsedBytes": 64770668,
"domNodes": -288,
"jsHeapTotalBytes": 3928064,
"scriptDurationMs": 368.11699999999996,
"eventListeners": -185,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3136.6859999999406,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.354000000000003,
"layouts": 60,
"layoutDurationMs": 7.615,
"taskDurationMs": 1356.185,
"heapDeltaBytes": -12884928,
"heapUsedBytes": 64853020,
"domNodes": -288,
"jsHeapTotalBytes": 5500928,
"scriptDurationMs": 363.00300000000004,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "legacy-node-drag",
"durationMs": 2217.1150000000353,
"styleRecalcs": 46,
"styleRecalcDurationMs": 12.728999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1467.8850000000002,
"heapDeltaBytes": -20478528,
"heapUsedBytes": 64215764,
"domNodes": -248,
"jsHeapTotalBytes": 5763072,
"scriptDurationMs": 446.84100000000007,
"eventListeners": 31,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "legacy-node-drag",
"durationMs": 2176.364000000035,
"styleRecalcs": 47,
"styleRecalcDurationMs": 10.132000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1401.613,
"heapDeltaBytes": -14938652,
"heapUsedBytes": 70278044,
"domNodes": 14,
"jsHeapTotalBytes": 8163328,
"scriptDurationMs": 441.37800000000004,
"eventListeners": 186,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2061.3109999999892,
"styleRecalcs": 7,
"styleRecalcDurationMs": 6.128999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 635.51,
"heapDeltaBytes": -10898024,
"heapUsedBytes": 73962028,
"domNodes": -276,
"jsHeapTotalBytes": 4452352,
"scriptDurationMs": 12.898,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2029.9219999999423,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.973999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 621.3029999999999,
"heapDeltaBytes": -13277136,
"heapUsedBytes": 64565420,
"domNodes": -283,
"jsHeapTotalBytes": 3141632,
"scriptDurationMs": 13.857999999999999,
"eventListeners": -177,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 563.9590000000112,
"styleRecalcs": 46,
"styleRecalcDurationMs": 9.438,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 370.513,
"heapDeltaBytes": 11465696,
"heapUsedBytes": 74006168,
"domNodes": 18,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 115.34400000000001,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 559.2690000000857,
"styleRecalcs": 47,
"styleRecalcDurationMs": 9.671,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 372.83299999999997,
"heapDeltaBytes": 11823656,
"heapUsedBytes": 74454052,
"domNodes": 20,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 110.52000000000001,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-idle",
"durationMs": 2016.963999999973,
"styleRecalcs": 9,
"styleRecalcDurationMs": 6.646000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 493.14599999999996,
"heapDeltaBytes": 2415708,
"heapUsedBytes": 65206472,
"domNodes": -281,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 7.802,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2042.0060000000149,
"styleRecalcs": 10,
"styleRecalcDurationMs": 14.48,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 509.58899999999994,
"heapDeltaBytes": 2399120,
"heapUsedBytes": 65220068,
"domNodes": -280,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 7.650999999999998,
"eventListeners": -181,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1717.2669999999925,
"styleRecalcs": 76,
"styleRecalcDurationMs": 33.181999999999995,
"layouts": 16,
"layoutDurationMs": 3.9699999999999998,
"taskDurationMs": 774.5079999999999,
"heapDeltaBytes": -5302228,
"heapUsedBytes": 57195744,
"domNodes": -281,
"jsHeapTotalBytes": 4972544,
"scriptDurationMs": 75.944,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1724.7540000000186,
"styleRecalcs": 75,
"styleRecalcDurationMs": 35.421,
"layouts": 16,
"layoutDurationMs": 4.47,
"taskDurationMs": 781.551,
"heapDeltaBytes": -5162252,
"heapUsedBytes": 57082016,
"domNodes": -279,
"jsHeapTotalBytes": 4448256,
"scriptDurationMs": 75.58999999999999,
"eventListeners": -151,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-transition-enter",
"durationMs": 1383.3239999999591,
"styleRecalcs": 18,
"styleRecalcDurationMs": 28.041999999999998,
"layouts": 13,
"layoutDurationMs": 15.086999999999998,
"taskDurationMs": 878.4809999999999,
"heapDeltaBytes": -2153168,
"heapUsedBytes": 96155804,
"domNodes": 13673,
"jsHeapTotalBytes": 13631488,
"scriptDurationMs": 16.496999999999996,
"eventListeners": 2375,
"totalBlockingTimeMs": 129,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8160.686999999996,
"styleRecalcs": 250,
"styleRecalcDurationMs": 35.754999999999995,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4103.549,
"heapDeltaBytes": 5820556,
"heapUsedBytes": 82597284,
"domNodes": -242,
"jsHeapTotalBytes": -303104,
"scriptDurationMs": 1045.3349999999998,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8196.282999999994,
"styleRecalcs": 250,
"styleRecalcDurationMs": 35.382000000000005,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4091.761,
"heapDeltaBytes": 15586708,
"heapUsedBytes": 91532564,
"domNodes": -284,
"jsHeapTotalBytes": 4677632,
"scriptDurationMs": 1035.244,
"eventListeners": -163,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 15243.63199999999,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 14617.789999999999,
"heapDeltaBytes": -51047968,
"heapUsedBytes": 180885476,
"domNodes": -8312,
"jsHeapTotalBytes": -22835200,
"scriptDurationMs": 93.148,
"eventListeners": -16391,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 15319.991999999957,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 14655.703,
"heapDeltaBytes": -48895744,
"heapUsedBytes": 182376464,
"domNodes": -8312,
"jsHeapTotalBytes": -10248192,
"scriptDurationMs": 85.142,
"eventListeners": -16393,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 18251.627999999982,
"styleRecalcs": 159,
"styleRecalcDurationMs": 16.596,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17834.702999999998,
"heapDeltaBytes": -39672008,
"heapUsedBytes": 172842828,
"domNodes": -8312,
"jsHeapTotalBytes": -18391040,
"scriptDurationMs": 464.447,
"eventListeners": -16387,
"totalBlockingTimeMs": 15,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 18440.58199999995,
"styleRecalcs": 162,
"styleRecalcDurationMs": 17.342999999999996,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17963.059999999998,
"heapDeltaBytes": -46652212,
"heapUsedBytes": 174080004,
"domNodes": -8312,
"jsHeapTotalBytes": -21368832,
"scriptDurationMs": 461.66499999999996,
"eventListeners": -16385,
"totalBlockingTimeMs": 19,
"frameDurationMs": 17.223333333333358,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 481.20499999998856,
"styleRecalcs": 16,
"styleRecalcDurationMs": 23.415,
"layouts": 4,
"layoutDurationMs": 1.378,
"taskDurationMs": 116.42899999999999,
"heapDeltaBytes": 4976728,
"heapUsedBytes": 67449544,
"domNodes": 128,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 7.3500000000000005,
"eventListeners": 97,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999727
},
{
"name": "workflow-execution",
"durationMs": 116.80300000000443,
"styleRecalcs": 8,
"styleRecalcDurationMs": 14.375,
"layouts": 2,
"layoutDurationMs": 0.959,
"taskDurationMs": 76.37799999999999,
"heapDeltaBytes": 3020804,
"heapUsedBytes": 64917116,
"domNodes": 128,
"jsHeapTotalBytes": 262144,
"scriptDurationMs": 5.4079999999999995,
"eventListeners": 25,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66666666666665,
"p95FrameDurationMs": 16.700000000000728
}
]
} |
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## main #15676 +/- ##
==========================================
- Coverage 81.31% 80.00% -1.32%
==========================================
Files 1873 1873
Lines 106745 112576 +5831
Branches 33400 35204 +1804
==========================================
+ Hits 86802 90064 +3262
- Misses 19597 22051 +2454
- Partials 346 461 +115
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 154 files with indirect coverage changes 🚀 New features to boost your workflow:
|
|
Summary
retryAfter?: numberfield toWorkspaceApiError, parsed from theRetry-Afterresponse header on HTTP 429 responses (integer seconds only; HTTP-date form falls back to undefined)handleResendInviteinuseMembersPanelnow shows a dismissible warn toast with a pluralised countdown ("You can resend in N second(s)") instead of the generic error toast when the server rate-limitsContext
The original resend-invite PR (#13137) shipped the API call and store wiring but the 429 cooldown UX was not included. This is a follow-up to complete that flow.
Test plan
Retry-After: 30header) — verify warn toast with countdown appearsRetry-Afterheader — verify warn toast appears without detail line🤖 Generated with Claude Code