diff --git a/server/src/services/heartbeat.ts b/server/src/services/heartbeat.ts
index f9c205d6..6a5fa247 100644
--- a/server/src/services/heartbeat.ts
+++ b/server/src/services/heartbeat.ts
@@ -2517,6 +2517,10 @@ export function heartbeatService(db: Db) {
await db.update(heartbeatRuns)
.set({ lastOutputAt: lastOutputAtLatest, updatedAt: new Date() })
.where(eq(heartbeatRuns.id, runId));
+ // Clear idle_warning if set — output resumed
+ await db.update(heartbeatRuns)
+ .set({ errorCode: null, error: null })
+ .where(and(eq(heartbeatRuns.id, runId), eq(heartbeatRuns.errorCode, IDLE_WARNING_ERROR_CODE)));
lastOutputAtTimer = setTimeout(() => {
lastOutputAtFlushPending = false;
lastOutputAtTimer = null;
diff --git a/ui/src/components/LiveRunWidget.tsx b/ui/src/components/LiveRunWidget.tsx
index 2af427c7..f97402bc 100644
--- a/ui/src/components/LiveRunWidget.tsx
+++ b/ui/src/components/LiveRunWidget.tsx
@@ -125,18 +125,13 @@ export function LiveRunWidget({ issueId, companyId }: LiveRunWidgetProps) {
Idle
)}
- {run.lastOutputAt && isRunActive(run.status) && (
+ {isRunActive(run.status) && run.lastOutputAt ? (
Last output {relativeTime(run.lastOutputAt)}
- )}
- {run.finishedAt && !isRunActive(run.status) && (
+ ) : run.finishedAt ? (
{formatDateTime(run.finishedAt)}
- )}
- {!run.lastOutputAt && isRunActive(run.status) && (
- {formatDateTime(run.startedAt ?? run.createdAt)}
- )}
- {!run.finishedAt && !isRunActive(run.status) && !run.lastOutputAt && (
+ ) : (
{formatDateTime(run.startedAt ?? run.createdAt)}
)}
diff --git a/ui/src/lib/status-colors.ts b/ui/src/lib/status-colors.ts
index beee561a..4a2ac984 100644
--- a/ui/src/lib/status-colors.ts
+++ b/ui/src/lib/status-colors.ts
@@ -55,6 +55,7 @@ export const statusBadge: Record = {
// Run statuses
failed: "bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300",
timed_out: "bg-orange-100 text-orange-700 dark:bg-orange-900/50 dark:text-orange-300",
+ idle_timeout: "bg-orange-100 text-orange-700 dark:bg-orange-900/50 dark:text-orange-300",
succeeded: "bg-green-100 text-green-700 dark:bg-green-900/50 dark:text-green-300",
error: "bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300",
terminated: "bg-red-100 text-red-700 dark:bg-red-900/50 dark:text-red-300",