|
|
import { useAgentStore } from '@/stores/agentStore';
|
|
|
import { FinalStep } from '@/types/agent';
|
|
|
import AccessTimeIcon from '@mui/icons-material/AccessTime';
|
|
|
import CheckIcon from '@mui/icons-material/Check';
|
|
|
import CloseIcon from '@mui/icons-material/Close';
|
|
|
import HourglassEmptyIcon from '@mui/icons-material/HourglassEmpty';
|
|
|
import StopCircleIcon from '@mui/icons-material/StopCircle';
|
|
|
import { Box, Card, CardContent, Typography } from '@mui/material';
|
|
|
import React from 'react';
|
|
|
|
|
|
interface FinalStepCardProps {
|
|
|
finalStep: FinalStep;
|
|
|
isActive?: boolean;
|
|
|
}
|
|
|
|
|
|
export const FinalStepCard: React.FC<FinalStepCardProps> = ({ finalStep, isActive = false }) => {
|
|
|
const setSelectedStepIndex = useAgentStore((state) => state.setSelectedStepIndex);
|
|
|
|
|
|
const getStatusConfig = () => {
|
|
|
switch (finalStep.type) {
|
|
|
case 'success':
|
|
|
return {
|
|
|
icon: <CheckIcon sx={{ fontSize: 20, color: 'success.main' }} />,
|
|
|
label: 'Task completed',
|
|
|
color: 'success',
|
|
|
};
|
|
|
case 'stopped':
|
|
|
return {
|
|
|
icon: <StopCircleIcon sx={{ fontSize: 20, color: 'warning.main' }} />,
|
|
|
label: 'Task stopped',
|
|
|
color: 'warning',
|
|
|
};
|
|
|
case 'max_steps_reached':
|
|
|
return {
|
|
|
icon: <HourglassEmptyIcon sx={{ fontSize: 20, color: 'warning.main' }} />,
|
|
|
label: 'Max steps reached',
|
|
|
color: 'warning',
|
|
|
};
|
|
|
case 'sandbox_timeout':
|
|
|
return {
|
|
|
icon: <AccessTimeIcon sx={{ fontSize: 20, color: 'error.main' }} />,
|
|
|
label: 'Sandbox timeout',
|
|
|
color: 'error',
|
|
|
};
|
|
|
case 'failure':
|
|
|
default:
|
|
|
return {
|
|
|
icon: <CloseIcon sx={{ fontSize: 20, color: 'error.main' }} />,
|
|
|
label: 'Task failed',
|
|
|
color: 'error',
|
|
|
};
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const statusConfig = getStatusConfig();
|
|
|
|
|
|
const handleClick = () => {
|
|
|
|
|
|
setSelectedStepIndex(null);
|
|
|
};
|
|
|
|
|
|
return (
|
|
|
<Card
|
|
|
elevation={0}
|
|
|
onClick={handleClick}
|
|
|
sx={{
|
|
|
backgroundColor: 'background.paper',
|
|
|
border: '1px solid',
|
|
|
borderColor: (theme) => `${isActive
|
|
|
? theme.palette[statusConfig.color].main
|
|
|
: theme.palette.divider} !important`,
|
|
|
borderRadius: 1.5,
|
|
|
transition: 'all 0.2s ease',
|
|
|
cursor: 'pointer',
|
|
|
boxShadow: isActive
|
|
|
? (theme) => `0 2px 8px ${theme.palette.mode === 'dark'
|
|
|
? `rgba(${statusConfig.color === 'success' ? '102, 187, 106' : statusConfig.color === 'error' ? '244, 67, 54' : '255, 152, 0'}, 0.3)`
|
|
|
: `rgba(${statusConfig.color === 'success' ? '102, 187, 106' : statusConfig.color === 'error' ? '244, 67, 54' : '255, 152, 0'}, 0.2)`}`
|
|
|
: 'none',
|
|
|
'&:hover': {
|
|
|
borderColor: (theme) => `${theme.palette[statusConfig.color].main} !important`,
|
|
|
boxShadow: (theme) => `0 2px 8px ${theme.palette.mode === 'dark'
|
|
|
? `rgba(${statusConfig.color === 'success' ? '102, 187, 106' : statusConfig.color === 'error' ? '244, 67, 54' : '255, 152, 0'}, 0.2)`
|
|
|
: `rgba(${statusConfig.color === 'success' ? '102, 187, 106' : statusConfig.color === 'error' ? '244, 67, 54' : '255, 152, 0'}, 0.1)`}`,
|
|
|
},
|
|
|
}}
|
|
|
>
|
|
|
<CardContent sx={{ p: 1.5, '&:last-child': { pb: 1.5 } }}>
|
|
|
{/* Header with icon */}
|
|
|
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.75 }}>
|
|
|
{statusConfig.icon}
|
|
|
<Typography
|
|
|
sx={{
|
|
|
fontSize: '0.85rem',
|
|
|
fontWeight: 700,
|
|
|
color: `${statusConfig.color}.main`,
|
|
|
}}
|
|
|
>
|
|
|
{statusConfig.label}
|
|
|
</Typography>
|
|
|
</Box>
|
|
|
</CardContent>
|
|
|
</Card>
|
|
|
);
|
|
|
};
|
|
|
|