summaryrefslogtreecommitdiff
path: root/web/app.js
diff options
context:
space:
mode:
Diffstat (limited to 'web/app.js')
-rw-r--r--web/app.js19
1 files changed, 16 insertions, 3 deletions
diff --git a/web/app.js b/web/app.js
index afb6a75..ad60f34 100644
--- a/web/app.js
+++ b/web/app.js
@@ -164,6 +164,14 @@ function createTaskCard(task) {
footer.appendChild(rejectBtn);
} else if (task.state === 'BLOCKED') {
renderQuestionFooter(task, footer);
+ const cancelBtn = document.createElement('button');
+ cancelBtn.className = 'btn-cancel';
+ cancelBtn.textContent = 'Cancel';
+ cancelBtn.addEventListener('click', (e) => {
+ e.stopPropagation();
+ handleCancel(task.id, cancelBtn, footer);
+ });
+ footer.appendChild(cancelBtn);
} else if (RESUME_STATES.has(task.state)) {
const resumeBtn = document.createElement('button');
resumeBtn.className = 'btn-resume';
@@ -869,8 +877,11 @@ async function handleReject(taskId, btn, footer) {
// ── Start-next-task ─────────────────────────────────────────────────────────────
-async function startNextTask() {
- const res = await fetch(`${API_BASE}/api/scripts/start-next-task`, { method: 'POST' });
+async function startNextTask(agent) {
+ const url = agent && agent !== 'auto'
+ ? `${API_BASE}/api/scripts/start-next-task?agent=${agent}`
+ : `${API_BASE}/api/scripts/start-next-task`;
+ const res = await fetch(url, { method: 'POST' });
if (!res.ok) {
let msg = `HTTP ${res.status}`;
try { const body = await res.json(); msg = body.error || msg; } catch {}
@@ -880,10 +891,12 @@ async function startNextTask() {
}
async function handleStartNextTask(btn) {
+ const agentSelector = document.getElementById('select-agent');
+ const agent = agentSelector ? agentSelector.value : 'auto';
btn.disabled = true;
btn.textContent = 'Starting…';
try {
- const result = await startNextTask();
+ const result = await startNextTask(agent);
const output = (result.output || '').trim();
btn.textContent = output || 'No task to start';
setTimeout(() => { btn.textContent = 'Start Next'; btn.disabled = false; }, 3000);