Meta-pipeline UI: add Stop/Restart/Results controls per pipeline
Each pipeline card now shows: - Status dot + name + status tag + best score - Stop button (red) when running - Restart button (green) when stopped/completed - Results button (magenta) to drill into iterations - Live progress text when running - Stages and iteration count on info line Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
28df789745
commit
c9901dbc94
@ -4007,43 +4007,66 @@ async function loadMetaPipelines() {
|
|||||||
title.textContent = 'Pipeline Runs';
|
title.textContent = 'Pipeline Runs';
|
||||||
el.appendChild(title);
|
el.appendChild(title);
|
||||||
pipes.forEach(function(p) {
|
pipes.forEach(function(p) {
|
||||||
var row = document.createElement('div');
|
var card = document.createElement('div');
|
||||||
row.style.cssText = 'display:flex;align-items:center;gap:8px;padding:8px;background:rgba(0,0,0,0.2);border:2px solid var(--border);border-radius:2px;margin-bottom:4px;cursor:pointer;transition:border-color 0.15s;font-size:11px';
|
card.style.cssText = 'background:rgba(0,0,0,0.2);border:2px solid var(--border);border-radius:2px;margin-bottom:6px;padding:10px 12px';
|
||||||
if (p.status === 'running') row.style.borderColor = 'rgba(217,70,239,0.3)';
|
if (p.status === 'running') card.style.borderColor = 'rgba(217,70,239,0.3)';
|
||||||
if (p.status === 'completed') row.style.borderColor = 'rgba(74,222,128,0.2)';
|
if (p.status === 'completed') card.style.borderColor = 'rgba(74,222,128,0.2)';
|
||||||
row.onmouseenter = function(){row.style.borderColor='var(--accent)'};
|
|
||||||
row.onmouseleave = function(){row.style.borderColor = p.status==='running'?'rgba(217,70,239,0.3)':p.status==='completed'?'rgba(74,222,128,0.2)':'var(--border)'};
|
// Top row: status + name + score + controls
|
||||||
// Status dot
|
var topRow = document.createElement('div');
|
||||||
|
topRow.style.cssText = 'display:flex;align-items:center;gap:8px;font-size:11px';
|
||||||
var dot = document.createElement('div');
|
var dot = document.createElement('div');
|
||||||
var dotColor = p.status==='running'?'#d946ef':p.status==='completed'?'var(--green)':'var(--text2)';
|
var dotColor = p.status==='running'?'#d946ef':p.status==='completed'?'var(--green)':'var(--text2)';
|
||||||
dot.style.cssText = 'width:8px;height:8px;border-radius:50%;background:'+dotColor+';flex-shrink:0';
|
dot.style.cssText = 'width:8px;height:8px;border-radius:50%;background:'+dotColor+';flex-shrink:0';
|
||||||
if (p.status === 'running') dot.style.animation = 'pulse 2s infinite';
|
if (p.status === 'running') dot.style.animation = 'pulse 2s infinite';
|
||||||
row.appendChild(dot);
|
topRow.appendChild(dot);
|
||||||
var name = document.createElement('span');
|
var name = document.createElement('span');
|
||||||
name.style.cssText = 'font-weight:700;min-width:140px';
|
name.style.cssText = 'font-weight:700';
|
||||||
name.textContent = p.name; row.appendChild(name);
|
name.textContent = p.name; topRow.appendChild(name);
|
||||||
var stagesEl = document.createElement('span');
|
var statusTag = document.createElement('span');
|
||||||
stagesEl.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:9px;color:var(--text2);flex:1';
|
statusTag.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:8px;text-transform:uppercase;letter-spacing:1px;padding:2px 6px;border:1px solid;border-radius:1px;color:'+dotColor+';border-color:'+dotColor;
|
||||||
stagesEl.textContent = (p.stages||[]).join('→');
|
statusTag.textContent = p.status; topRow.appendChild(statusTag);
|
||||||
row.appendChild(stagesEl);
|
|
||||||
if (p.live_status && p.status === 'running') {
|
|
||||||
var prog = document.createElement('span');
|
|
||||||
prog.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:9px;color:#d946ef';
|
|
||||||
prog.textContent = p.live_status.substep || '';
|
|
||||||
row.appendChild(prog);
|
|
||||||
}
|
|
||||||
if (p.best_score > 0) {
|
if (p.best_score > 0) {
|
||||||
var score = document.createElement('span');
|
var score = document.createElement('span');
|
||||||
score.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:10px;font-weight:700;color:var(--green)';
|
score.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700;color:var(--green)';
|
||||||
score.textContent = p.best_score.toFixed(1)+'/10';
|
score.textContent = p.best_score.toFixed(1)+'/10';
|
||||||
row.appendChild(score);
|
topRow.appendChild(score);
|
||||||
}
|
}
|
||||||
var iters = document.createElement('span');
|
var spacer = document.createElement('span'); spacer.style.flex = '1'; topRow.appendChild(spacer);
|
||||||
iters.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:9px;color:var(--text2)';
|
// Controls
|
||||||
iters.textContent = (p.iterations||0)+' iters';
|
if (p.status === 'running') {
|
||||||
row.appendChild(iters);
|
var stopBtn = document.createElement('button');
|
||||||
row.onclick = function(){viewMetaPipeline(p.id)};
|
stopBtn.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:8px;text-transform:uppercase;padding:3px 8px;border:2px solid rgba(224,82,82,0.3);border-radius:2px;background:transparent;color:var(--red);cursor:pointer';
|
||||||
el.appendChild(row);
|
stopBtn.textContent = 'Stop';
|
||||||
|
stopBtn.onclick = function(e){e.stopPropagation();fetch('/api/meta-pipeline/'+p.id+'/stop',{method:'POST'}).then(function(){loadMetaPipelines()})};
|
||||||
|
topRow.appendChild(stopBtn);
|
||||||
|
} else if (p.status !== 'running') {
|
||||||
|
var startBtn = document.createElement('button');
|
||||||
|
startBtn.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:8px;text-transform:uppercase;padding:3px 8px;border:2px solid rgba(74,222,128,0.3);border-radius:2px;background:transparent;color:var(--green);cursor:pointer';
|
||||||
|
startBtn.textContent = 'Restart';
|
||||||
|
startBtn.onclick = function(e){e.stopPropagation();fetch('/api/meta-pipeline/'+p.id+'/start',{method:'POST'}).then(function(){loadMetaPipelines()})};
|
||||||
|
topRow.appendChild(startBtn);
|
||||||
|
}
|
||||||
|
var viewBtn = document.createElement('button');
|
||||||
|
viewBtn.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:8px;text-transform:uppercase;padding:3px 8px;border:2px solid rgba(217,70,239,0.3);border-radius:2px;background:transparent;color:#d946ef;cursor:pointer';
|
||||||
|
viewBtn.textContent = 'Results';
|
||||||
|
viewBtn.onclick = function(e){e.stopPropagation();viewMetaPipeline(p.id)};
|
||||||
|
topRow.appendChild(viewBtn);
|
||||||
|
card.appendChild(topRow);
|
||||||
|
|
||||||
|
// Info row: stages + iterations + live status
|
||||||
|
var infoRow = document.createElement('div');
|
||||||
|
infoRow.style.cssText = 'font-family:JetBrains Mono,monospace;font-size:9px;color:var(--text2);margin-top:4px;display:flex;gap:12px';
|
||||||
|
infoRow.textContent = (p.stages||[]).join(' → ') + ' | ' + (p.iterations||0) + ' iterations';
|
||||||
|
if (p.live_status && p.status === 'running') {
|
||||||
|
var prog = document.createElement('span');
|
||||||
|
prog.style.cssText = 'color:#d946ef;margin-left:auto';
|
||||||
|
prog.textContent = p.live_status.substep || '';
|
||||||
|
infoRow.appendChild(prog);
|
||||||
|
}
|
||||||
|
card.appendChild(infoRow);
|
||||||
|
|
||||||
|
el.appendChild(card);
|
||||||
});
|
});
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user