feat(KB-045): add scheduled tasks automation system

- Add AutomationStore and core automation types for cron-based scheduling
- Implement CronRunner engine for executing scheduled automations
- Add REST API routes for CRUD operations on automations
- Create UI components: ScheduleCard, ScheduleForm, and ScheduledTasksModal
- Integrate scheduled tasks into dashboard App.tsx and CLI dashboard command
- Add comprehensive tests for store, runner, API, and UI components
- Include changeset for the new scheduled tasks feature
This commit is contained in:
gsxdsm
2026-03-30 16:27:23 -07:00
parent 2a73e602f4
commit e03bd1ae38
27 changed files with 3806 additions and 8 deletions

View File

@@ -1,11 +1,12 @@
import { useState, useEffect, useRef, useCallback } from "react";
import { Settings, Pause, Play, Square, Download, LayoutGrid, List, Terminal, Lightbulb, Search, X, Activity, MoreHorizontal } from "lucide-react";
import { Settings, Pause, Play, Square, Download, LayoutGrid, List, Terminal, Lightbulb, Search, X, Activity, MoreHorizontal, Clock } from "lucide-react";
interface HeaderProps {
onOpenSettings?: () => void;
onOpenGitHubImport?: () => void;
onOpenPlanning?: () => void;
onOpenUsage?: () => void;
onOpenSchedules?: () => void;
onToggleTerminal?: () => void;
globalPaused?: boolean;
enginePaused?: boolean;
@@ -39,6 +40,7 @@ export function Header({
onOpenGitHubImport,
onOpenPlanning,
onOpenUsage,
onOpenSchedules,
onToggleTerminal,
globalPaused,
enginePaused,
@@ -236,6 +238,18 @@ export function Header({
</button>
)}
{/* Schedules button - desktop only (moved to overflow on mobile) */}
{!isMobile && (
<button
className="btn-icon"
onClick={onOpenSchedules}
title="Scheduled tasks"
data-testid="schedules-btn"
>
<Clock size={16} />
</button>
)}
{/* Terminal button - desktop only (moved to overflow on mobile) */}
{!isMobile && (
<button
@@ -324,6 +338,15 @@ export function Header({
<Lightbulb size={16} />
<span>Create a task with AI planning</span>
</button>
<button
className="mobile-overflow-item"
onClick={() => handleOverflowAction(onOpenSchedules)}
role="menuitem"
data-testid="overflow-schedules-btn"
>
<Clock size={16} />
<span>Scheduled Tasks</span>
</button>
<button
className="mobile-overflow-item"
onClick={() => handleOverflowAction(onOpenSettings)}