diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts
index 8e0340325..456bb809e 100644
--- a/web/src/lib/api.ts
+++ b/web/src/lib/api.ts
@@ -222,12 +222,14 @@ export interface CronJob {
id: string;
name?: string;
prompt: string;
- schedule: string;
- status: "enabled" | "paused" | "error";
+ schedule: { kind: string; expr: string; display: string };
+ schedule_display: string;
+ enabled: boolean;
+ state: string;
deliver?: string;
last_run_at?: string | null;
next_run_at?: string | null;
- error?: string | null;
+ last_error?: string | null;
}
export interface SkillInfo {
diff --git a/web/src/pages/CronPage.tsx b/web/src/pages/CronPage.tsx
index 20b13a84a..d4107d42f 100644
--- a/web/src/pages/CronPage.tsx
+++ b/web/src/pages/CronPage.tsx
@@ -19,10 +19,14 @@ function formatTime(iso?: string | null): string {
const STATUS_VARIANT: Record = {
enabled: "success",
+ scheduled: "success",
paused: "warning",
error: "destructive",
+ exhausted: "destructive",
};
+
+
export default function CronPage() {
const [jobs, setJobs] = useState([]);
const [loading, setLoading] = useState(true);
@@ -75,7 +79,8 @@ export default function CronPage() {
const handlePauseResume = async (job: CronJob) => {
try {
- if (job.status === "paused") {
+ const isPaused = job.state === "paused";
+ if (isPaused) {
await api.resumeCronJob(job.id);
showToast(`Resumed "${job.name || job.prompt.slice(0, 30)}"`, "success");
} else {
@@ -212,8 +217,8 @@ export default function CronPage() {
{job.name || job.prompt.slice(0, 60) + (job.prompt.length > 60 ? "..." : "")}
-
- {job.status}
+
+ {job.state}
{job.deliver && job.deliver !== "local" && (
{job.deliver}
@@ -225,12 +230,12 @@ export default function CronPage() {
)}
- {job.schedule}
+ {job.schedule_display}
Last: {formatTime(job.last_run_at)}
Next: {formatTime(job.next_run_at)}
- {job.error && (
- {job.error}
+ {job.last_error && (
+ {job.last_error}
)}
@@ -239,11 +244,11 @@ export default function CronPage() {