/
OS-World3b1540e
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Task Detail: {{ task_id }}</title>
<link rel="icon" href="/static/favicon.png" type="image/x-icon">
<link rel="shortcut icon" href="/static/favicon.png" type="image/x-icon">
<link rel="apple-touch-icon" href="/static/favicon.png">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
<link rel="stylesheet" href="/static/task_detail.css">
</head>
<body>
<div class="container">
<a href="/" class="back-link"><i class="fas fa-arrow-left"></i> Back to Home</a>
<h1>Task Detail <span class="task-id">{{ task_id }}</span></h1>
<div class="task-info">
<h2><i class="fas fa-info-circle"></i> Basic Information</h2>
<dl>
<dt>Task ID</dt>
<dd>{{ task_id }}</dd>
<dt>Task Type</dt>
<dd>{{ task_type }}</dd>
<dt>Instruction</dt>
<dd>{{ task_info.instruction }}</dd>
<dt>Status</dt>
<dd class="status status-{{ task_status.status|lower|replace(' ', '-')|replace('(', '')|replace(')', '') }}">
{{ task_status.status }}
{% if task_status.status == 'Error' %}
<span class="tooltip">
<i class="fas fa-question-circle"></i>
<span class="tooltip-text">Error occurred during task execution</span>
</span>
{% elif task_status.status == 'Done (Message Exit)' %}
<span class="tooltip">
<i class="fas fa-question-circle"></i>
<span class="tooltip-text">Task completed with a message exit condition</span>
</span>
{% elif task_status.status == 'Done (Max Steps)' %}
<span class="tooltip">
<i class="fas fa-question-circle"></i>
<span class="tooltip-text">Maximum steps reached, task completed</span>
</span>
{% elif task_status.status == 'Done (Thought Exit)' %}
<span class="tooltip">
<i class="fas fa-question-circle"></i>
<span class="tooltip-text">Task completed with a thought exit condition</span>
</span>
{% endif %}
</dd>
<dt>Current Step</dt>
<dd>{{ task_status.progress }}</dd>
<dt>Last Update</dt>
<dd>{{ task_status.last_update or 'None' }}</dd>
{% if task_status.log_data and task_status.log_data.exit_condition %}
<dt>Exit Condition</dt>
<dd class="exit-condition">
{{ task_status.log_data.exit_condition }}
</dd>
{% endif %}
{% if task_status.status == 'Done (Message Exit)' and task_status.log_data and task_status.log_data.last_message %}
<dt>Exit Message</dt>
<dd class="exit-message">
{{ task_status.log_data.last_message }}
</dd>
{% endif %}
<dt>Result</dt>
<dd>{{ task_status.result }}</dd>
{% if task_status.status.startswith('Done') %}
<dt>Recording</dt>
<dd id="recording-container">
<div class="video-player">
<video id="task-recording" controls playsinline webkit-playsinline
preload="metadata" width="100%" controlslist="nodownload">
<source src="/task/{{ task_type }}/{{ task_id }}/recording" type="video/mp4">
Your browser does not support the video tag.
</video>
<div id="video-status" class="video-status">Loading video...</div>
</div>
</dd>
{% endif %}
</dl>
</div>
<div class="task-steps">
<h2><i class="fas fa-list-ol"></i> Execution Steps</h2>
<div id="steps-container">
{% if task_status.steps %}
{% for step in task_status.steps %}
<div class="step-card">
<div class="step-header">
<div class="step-title"><i class="fas fa-check-circle"></i> Step {{ step.step_num }}</div>
<div class="step-time"><i class="far fa-clock"></i> {{ step.action_timestamp }}</div>
</div>
{% if task_status.log_data and task_status.log_data.agent_responses and loop.index0 < task_status.log_data.agent_responses|length %}
<div class="step-intent">
<i class="fas fa-comment"></i> <strong>Agent Intent:</strong> {{ task_status.log_data.agent_responses[loop.index0] }}
</div>
{% endif %}
<pre>{% if step.action and step.action.action %}{{ step.action.action }}
{% elif step.Error %}Error: {{ step.Error }}
{% else %}{{ step|tojson }}
{% endif %}</pre>
{% if step.screenshot_file %}
<div>
<img src="/task/{{ task_type }}/{{ task_id }}/screenshot/{{ step.screenshot_file }}"
alt="Step {{ step.step_num }} Screenshot" class="step-image">
</div>
{% endif %}
</div>
{% endfor %}
{% else %}
<div class="no-steps"><i class="far fa-frown"></i> No step data available</div>
{% endif %}
</div>
</div>
</div>
<button class="fab fab-refresh" onclick="refreshPage()" title="Refresh"><i class="fas fa-sync-alt"></i></button>
<script>
function refreshPage() {
window.location.reload();
}
// Handle video player with enhanced mobile support
document.addEventListener('DOMContentLoaded', function() {
const videoElement = document.getElementById('task-recording');
const videoStatus = document.getElementById('video-status');
if (videoElement) {
// Function to update status on successful video load
function updateSuccessStatus() {
videoStatus.textContent = 'Recording available';
videoStatus.className = 'video-status video-success';
}
// Multiple event listeners for different browser implementations
// The 'loadeddata' event might not fire on all mobile browsers
videoElement.addEventListener('loadeddata', updateSuccessStatus);
videoElement.addEventListener('loadedmetadata', updateSuccessStatus);
videoElement.addEventListener('canplay', updateSuccessStatus);
// Error handling for video
videoElement.addEventListener('error', function(e) {
console.error('Video error:', e);
videoStatus.textContent = 'Recording not available';
videoStatus.className = 'video-status video-error';
});
// Timeout for slow connections or browser issues
setTimeout(function() {
// If video is playable but events didn't fire correctly
if (videoElement.readyState >= 2 && videoStatus.textContent === 'Loading video...') {
updateSuccessStatus();
}
}, 2000);
// Directly check video source availability with fetch API
fetch('/task/{{ task_type }}/{{ task_id }}/recording', {method: 'HEAD'})
.then(function(response) {
if (response.ok && videoStatus.textContent === 'Loading video...') {
// If HEAD request succeeds but video events haven't fired
setTimeout(updateSuccessStatus, 500);
}
})
.catch(function() {
// Network error or CORS issue
if (videoStatus.textContent === 'Loading video...') {
videoStatus.textContent = 'Recording check failed';
videoStatus.className = 'video-status video-error';
}
});
}
});
</script>
</body>
</html>