"use client"; import { use, useState, useEffect } from "react"; import { ArrowLeft, Play, RefreshCw, Loader2 } from "lucide-react"; import Link from "next/link"; import { timeAgo } from "@/lib/utils"; interface CronJob { id: string; name?: string; prompt: string; schedule: string; status: string; deliver: string; skill?: string; skills?: string[]; model?: string; repeat?: number; run_count?: number; last_run?: string; next_run?: string; created_at?: string; } interface CronOutput { timestamp: string; content: string; } export default function CronDetailPage({ params }: { params: Promise<{ id: string }> }) { const { id } = use(params); const [job, setJob] = useState(null); const [outputs, setOutputs] = useState([]); const [loading, setLoading] = useState(true); const [triggering, setTriggering] = useState(false); const load = () => { setLoading(true); Promise.all([ fetch("/cron/jobs/" + id).then((r) => r.json()).catch(() => null), fetch("/cron/jobs/" + id + "/output").then((r) => r.json()).catch(() => ({ outputs: [] })), ]).then(([jobData, outputData]) => { setJob(jobData?.job || jobData || null); setOutputs(outputData?.outputs || []); }).finally(() => setLoading(false)); }; useEffect(() => { load(); }, [id]); const trigger = async () => { setTriggering(true); await fetch("/cron/jobs/" + id + "/run", { method: "POST" }); setTriggering(false); setTimeout(load, 2000); }; return (
{job?.name || job?.prompt?.slice(0, 40) || id}
{job && (
{job.schedule} → {job.deliver}
)}
{loading ? (
{[...Array(2)].map((_, i) => (
))}
) : ( <> {/* Job details */} {job && (
Details
{job.model && } {job.skills && job.skills.length > 0 && } {job.run_count != null && } {job.last_run && } {job.next_run && }
)} {/* Prompt */} {job?.prompt && (
Prompt

{job.prompt}

)} {/* Outputs */}
Output History ({outputs.length})
{outputs.length === 0 ? (

No outputs yet

) : (
{outputs.map((o, i) => (
{new Date(o.timestamp).toLocaleString()}
                      {o.content}
                    
))}
)}
)}
); } function Row({ label, value }: { label: string; value: string }) { return (
{label} {value}
); }