feat(05-03): frontend fallback integration for research display

- ExerciseResearchPanel: add ProviderBadge component showing which AI
  tier (Ollama/Gemini/OpenRouter/OpenCode/Exa) served the response
- Add auto-retry on 429/503 with 2s delay and retry counter in button
- Normalize error messages for common failure modes (network, rate-limit)
- ResearchDisplay: pass onRetry prop to error state for inline retry button
- CSS: .research-panel-controls flex row, .provider-badge with per-provider
  colour coding, .rd-error-actions + .rd-retry button styles
This commit is contained in:
2026-03-02 23:44:32 +01:00
parent ab87e54630
commit 2a0496b915
3 changed files with 150 additions and 21 deletions
@@ -563,3 +563,50 @@
padding: var(--space-2) var(--space-3) var(--space-3);
}
}
/* ============================================
PROVIDER BADGE — AI fallback indicator
============================================ */
.research-panel-controls {
display: flex;
align-items: center;
gap: var(--space-2);
}
.provider-badge {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 2px 8px;
border-radius: 9999px;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.03em;
background: var(--bg-elevated);
border: 1px solid var(--border);
color: var(--text-muted);
white-space: nowrap;
}
.provider-local { border-color: rgba(34, 197, 94, 0.4); color: #4ade80; }
.provider-gemini { border-color: rgba(99, 102, 241, 0.4); color: #818cf8; }
.provider-openrouter { border-color: rgba(234, 179, 8, 0.4); color: #facc15; }
.provider-opencode { border-color: rgba(251, 146, 60, 0.4); color: #fb923c; }
.provider-exa { border-color: rgba(56, 189, 248, 0.4); color: #38bdf8; }
.provider-unknown { border-color: var(--border); color: var(--text-muted); }
/* Error actions row */
.rd-error-actions {
display: flex;
align-items: center;
gap: var(--space-2);
flex-shrink: 0;
}
.rd-retry {
padding: 2px 10px;
font-size: var(--font-xs);
min-height: 28px;
border-radius: var(--radius-sm);
}