feat(FN-2885): upgrade routing controls and task timing UI

- Redesign the task Routing tab with effective-node summary rows, unhealthy node signaling, and direct per-task override selection
- Add robust override update handling (loading/saving states, stale-task guards, clear override action, and in-progress lock messaging)
- Extend TaskCard execution time indicator behavior to in-review cards and add focused regression coverage
- Refresh dashboard tests and styling for routing and node-status presentation, and remove an unused remote settings API import
This commit is contained in:
Fusion
2026-04-28 11:31:18 -07:00
committed by gsxdsm
parent 701feb8ea5
commit 58e227e97c
8 changed files with 505 additions and 213 deletions

View File

@@ -2085,50 +2085,51 @@ function AgentsView({ state }: { state: DashboardState }) {
<Text bold color="whiteBright">{detail.name}</Text>
<Text dimColor>{detail.id}</Text>
<Box height={1} />
<Box flexDirection="row" gap={1}>
<Text dimColor>State:</Text>
<Text color={agentStateColor(detail.state) as "cyanBright" | "green" | "red" | "gray"} bold>
{detail.state}
</Text>
</Box>
<Box flexDirection="row" gap={1}>
<Text dimColor>Role:</Text>
<Text>{detail.role}</Text>
</Box>
{detail.title && (
<Box flexDirection="row" gap={1}>
<Text dimColor>Title:</Text>
<Text>{detail.title}</Text>
</Box>
)}
{detail.taskId && (
<Box flexDirection="row" gap={1}>
<Text dimColor>Task:</Text>
<Text color="cyanBright">{detail.taskId}</Text>
</Box>
)}
{detail.capabilities.length > 0 && (
<Box flexDirection="row" gap={1}>
<Text dimColor>Caps:</Text>
<Text>{detail.capabilities.join(", ")}</Text>
</Box>
)}
{recentRuns.length > 0 && (
{showRunLogs && selectedRun ? (
<>
<Text dimColor>Run logs ({selectedRunIndex + 1})</Text>
<Text dimColor>ID: {selectedRun.id}</Text>
<Box height={1} />
{showRunLogs && selectedRun ? (
{getRunLogLines(selectedRun).slice(0, 10).map((line, i) => (
<Text key={`${selectedRun.id}-log-${i}`} wrap="truncate-end">{line}</Text>
))}
<Box height={1} />
<Text dimColor>[Esc/q] back to runs</Text>
</>
) : (
<>
<Box flexDirection="row" gap={1}>
<Text dimColor>State:</Text>
<Text color={agentStateColor(detail.state) as "cyanBright" | "green" | "red" | "gray"} bold>
{detail.state}
</Text>
</Box>
<Box flexDirection="row" gap={1}>
<Text dimColor>Role:</Text>
<Text>{detail.role}</Text>
</Box>
{detail.title && (
<Box flexDirection="row" gap={1}>
<Text dimColor>Title:</Text>
<Text>{detail.title}</Text>
</Box>
)}
{detail.taskId && (
<Box flexDirection="row" gap={1}>
<Text dimColor>Task:</Text>
<Text color="cyanBright">{detail.taskId}</Text>
</Box>
)}
{detail.capabilities.length > 0 && (
<Box flexDirection="row" gap={1}>
<Text dimColor>Caps:</Text>
<Text>{detail.capabilities.join(", ")}</Text>
</Box>
)}
{recentRuns.length > 0 && (
<>
<Text dimColor>Run logs ({selectedRunIndex + 1})</Text>
<Text dimColor>ID: {selectedRun.id}</Text>
<Box height={1} />
{getRunLogLines(selectedRun).slice(0, 10).map((line, i) => (
<Text key={`${selectedRun.id}-log-${i}`} wrap="truncate-end">{line}</Text>
))}
<Box height={1} />
<Text dimColor>[Esc/q] back to runs</Text>
</>
) : (
<>
<Text dimColor>Run history (latest first):</Text>
{recentRuns.slice(0, 5).map((run, i) => (
<Box key={run.id} flexDirection="row" gap={1} marginLeft={1}>