Agenttien promptit näkyvissä ja editoitavissa + Aja uudelleen -nappi

Klikkaa agenttia → näet viimeisimmän pipeline-promptin tekstikentässä.
Voit editoida promptia ja painaa 'Aja uudelleen' ajamaan sen samalla
mallilla. Pipeline tallentaa nyt koko promptin (ei vain kuvausta).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-07 08:03:48 +03:00
parent 75310c989e
commit 3feed22055

View File

@@ -1076,6 +1076,13 @@
<div id="shared-prompt-section" style="display:none;margin-top:8px;font-size:12px;color:#8b949e">
Yhteinen konteksti liitetään jokaisen valitun agentin oman promptin alkuun.
</div>
<div id="agent-last-prompt" style="display:none;margin-top:12px;border-top:1px solid var(--border-color);padding-top:10px">
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px">
<span style="font-size:12px;color:#8b949e">Viimeisin pipeline-prompti:</span>
<button id="agent-rerun-btn" style="background:#161b22;border:1px solid var(--accent-color);color:var(--accent-color);font-size:11px;padding:2px 10px;border-radius:4px;cursor:pointer">▶ Aja uudelleen</button>
</div>
<textarea id="agent-last-prompt-text" style="width:100%;background:#010409;border:1px solid var(--border-color);border-radius:4px;color:#c9d1d9;font-size:12px;font-family:'Courier New',monospace;padding:8px;resize:vertical;min-height:80px;outline:none"></textarea>
</div>
</div>
</div>
@@ -1246,6 +1253,24 @@
textEl.value = sharedPrompt;
sharedEl.style.display = 'block';
}
// Näytetään viimeisin pipeline-prompti valitulle agentille
const lastPromptDiv = document.getElementById('agent-last-prompt');
const lastPromptText = document.getElementById('agent-last-prompt-text');
if (selectedAgents.size === 1) {
const agent = [...selectedAgents][0];
const lastStep = [...pipelineSteps].reverse().find(s => s.agent === agent && s.status === 'done' && s.input);
if (lastStep) {
lastPromptDiv.style.display = 'block';
lastPromptText.value = lastStep.input;
lastPromptText.dataset.agent = agent;
lastPromptText.dataset.label = lastStep.label;
} else {
lastPromptDiv.style.display = 'none';
}
} else {
lastPromptDiv.style.display = 'none';
}
}
window.selectAgent = function(agent) {
@@ -1301,7 +1326,18 @@
clearTimeout(saved._t);
saved._t = setTimeout(() => saved.style.opacity = '0', 1500);
});
// "Aja uudelleen" -nappi: ajaa editoidun promptin samalla agentilla
document.getElementById('agent-rerun-btn')?.addEventListener('click', () => {
const textEl = document.getElementById('agent-last-prompt-text');
const prompt = textEl?.value?.trim();
if (!prompt) return;
const agent = textEl.dataset.agent;
const model = agentPrompts[agent]?.model || 'qwen-coder';
termLog(`<span class="terminal-prompt">$</span> <span style="color:#a371f7">↻ Aja uudelleen:</span> ${esc(agent)}${esc(prompt.substring(0, 60))}...`);
kpnRun(model, prompt);
});
function checkAgentConfusion() {
Object.keys(agentPrompts).forEach(agent => {
const prompt = agentPrompts[agent].prompt || "";
@@ -2107,8 +2143,6 @@
termLog(`<span style="color:#a371f7;font-weight:bold">━━━ Pipeline käynnistyy ━━━</span>`);
// Vaihe 1: Manageri pilkkoo projektin tiedostoiksi
termLog(`\n<span style="color:#d29922;font-weight:bold">[1] Manageri</span> — projektin suunnittelu`);
pipelineStep('manager', 'Suunnittelu', 'active', task);
const managerPrompt = `List the source files needed for this project. One file per line, format:
filename.py: one-line description
@@ -2121,9 +2155,11 @@ CONSTRAINTS — the coder can only generate ~400 tokens per file:
- Prefer fewer, focused files over many small ones
Project: ${task}`;
termLog(`\n<span style="color:#d29922;font-weight:bold">[1] Manageri</span> — projektin suunnittelu`);
pipelineStep('manager', 'Suunnittelu', 'active', managerPrompt);
const plan = await kpnRun(agentPrompts.manager.model, managerPrompt, false, 200);
if (!plan) { termLog(' ✗ Pipeline keskeytyi (manageri)', '#f85149'); return; }
pipelineStep('manager', 'Suunnittelu', 'done', task, plan);
pipelineStep('manager', 'Suunnittelu', 'done', managerPrompt, plan);
// Parsitaan tiedostolista: "filename.py: description" TAI pelkkä "filename.py"
const fileList = plan.split('\n')
@@ -2160,7 +2196,7 @@ Project: ${task}`;
for (let i = 0; i < fileList.length; i++) {
const file = fileList[i];
termLog(`\n<span style="color:#3fb950;font-weight:bold">[${i + 2}] Koodari</span> — ${esc(file.name)}`);
pipelineStep('coder', file.name, 'active', file.desc);
pipelineStep('coder', file.name, 'active', '');
// Rakennetaan konteksti: aiemmin generoidut tiedostot
let context = '';
@@ -2196,7 +2232,7 @@ IMPORTANT: Keep the code SHORT and focused. Max ~50 lines. No comments, no docst
return;
}
generatedFiles[file.name] = code;
pipelineStep('coder', file.name, 'done', file.desc, code);
pipelineStep('coder', file.name, 'done', coderPrompt, code);
}
// Vaihe 3: Testaaja arvioi koko projektin