commit bfd97a203969e55db8b901dd4e9779c27b575264
parent 03e902b2a6cd15b9a3ea19d8800e869d6dafb602
Author: Brian Graham <brian@buildingbetterteams.de>
Date: Tue, 7 Apr 2026 07:20:20 +0200
Add rich UI widget for api_retry rate limit events in transcript
Shows red RATE LIMITED badge with status code, error type,
attempt count, and retry delay. Replaces raw JSON fallback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Diffstat:
1 file changed, 27 insertions(+), 0 deletions(-)
diff --git a/dashboard/src/components/TranscriptViewer.tsx b/dashboard/src/components/TranscriptViewer.tsx
@@ -441,6 +441,33 @@ function renderEvent(event: TranscriptEvent, index: number): ReactNode {
);
}
+ // API retry / rate limit
+ if (type === "system" && event.subtype === "api_retry") {
+ const attempt = (event.attempt as number) || 0;
+ const maxRetries = (event.max_retries as number) || 10;
+ const delay = (event.retry_delay_ms as number) || 0;
+ const errorStatus = (event.error_status as number) || 0;
+ const error = (event.error as string) || "";
+ return (
+ <EventCard key={index} borderColor={theme.red} bgTint="rgba(239, 68, 68, 0.06)" compact>
+ <div style={{ display: "flex", alignItems: "center", gap: 10, fontSize: "0.75rem", fontFamily: theme.fontMono }}>
+ <span style={{ color: theme.red, fontWeight: 700, fontSize: "0.7rem", textTransform: "uppercase", letterSpacing: "0.05em" }}>
+ RATE LIMITED
+ </span>
+ <span style={{ color: theme.textMuted }}>
+ {errorStatus} {error}
+ </span>
+ <span style={{ color: theme.textMuted }}>
+ attempt {attempt}/{maxRetries}
+ </span>
+ <span style={{ color: theme.textMuted }}>
+ retry in {(delay / 1000).toFixed(1)}s
+ </span>
+ </div>
+ </EventCard>
+ );
+ }
+
// Harness config event
if (type === "harness" && event.subtype === "config") {
const tools = Array.isArray(event.tools) ? (event.tools as string[]).join(", ") : "";