| import { Header, SandboxViewer, StepsList, Timeline } from '@/components';
|
| import { selectIsAgentProcessing, selectMetadata, selectSelectedStep, selectTrace, selectVncUrl, useAgentStore } from '@/stores/agentStore';
|
| import { Box } from '@mui/material';
|
| import { useEffect } from 'react';
|
| import { useNavigate } from 'react-router-dom';
|
|
|
| const Task = () => {
|
| const navigate = useNavigate();
|
|
|
|
|
| const trace = useAgentStore(selectTrace);
|
| const isAgentProcessing = useAgentStore(selectIsAgentProcessing);
|
| const vncUrl = useAgentStore(selectVncUrl);
|
| const metadata = useAgentStore(selectMetadata);
|
| const selectedStep = useAgentStore(selectSelectedStep);
|
| const error = useAgentStore((state) => state.error);
|
|
|
|
|
| useEffect(() => {
|
| if (!trace) {
|
| console.log('No trace found, redirecting to home...');
|
| navigate('/', { replace: true });
|
| }
|
| }, [trace, navigate]);
|
|
|
|
|
| const handleBackToHome = () => {
|
| const currentTrace = useAgentStore.getState().trace;
|
|
|
|
|
| const stopTask = (window as Window & { __stopCurrentTask?: () => void }).__stopCurrentTask;
|
| if (stopTask) {
|
| stopTask();
|
| }
|
|
|
|
|
| useAgentStore.getState().resetAgent();
|
|
|
|
|
| window.location.href = '/';
|
| };
|
|
|
|
|
| const showStatus = !trace?.isRunning && !selectedStep && metadata && metadata.numberOfSteps > 0;
|
|
|
|
|
| if (!trace) {
|
| return null;
|
| }
|
|
|
| return (
|
| <Box
|
| sx={{
|
| height: '100vh',
|
| width: '100%',
|
| display: 'flex',
|
| flexDirection: 'column',
|
| backgroundColor: 'background.default',
|
| }}
|
| >
|
| {/* Header */}
|
| <Header
|
| isAgentProcessing={isAgentProcessing}
|
| onBackToHome={handleBackToHome}
|
| />
|
|
|
| {/* Main Content */}
|
| <Box
|
| sx={{
|
| flex: 1,
|
| display: 'flex',
|
| justifyContent: 'center',
|
| alignItems: 'stretch',
|
| minHeight: 0,
|
| p: 0,
|
| overflowY: 'auto',
|
| overflowX: 'hidden',
|
| }}
|
| >
|
| <Box
|
| sx={{
|
| width: '100%',
|
| display: 'flex',
|
| flexDirection: { xs: 'column', md: 'row' },
|
| p: { xs: 2, md: 4 },
|
| pb: { xs: 2, md: 3 },
|
| }}
|
| >
|
| {/* Left Side: OS Stream + Metadata */}
|
| <Box
|
| sx={{
|
| flex: 1,
|
| display: 'flex',
|
| flexDirection: 'column',
|
| minWidth: 0,
|
| pr: { xs: 0, md: 1.5 },
|
| gap: { xs: 2, md: 3 },
|
| overflow: 'visible',
|
| }}
|
| >
|
| {/* Sandbox Viewer */}
|
| <SandboxViewer
|
| vncUrl={vncUrl}
|
| isAgentProcessing={isAgentProcessing}
|
| metadata={metadata}
|
| traceStartTime={trace?.timestamp}
|
| selectedStep={selectedStep}
|
| isRunning={trace?.isRunning || false}
|
| />
|
|
|
| {/* Timeline - Always show, even with default values */}
|
| <Timeline
|
| metadata={metadata && metadata.maxSteps > 0 ? metadata : {
|
| traceId: trace?.id || '',
|
| inputTokensUsed: metadata?.inputTokensUsed || 0,
|
| outputTokensUsed: metadata?.outputTokensUsed || 0,
|
| duration: metadata?.duration || 0,
|
| numberOfSteps: metadata?.numberOfSteps || 0,
|
| maxSteps: 200, // Default max steps (will be updated by backend)
|
| completed: metadata?.completed || false,
|
| }}
|
| isRunning={trace?.isRunning || false}
|
| />
|
| </Box>
|
|
|
| {/* Right Side: Steps List */}
|
| <StepsList trace={trace} />
|
| </Box>
|
| </Box>
|
| </Box>
|
| );
|
| };
|
|
|
| export default Task;
|
|
|