diff --git a/apps/decodex/src/orchestrator/operator_dashboard.html b/apps/decodex/src/orchestrator/operator_dashboard.html
index dc059417..7c1dd799 100644
--- a/apps/decodex/src/orchestrator/operator_dashboard.html
+++ b/apps/decodex/src/orchestrator/operator_dashboard.html
@@ -1462,51 +1462,6 @@
color: var(--success);
}
- .control-button.icon-button {
- width: 26px;
- min-width: 26px;
- height: 26px;
- padding: 0;
- border-radius: 999px;
- }
-
- .status-line .run-stop-button {
- width: 18px;
- min-width: 18px;
- height: 18px;
- min-height: 18px;
- margin-left: -7px;
- padding: 0;
- border: 0;
- border-radius: 2px;
- background: transparent;
- color: color-mix(in srgb, var(--danger) 86%, var(--text));
- opacity: 0.92;
- }
-
- .status-line .run-stop-button:hover {
- border: 0;
- background: transparent;
- color: color-mix(in srgb, var(--danger) 88%, var(--text));
- opacity: 1;
- }
-
- .status-line .run-stop-button:focus-visible {
- outline: 1px solid color-mix(in srgb, var(--danger) 58%, transparent);
- outline-offset: 2px;
- }
-
- .control-button.icon-button svg {
- display: block;
- width: 13px;
- height: 13px;
- }
-
- .status-line .run-stop-button svg {
- width: 14px;
- height: 14px;
- }
-
.control-button[disabled] {
cursor: not-allowed;
opacity: 0.5;
@@ -9579,31 +9534,6 @@
${escapeHtml(item.title)}
);
}
- function runInterruptControlEnabled(run) {
- return Boolean(
- run.project_id &&
- run.issue_id &&
- run.run_id &&
- run.process_id &&
- run.process_alive === true,
- );
- }
-
- function renderRunStopControl(run) {
- const interruptEnabled = runInterruptControlEnabled(run);
- if (!interruptEnabled) {
- return "";
- }
-
- return `
-
- `;
- }
-
function renderActiveRuns(snapshot, derived) {
const runs = snapshot?.active_runs ?? [];
setPanelMeta(
@@ -9660,12 +9590,6 @@ ${escapeHtml(item.title)}
}
}
const attemptNumber = attemptNumberFromRun(run);
- const stopControl = renderRunStopControl(run);
- const statusLineParts = [...statusBits];
- if (stopControl) {
- statusLineParts.splice(1, 0, stopControl);
- }
-
return `
@@ -9681,7 +9605,7 @@
${escapeHtml(issueTitle)}
${runNeedsAttention(run) ? `${escapeHtml(runHealthText(run))}` : ""}
- ${statusLineParts.join("")}
+ ${statusBits.join("")}
${summary ? `${escapeHtml(summary)}
` : ""}
${renderRunMetaLine(run, snapshot)}
${renderChildAgentBreakdown(run)}
@@ -10470,9 +10394,6 @@ ${escapeHtml(worktree.branch_name)}
}
function dashboardControlActionLabel(action) {
- if (action === "interruptRun" || action === "interrupt") {
- return "Stop";
- }
return displayToken(action);
}
@@ -10604,21 +10525,6 @@ ${escapeHtml(worktree.branch_name)}
renderWorktrees(snapshot);
}
- function handleDashboardControlClick(button) {
- const control = button.dataset.dashboardControl;
- const projectId = button.dataset.projectId || null;
- const issueId = button.dataset.issueId || null;
- const runId = button.dataset.runId || null;
-
- switch (control) {
- case "interruptRun":
- sendDashboardControl(control, { projectId, issueId, runId });
- break;
- default:
- break;
- }
- }
-
function startDashboardStream() {
applyTheme(themeSelection, false);
renderAccountPrivacyToggle();
@@ -10850,13 +10756,6 @@ ${escapeHtml(worktree.branch_name)}
return;
}
- const controlButton = event.target.closest("[data-dashboard-control]");
- if (controlButton) {
- event.preventDefault();
- handleDashboardControlClick(controlButton);
- return;
- }
-
const summary = event.target.closest("summary");
if (!summary) {
return;
diff --git a/apps/decodex/src/orchestrator/operator_http.rs b/apps/decodex/src/orchestrator/operator_http.rs
index e833dba2..267eb2e5 100644
--- a/apps/decodex/src/orchestrator/operator_http.rs
+++ b/apps/decodex/src/orchestrator/operator_http.rs
@@ -1,14 +1,10 @@
use base64::engine::general_purpose::STANDARD;
use base64::Engine as _;
use sha1::{Digest as _, Sha1};
-use libc::SIGTERM;
use crate::accounts;
use crate::accounts::AccountUseRequest;
-#[cfg(test)]
-type DashboardRunInterrupterForTest = fn(u32) -> Result<()>;
-
const OPERATOR_DASHBOARD_HTML: &str =
include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/orchestrator/operator_dashboard.html"));
const OPERATOR_DASHBOARD_ICON_PNG: &[u8] =
@@ -21,10 +17,6 @@ const OPERATOR_DASHBOARD_LOGO_TOUCH_PNG: &[u8] = include_bytes!(concat!(
));
const OPERATOR_HTTP_READ_TIMEOUT: Duration = Duration::from_millis(250);
-#[cfg(test)]
-static DASHBOARD_RUN_INTERRUPTER_FOR_TEST: Mutex