get_task/batch_get_tasks now return failureReason (max_turns|timeout|error| cancelled|unknown) plus failureTurnsUsed/failureMaxTurns on a Failed task, so max_turns (worktree usually fine, continue_task) is distinguishable from a real error (reset_failed_task) without pulling get_task_log's raw NDJSON. Classified and stamped onto TaskEntity by TaskRunner.MarkFailed via TaskStateService.FailAsync; TaskRunEntity also keeps the CLI's raw terminal_reason/result_subtype/errors for deeper diagnosis. reset_failed_task's description now warns explicitly that it discards the worktree and points at continue_task for max_turns. Surfaced on the task card's status-chip tooltip.
37 lines
2.3 KiB
C#
37 lines
2.3 KiB
C#
namespace ClaudeDo.Worker.State;
|
|
|
|
public interface ITaskStateService
|
|
{
|
|
Task<TransitionResult> EnqueueAsync(string taskId, CancellationToken ct);
|
|
Task<TransitionResult> StartRunningAsync(string taskId, DateTime startedAt, CancellationToken ct);
|
|
Task<TransitionResult> CompleteAsync(string taskId, DateTime finishedAt, string? result, CancellationToken ct);
|
|
Task<TransitionResult> SubmitForReviewAsync(string taskId, DateTime finishedAt, string? result, CancellationToken ct);
|
|
Task<TransitionResult> SubmitInteractiveForReviewAsync(string taskId, DateTime finishedAt, CancellationToken ct);
|
|
Task<TransitionResult> SubmitForChildrenAsync(string taskId, DateTime finishedAt, string? result, CancellationToken ct);
|
|
Task<TransitionResult> FailAsync(
|
|
string taskId, DateTime finishedAt, string? error, CancellationToken ct,
|
|
string failureReason = "error", int? turnsUsed = null, int? maxTurns = null);
|
|
Task<TransitionResult> CancelAsync(string taskId, DateTime finishedAt, CancellationToken ct, bool allowFromIdle = false);
|
|
Task<TransitionResult> ResetToIdleAsync(string taskId, CancellationToken ct);
|
|
|
|
Task<TransitionResult> ApproveReviewAsync(string taskId, CancellationToken ct);
|
|
Task<TransitionResult> RejectToQueueAsync(string taskId, string feedback, CancellationToken ct);
|
|
Task<TransitionResult> RejectToIdleAsync(string taskId, CancellationToken ct);
|
|
Task<TransitionResult> ClearReviewFeedbackAsync(string taskId, CancellationToken ct);
|
|
|
|
Task<TransitionResult> ForceSetStatusAsync(string taskId, ClaudeDo.Data.Models.TaskStatus status, CancellationToken ct);
|
|
|
|
Task<TransitionResult> StartPlanningAsync(string parentId, CancellationToken ct);
|
|
Task<TransitionResult> FinalizePlanningAsync(string parentId, CancellationToken ct);
|
|
|
|
Task<TransitionResult> BlockOnAsync(string taskId, string predecessorTaskId, CancellationToken ct);
|
|
Task<TransitionResult> UnblockAsync(string taskId, CancellationToken ct);
|
|
|
|
// Surfaces a WaitingForChildren parent for review once all its children are terminal.
|
|
// Best-effort (swallows and logs failures) — safe to call after any child mutation,
|
|
// e.g. deleting the last non-terminal child (no terminal transition fires for a delete).
|
|
Task TryAdvanceParentAsync(string parentId);
|
|
|
|
Task<int> RecoverStaleRunningAsync(string reason, CancellationToken ct);
|
|
}
|