Wave 7: Integrate JobDevTools into job detail page (FINAL)

- Task #18: Complete integration of all JobDevTools components
  - Updated job detail page (/jobs/[id]) with full JobDevTools UI
  - Connected SSE stream for real-time structured logs + metrics
  - Added crash-report and retry API routes for Next.js
  - Added format conversion for old/new log formats
  - Added DevTools links to JobsView modal and actions column
  - Wired up CrashReport retry with auto-fix parameters
  - Integrated SessionPanel for fingerprint display
  - Integrated MetricsDashboard for real-time charts

Job DevTools implementation complete: 18/18 tasks

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Alejandro Gutiérrez
2026-01-24 13:11:19 +00:00
parent f99827717f
commit cd9639f3b1
4 changed files with 699 additions and 85 deletions

View File

@@ -1,6 +1,7 @@
'use client';
import React, { useState, useMemo, useEffect, useCallback } from 'react';
import Link from 'next/link';
import {
useReactTable,
getCoreRowModel,
@@ -822,6 +823,18 @@ export default function JobsView({ jobs, onSelectJob, isLoadingJob, onRefresh }:
);
})()}
{/* View DevTools */}
<Link
href={`/jobs/${job.job_id}`}
className="p-1.5 bg-purple-100 text-purple-700 rounded-lg hover:bg-purple-200 transition-colors"
title="View DevTools"
onClick={(e) => e.stopPropagation()}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" />
</svg>
</Link>
{/* View Logs */}
{(() => {
const isStuck = job.status === 'running' &&
@@ -1491,6 +1504,16 @@ export default function JobsView({ jobs, onSelectJob, isLoadingJob, onRefresh }:
View Reviews
</button>
)}
<Link
href={`/jobs/${monitoredJob.job_id}`}
onClick={() => stopMonitoring()}
className="py-2.5 px-6 bg-purple-600 text-white rounded-lg font-semibold hover:bg-purple-700 transition-colors flex items-center gap-2"
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" />
</svg>
DevTools
</Link>
<button
onClick={() => stopMonitoring()}
className={`${monitoredJob.status === 'completed' && monitoredJob.reviews_count ? '' : 'flex-1'} py-2.5 px-6 bg-gray-900 text-white rounded-lg font-semibold hover:bg-gray-800 transition-colors`}