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"}