From 679d8b72cdc1e2111fbf35e570dc0933c6d7f7a2 Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Fri, 29 May 2026 18:43:30 -0700 Subject: [PATCH] feat(agent-queue): dashboard insights column for finished jobs (P1-S3) Read-only from meta: tokens or cost + attempts + line deltas + duration; recognizes the new retries_exhausted result. agent-queue.sh stays the source of truth. --- agent-queue/dashboard.mjs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/agent-queue/dashboard.mjs b/agent-queue/dashboard.mjs index 4ca5ba4..40499f1 100644 --- a/agent-queue/dashboard.mjs +++ b/agent-queue/dashboard.mjs @@ -72,6 +72,18 @@ const parseMeta = (file) => { return out; }; +// Compact per-job insights (read-only from meta; agent-queue.sh is the source of +// truth). Surfaces tokens or cost + attempts + line deltas for finished jobs. +const insightsTag = (m) => { + const parts = []; + if (m.attempts && m.attempts !== '1') parts.push(`x${m.attempts}`); + if (m.cost_usd) parts.push(`$${m.cost_usd}${m.usage_estimated ? '~' : ''}`); + else if (m.tokens_in || m.tokens_out) parts.push(`tok ${m.tokens_in || 0}/${m.tokens_out || 0}`); + if (m.lines_added || m.lines_deleted) parts.push(`+${m.lines_added || 0}/-${m.lines_deleted || 0}`); + if (m.duration_s) parts.push(`${m.duration_s}s`); + return parts.join(' '); +}; + const pidAlive = (pid) => { if (!pid) return false; try { process.kill(Number(pid), 0); return true; } catch { return false; } @@ -307,7 +319,9 @@ function drawBoard() { } else { for (const m of recent) { const res = m.result || ''; - const failedRes = res === 'failed' || res === 'timeout' || res === 'verify_failed' || res === 'rejected'; + const failedRes = res === 'failed' || res === 'timeout' || res === 'verify_failed' || + res === 'rejected' || res === 'retries_exhausted' || res === 'capability_mismatch' || + res === 'no_engine'; const mark = failedRes ? c('red', '✕') : c('green', '▣'); const when = m.ended ? new Date(Number(m.ended) * 1000).toLocaleTimeString() : ''; let label; @@ -317,12 +331,13 @@ function drawBoard() { else if (res === 'verify_failed') label = c('red', 'verify failed'); else if (res === 'timeout') label = c('red', 'timeout'); else if (res === 'rejected') label = c('red', 'rejected'); + else if (res === 'retries_exhausted') label = c('red', 'retries exhausted'); else if (res === 'failed') label = c('red', 'failed rc=' + (m.exit || '?')); else label = c('gray', res || '?'); out.push( ` ${mark} ${trunc(m.job || '?', 34).padEnd(34)} ` + `${c('gray', (m.engine || '').padEnd(7))} ` + - `${label} ${c('gray', when)}` + `${label} ${c('gray', when)} ${c('cyan', insightsTag(m))}` ); } }