mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-08-17 10:18:34 +00:00
update/pause/resume read the aggregate and persist it whole; a dispatch or completion committing between those operations previously got overwritten by the stale snapshot -- rolling back next_run_at, run_count, and last_run_id, after which the next poll re-launches an already-executed occurrence. - ScheduledTask gains a `version` token owned by the storage write path; every committed write (save CAS, record_launch, record_completion, claim_due, cancel_stuck_once_tasks) increments it. - `save()` is now a compare-and-set on that version: a stale write raises the new ConcurrentUpdateError instead of committing. - The service retries the read-modify-write (re-applying the aggregate transitions to a fresh read) up to 3 times, then surfaces the conflict for the router to map to a retryable 409. Also exports LaunchIndeterminateError from the package root, missed in the previous commit. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
88 lines
2.1 KiB
Python
88 lines
2.1 KiB
Python
"""Schedule bounded context: standing instructions to run a prompt on time.
|
|
|
|
Public API of the context. Import domain objects, commands, errors, and the
|
|
service from here; import ports from `deerflow.domain.schedule.ports` -- they
|
|
are contracts consumed by adapters and tests, not everyday call-site symbols.
|
|
"""
|
|
|
|
from deerflow.domain.schedule.commands import (
|
|
UNSET,
|
|
ContextChange,
|
|
CreateScheduledTask,
|
|
DeleteTask,
|
|
PauseTask,
|
|
ResumeTask,
|
|
TriggerTask,
|
|
UnsetType,
|
|
UpdateScheduledTask,
|
|
)
|
|
from deerflow.domain.schedule.exceptions import (
|
|
ActiveRunConflictError,
|
|
ConcurrentUpdateError,
|
|
CorruptStoredScheduleError,
|
|
InvalidContextModeError,
|
|
InvalidScheduleError,
|
|
LaunchFailedError,
|
|
LaunchIndeterminateError,
|
|
ScheduleError,
|
|
TaskNotFoundError,
|
|
TaskNotMutableError,
|
|
ThreadBusyError,
|
|
ThreadNotFoundError,
|
|
)
|
|
from deerflow.domain.schedule.model import (
|
|
ACTIVE_RUN_STATUSES,
|
|
TERMINAL_RUN_STATUSES,
|
|
TERMINAL_TASK_STATUSES,
|
|
ContextMode,
|
|
DispatchOutcome,
|
|
RunStatus,
|
|
ScheduledRun,
|
|
ScheduledTask,
|
|
SchedulePolicy,
|
|
ScheduleSpec,
|
|
ScheduleType,
|
|
TaskStatus,
|
|
TriggerKind,
|
|
)
|
|
from deerflow.domain.schedule.service import DispatchResult, ScheduleService
|
|
|
|
__all__ = [
|
|
"ACTIVE_RUN_STATUSES",
|
|
"TERMINAL_RUN_STATUSES",
|
|
"TERMINAL_TASK_STATUSES",
|
|
"UNSET",
|
|
"ActiveRunConflictError",
|
|
"ConcurrentUpdateError",
|
|
"ContextChange",
|
|
"ContextMode",
|
|
"CorruptStoredScheduleError",
|
|
"CreateScheduledTask",
|
|
"DeleteTask",
|
|
"DispatchOutcome",
|
|
"DispatchResult",
|
|
"InvalidContextModeError",
|
|
"InvalidScheduleError",
|
|
"LaunchFailedError",
|
|
"LaunchIndeterminateError",
|
|
"PauseTask",
|
|
"ResumeTask",
|
|
"RunStatus",
|
|
"ScheduleError",
|
|
"SchedulePolicy",
|
|
"ScheduleService",
|
|
"ScheduleSpec",
|
|
"ScheduleType",
|
|
"ScheduledRun",
|
|
"ScheduledTask",
|
|
"TaskNotFoundError",
|
|
"TaskNotMutableError",
|
|
"TaskStatus",
|
|
"ThreadBusyError",
|
|
"ThreadNotFoundError",
|
|
"TriggerKind",
|
|
"TriggerTask",
|
|
"UnsetType",
|
|
"UpdateScheduledTask",
|
|
]
|