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.
This commit is contained in:
parent
1758bc1ab1
commit
679d8b72cd
@ -72,6 +72,18 @@ const parseMeta = (file) => {
|
|||||||
return out;
|
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) => {
|
const pidAlive = (pid) => {
|
||||||
if (!pid) return false;
|
if (!pid) return false;
|
||||||
try { process.kill(Number(pid), 0); return true; } catch { return false; }
|
try { process.kill(Number(pid), 0); return true; } catch { return false; }
|
||||||
@ -307,7 +319,9 @@ function drawBoard() {
|
|||||||
} else {
|
} else {
|
||||||
for (const m of recent) {
|
for (const m of recent) {
|
||||||
const res = m.result || '';
|
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 mark = failedRes ? c('red', '✕') : c('green', '▣');
|
||||||
const when = m.ended ? new Date(Number(m.ended) * 1000).toLocaleTimeString() : '';
|
const when = m.ended ? new Date(Number(m.ended) * 1000).toLocaleTimeString() : '';
|
||||||
let label;
|
let label;
|
||||||
@ -317,12 +331,13 @@ function drawBoard() {
|
|||||||
else if (res === 'verify_failed') label = c('red', 'verify failed');
|
else if (res === 'verify_failed') label = c('red', 'verify failed');
|
||||||
else if (res === 'timeout') label = c('red', 'timeout');
|
else if (res === 'timeout') label = c('red', 'timeout');
|
||||||
else if (res === 'rejected') label = c('red', 'rejected');
|
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 if (res === 'failed') label = c('red', 'failed rc=' + (m.exit || '?'));
|
||||||
else label = c('gray', res || '?');
|
else label = c('gray', res || '?');
|
||||||
out.push(
|
out.push(
|
||||||
` ${mark} ${trunc(m.job || '?', 34).padEnd(34)} ` +
|
` ${mark} ${trunc(m.job || '?', 34).padEnd(34)} ` +
|
||||||
`${c('gray', (m.engine || '').padEnd(7))} ` +
|
`${c('gray', (m.engine || '').padEnd(7))} ` +
|
||||||
`${label} ${c('gray', when)}`
|
`${label} ${c('gray', when)} ${c('cyan', insightsTag(m))}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user