mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-09-24 05:26:20 +00:00
First step of the scheduled-task context's hexagonal migration: the inner-ring model, with zero infrastructure dependencies. - ScheduleSpec / SchedulePolicy value objects - ScheduledTask aggregate root - ScheduledRun aggregate - 9 domain errors, 5 enums Rules are migrated verbatim from their current homes, each method's docstring citing the source line: timezone/cron/next-run calculation from deerflow/scheduler/schedules.py, context-mode and re-arm rules from routers/scheduled_tasks.py, and the four status-derivation rules from app/scheduler/service.py. Two things previously held by convention are now enforced by construction. Validation and normalization live in __post_init__, so building a ScheduleSpec field-by-field cannot bypass them. The skipped tombstone is a separate factory, so it can never be written as the transient queued row that would collide with uq_scheduled_task_run_active. The domain does not serialize itself: mapping the stored schedule_spec JSON in and out stays with the adapter layer, keeping Mapping[str, Any] out of every domain signature. Production code still runs through app/scheduler/service.py -- this commit adds no call sites and changes no behavior.
45 lines
1005 B
Python
45 lines
1005 B
Python
from __future__ import annotations
|
|
|
|
from enum import StrEnum
|
|
|
|
|
|
class TaskStatus(StrEnum):
|
|
ENABLED = "enabled"
|
|
PAUSED = "paused"
|
|
RUNNING = "running"
|
|
COMPLETED = "completed"
|
|
FAILED = "failed"
|
|
CANCELLED = "cancelled"
|
|
|
|
|
|
class ContextMode(StrEnum):
|
|
FRESH_THREAD_PER_RUN = "fresh_thread_per_run"
|
|
REUSE_THREAD = "reuse_thread"
|
|
|
|
|
|
class ScheduleType(StrEnum):
|
|
ONCE = "once"
|
|
CRON = "cron"
|
|
|
|
|
|
class RunStatus(StrEnum):
|
|
QUEUED = "queued"
|
|
RUNNING = "running"
|
|
SUCCESS = "success"
|
|
FAILED = "failed"
|
|
INTERRUPTED = "interrupted"
|
|
SKIPPED = "skipped"
|
|
|
|
|
|
class TriggerKind(StrEnum):
|
|
"""What caused a dispatch.
|
|
|
|
The two kinds diverge in almost every decision the domain makes — how an
|
|
overlap is handled, what status survives a failed launch, whether a paused
|
|
task stays paused — so this is a first-class concept rather than the raw
|
|
string the old service compared in four places.
|
|
"""
|
|
|
|
SCHEDULED = "scheduled"
|
|
MANUAL = "manual"
|