diff --git a/public/app.js b/public/app.js index 27979f9..119d4a6 100644 --- a/public/app.js +++ b/public/app.js @@ -1537,10 +1537,17 @@ async function refreshAiPanel() { let status; let runs; let detail = null; + let details = {}; try { [status, runs] = await Promise.all([getJson('/api/ai/status'), getJson('/api/ai/runs')]); const focus = runs.find((r) => r.status === 'running') || runs[0]; if (focus) detail = await getJson(`/api/ai/runs/${focus.id}`); + if (detail) details[detail.id] = detail; + // Runs that failed something need their detail too, or the list of failures + // has nothing to draw: without this only the newest run ever gets one. + for (const r of runs.slice(0, 5)) { + if (r.failed > 0 && !details[r.id]) details[r.id] = await getJson(`/api/ai/runs/${r.id}`); + } } catch { aiPoll = setTimeout(refreshAiPanel, 5000); return; @@ -1548,7 +1555,7 @@ async function refreshAiPanel() { if (selectedScope !== 'ai' || !document.getElementById('aiRuns')) return; const running = runs.some((r) => r.status === 'running'); const changed = aiState.expectChange || (aiState.runs || []).some((r) => r.status === 'running'); - aiState = { ...aiState, status, runs, detail }; + aiState = { ...aiState, status, runs, detail, details }; renderAiLive(); if (changed && !running) { aiState.expectChange = false; @@ -1561,7 +1568,7 @@ async function refreshAiPanel() { } function renderAiLive() { - const { status, runs = [], detail } = aiState; + const { status, runs = [], detail, details = {} } = aiState; if (!status || !document.getElementById('aiRuns')) return; const c = status.config; document.getElementById('aiSetup').innerHTML = status.problem @@ -1578,7 +1585,7 @@ function renderAiLive() { start.disabled = Boolean(status.problem) || running; start.title = running ? 'A run is going: wait for it, or stop it' : ''; document.getElementById('aiRuns').innerHTML = runs.length - ? runs.slice(0, 5).map((r) => runHtml(r, detail && detail.id === r.id ? detail : null)).join('') + ? runs.slice(0, 5).map((r) => runHtml(r, details[r.id] || (detail && detail.id === r.id ? detail : null))).join('') : '
No runs yet.
'; const s = status.search; document.getElementById('aiSearch').textContent = s.error