rebrand + purge orphaned frontend: Chat Switchboard → Switchboard Core
Branding: bulk rename across 50+ files (Go, JS, CSS, HTML, YAML, JSON, shell scripts). Fix Helm chart description and git repo URLs. Fix test helper taglines. Admin surface: strip 14 gutted tabs (providers, models, personas, roles, knowledge, memory, tasks, health, routing, capabilities, channels, dashboard, usage, stats). Collapse to 4 categories: People, Workflows, System, Monitoring. Settings surface: strip 11 gutted tabs (models, personas, providers, roles, knowledge, memory, usage, workflows, tasks, data, gitkeys). Keep: general, appearance, profile, teams, connections, notifications. Team-admin surface: strip 5 gutted tabs (personas, providers, knowledge, tasks, usage). Keep: members, groups, connections, workflows, settings, activity. Components: delete chat-pane/ (13 files, 1938 lines) and notes-pane/ (10 files, 2381 lines). main.go: remove stale Health.Prune maintenance goroutine. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,57 +0,0 @@
|
||||
/**
|
||||
* Admin > Routing > Health
|
||||
*/
|
||||
const { html } = window;
|
||||
const { useState, useEffect, useCallback, useRef } = hooks;
|
||||
|
||||
export default function HealthSection() {
|
||||
const [providers, setProviders] = useState([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const timerRef = useRef(null);
|
||||
|
||||
const load = useCallback(async () => {
|
||||
try {
|
||||
const data = await sw.api.admin.providers.health();
|
||||
setProviders(data || []);
|
||||
} catch (e) { sw.toast(e.message, 'error'); }
|
||||
finally { setLoading(false); }
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
load();
|
||||
timerRef.current = setInterval(load, 30000);
|
||||
return () => clearInterval(timerRef.current);
|
||||
}, []);
|
||||
|
||||
function statusClass(s) {
|
||||
if (s === 'healthy') return 'badge-active';
|
||||
if (s === 'degraded') return 'badge-pending';
|
||||
return 'badge-inactive';
|
||||
}
|
||||
|
||||
if (loading) return html`<div class="settings-placeholder">Loading\u2026</div>`;
|
||||
|
||||
return html`
|
||||
<div>
|
||||
<p class="text-muted" style="font-size:12px;margin-bottom:12px;">Auto-refreshes every 30s</p>
|
||||
<div class="stat-cards-grid">
|
||||
${providers.length === 0 && html`<div class="empty-hint">No providers</div>`}
|
||||
${providers.map(p => html`
|
||||
<div class="dashboard-provider-card" key=${p.provider_config_id}>
|
||||
<div style="display:flex;align-items:center;gap:8px;margin-bottom:8px;">
|
||||
<strong>${p.provider_config_name || p.provider_config_id}</strong>
|
||||
<span class="badge ${statusClass(p.status)}">${p.status}</span>
|
||||
</div>
|
||||
<div style="font-size:12px;color:var(--text-2);">
|
||||
<div>Error rate: ${((p.error_rate || 0) * 100).toFixed(1)}%</div>
|
||||
<div>Avg latency: ${Math.round(p.avg_latency_ms || 0)}ms</div>
|
||||
<div>Timeout rate: ${((p.timeout_rate || 0) * 100).toFixed(1)}%</div>
|
||||
<div>Rate limits: ${p.rate_limit_count || 0}</div>
|
||||
${p.last_error && html`<div style="color:var(--danger);margin-top:4px;font-size:11px;">Last error: ${p.last_error}</div>`}
|
||||
</div>
|
||||
</div>
|
||||
`)}
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
Reference in New Issue
Block a user