From 144f35463bd50aced9f147a1160fa027ad0ba5f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 23 Mar 2026 12:13:11 -0400 Subject: [PATCH] fix(ui): remove automated document spam and clean up Runs page Remove "Create status report on schedule" default automation rule that was creating empty draft documents every 60s. Simplify Runs page by removing 3 summary cards and replacing 10-card metadata grid with compact row layout. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/main/default-automation-rules.ts | 8 --- src/renderer/components/runs/RunCenter.tsx | 83 +++++++--------------- src/renderer/components/runs/RunDetail.tsx | 44 ++++++------ 3 files changed, 48 insertions(+), 87 deletions(-) diff --git a/src/main/default-automation-rules.ts b/src/main/default-automation-rules.ts index bbb0fd08..53bb4f9b 100644 --- a/src/main/default-automation-rules.ts +++ b/src/main/default-automation-rules.ts @@ -87,14 +87,6 @@ export const DEFAULT_AUTOMATION_RULES: ReadonlyArray<{ actionConfigJson: JSON.stringify({ meetingType: "retrospective", title: "Sprint Retrospective", durationMinutes: 45 }), priority: 55, }, - { - name: "Create status report on schedule", - description: "Periodically create a status report document for the company.", - trigger: "schedule", - action: "create_document", - actionConfigJson: JSON.stringify({ documentType: "status_report", title: "Automated Status Report" }), - priority: 30, - }, { name: "Auto-assign work to idle agents", description: "When an agent has been idle for 10+ minutes, automatically assign available unassigned tasks from the backlog.", diff --git a/src/renderer/components/runs/RunCenter.tsx b/src/renderer/components/runs/RunCenter.tsx index 963235c8..e5c28362 100644 --- a/src/renderer/components/runs/RunCenter.tsx +++ b/src/renderer/components/runs/RunCenter.tsx @@ -1,9 +1,8 @@ import { useEffect, useMemo, useState } from "react"; -import { ListChecks, PlayCircle, WarningCircle } from "@phosphor-icons/react"; import type { AgentRecord, RunRecord, TaskRecord, WorkspaceRecord } from "@shared/types"; import { EmptyState } from "../ui"; import { useT } from "../../i18n"; -import { LOG_CHUNK_BYTES, initialLogState, isActiveStatus, isAttentionStatus, RunSummaryCard } from "./run-helpers"; +import { LOG_CHUNK_BYTES, initialLogState, isActiveStatus } from "./run-helpers"; import type { RunLogState } from "./run-helpers"; import { RunQueue } from "./RunQueue"; import { RunDetail } from "./RunDetail"; @@ -70,16 +69,6 @@ export function RunCenter({ }); }, [agentMap, runs, search, statusFilter, taskMap, workspaceMap]); - const groupedCounts = useMemo(() => { - let active = 0, attention = 0, completed = 0; - for (const run of runs) { - if (isActiveStatus(run.status)) active += 1; - else if (isAttentionStatus(run.status)) attention += 1; - else completed += 1; - } - return { active, attention, completed }; - }, [runs]); - useEffect(() => { if (selectedRunId && !runs.some((run) => run.id === selectedRunId)) { const fallbackRun = runs[0]; @@ -229,60 +218,36 @@ export function RunCenter({ } return ( -
-
- - - -
+
+ -
- setLogReloadKey((current) => current + 1)} + onLoadOlderLogs={() => void loadOlderLogs()} t={t} /> - - {selectedRun ? ( - setLogReloadKey((current) => current + 1)} - onLoadOlderLogs={() => void loadOlderLogs()} - t={t} - /> - ) : null} -
+ ) : null}
); } diff --git a/src/renderer/components/runs/RunDetail.tsx b/src/renderer/components/runs/RunDetail.tsx index d46e0d6b..de8c2ddc 100644 --- a/src/renderer/components/runs/RunDetail.tsx +++ b/src/renderer/components/runs/RunDetail.tsx @@ -9,7 +9,7 @@ import type { AgentRecord, RunRecord, TaskRecord, WorkspaceRecord } from "@share import { formatMoney, formatTime } from "../../lib/formatters"; import { ActionButton, Panel, StatusPill } from "../ui"; import type { TranslationFn } from "../../i18n"; -import { RunMeta, isActiveStatus } from "./run-helpers"; +import { isActiveStatus } from "./run-helpers"; import type { RunLogState } from "./run-helpers"; interface RunDetailProps { @@ -26,11 +26,19 @@ interface RunDetailProps { t: TranslationFn; } +function DetailRow({ label, children }: { label: string; children: React.ReactNode }) { + return ( +
+ {label} + {children} +
+ ); +} + export function RunDetail({ selectedRun, taskMap, agentMap, - workspaceMap, logState, onOpenConsole, onCancelRun, @@ -39,10 +47,13 @@ export function RunDetail({ onLoadOlderLogs, t, }: RunDetailProps) { + const task = taskMap.get(selectedRun.taskId); + const agent = agentMap.get(selectedRun.agentId); + return (
)} > -
- } /> - - - - - - - - - +
+ + {agent?.name ?? selectedRun.agentId} + {selectedRun.connectorId} + {selectedRun.model ? {selectedRun.model} : null} + {formatTime(selectedRun.startedAt)} + {selectedRun.finishedAt ? {formatTime(selectedRun.finishedAt)} : null} + {formatMoney(selectedRun.costUsd)}
{selectedRun.errorMessage ? ( -
+
{selectedRun.errorMessage}
) : null} {selectedRun.logPath ? ( -
+
) : null}
- - Showing bytes {logState.offset.toLocaleString()} to {logState.nextOffset.toLocaleString()} of {logState.totalBytes.toLocaleString()} - {logState.loading ? "Refreshing\u2026" : logState.eof ? "At latest tail" : "Tail window loaded"}