From b009880307298abea11efad92da2cd955afafe99 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Thu, 26 Mar 2026 05:10:56 +0000 Subject: fix: expose drained state in agent status API; fix AgentEvent JSON casing AgentStatusInfo was missing drained field so UI couldn't show drain lock. AgentEvent had no JSON tags so ev.agent/event/timestamp were undefined in the stats timeline. UI now shows "Drain locked" card state with undrain CTA. Co-Authored-By: Claude Sonnet 4.6 --- web/app.js | 6 ++++-- web/style.css | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'web') diff --git a/web/app.js b/web/app.js index 25bdee6..c87c609 100644 --- a/web/app.js +++ b/web/app.js @@ -2873,7 +2873,7 @@ function renderStatsPanel(tasks, executions, agentData = { agents: [], events: [ for (const ag of agents) { const card = document.createElement('div'); card.className = 'stats-agent-card'; - const statusClass = ag.rate_limited ? 'agent-rate-limited' : 'agent-available'; + const statusClass = ag.drained ? 'agent-drained' : ag.rate_limited ? 'agent-rate-limited' : 'agent-available'; card.classList.add(statusClass); const nameEl = document.createElement('span'); @@ -2882,7 +2882,9 @@ function renderStatsPanel(tasks, executions, agentData = { agents: [], events: [ const statusEl = document.createElement('span'); statusEl.className = 'stats-agent-status'; - if (ag.rate_limited && ag.until) { + if (ag.drained) { + statusEl.textContent = 'Drain locked — needs manual undrain'; + } else if (ag.rate_limited && ag.until) { const untilDate = new Date(ag.until); const minsLeft = Math.max(0, Math.round((untilDate - Date.now()) / 60000)); statusEl.textContent = `Rate limited — ${minsLeft}m remaining`; diff --git a/web/style.css b/web/style.css index 2bba8dc..1aa6627 100644 --- a/web/style.css +++ b/web/style.css @@ -1727,6 +1727,11 @@ dialog label select:focus { background: color-mix(in srgb, var(--state-failed) 8%, transparent); } +.stats-agent-card.agent-drained { + border-color: var(--state-cancelled); + background: color-mix(in srgb, var(--state-cancelled) 8%, transparent); +} + .stats-agent-name { font-weight: 600; font-size: 0.9rem; -- cgit v1.2.3