| | 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;
|
| |
|