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