cc-haha/desktop/src/api/tasks.ts
程序员阿江(Relakkes) 983d83f86b feat: enhance scheduled tasks with flexible scheduling, run now, execution logs, and edit support
- Add 7 frequency modes (every N min/hours, daily, weekdays, specific days, monthly, custom cron) with progressive disclosure UI
- Add "Run Now" button with confirmation popover and fire-and-forget API
- Add execution logs panel (TaskRunsPanel) with auto-polling and accordion behavior
- Add task edit mode with cron reverse-parsing (parseCron) to populate form
- Add server-side extractAssistantText to store meaningful AI responses instead of raw NDJSON
- Fix session linking: pass --session-id to CLI subprocess so "View conversation" navigates to actual content
- Fix MACRO undefined error by adding --preload to Bun.spawn
- Add confirmation popovers for all destructive actions (run/disable/delete)
- Add DayOfWeekPicker component for specific-days scheduling
- Add cronDescribe utility with i18n support and unit tests
- Display task creation time and last run time
- Add ~50 i18n keys (en/zh) for all new UI elements

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 17:40:13 +08:00

37 lines
984 B
TypeScript

import { api } from './client'
import type { CronTask, CreateTaskInput, TaskRun } from '../types/task'
type TasksResponse = { tasks: CronTask[] }
type TaskResponse = { task: CronTask }
type RunsResponse = { runs: TaskRun[] }
export const tasksApi = {
list() {
return api.get<TasksResponse>('/api/scheduled-tasks')
},
create(input: CreateTaskInput) {
return api.post<TaskResponse>('/api/scheduled-tasks', input)
},
update(id: string, updates: Partial<CronTask>) {
return api.put<TaskResponse>(`/api/scheduled-tasks/${id}`, updates)
},
delete(id: string) {
return api.delete<{ ok: true }>(`/api/scheduled-tasks/${id}`)
},
runTask(id: string) {
return api.post<{ ok: true }>(`/api/scheduled-tasks/${id}/run`, {})
},
getRecentRuns(limit = 50) {
return api.get<RunsResponse>(`/api/scheduled-tasks/runs?limit=${limit}`)
},
getTaskRuns(taskId: string) {
return api.get<RunsResponse>(`/api/scheduled-tasks/${taskId}/runs`)
},
}