"""Single-run lifecycle: which statuses reserve a project execution slot."""
from __future__ import annotations

# User-facing "active" — new /chat without run_id is rejected when any of these exist.
ACTIVE_RUN_RESERVING_STATUSES: frozenset[str] = frozenset(
    {
        "pending",
        "queued",
        "running",
        "planning",
        "generating",
        "applying",
        "validating",
        "preview_refreshing",
        "plan_ready",
        "clarification_required",
        "user_input_required",
        # Legacy rows until fully migrated
        "awaiting_user_input",
    }
)

# Worker is busy; follow-up /chat with same run_id is rejected.
RUN_BUSY_STATUSES: frozenset[str] = frozenset(
    {
        "running",
        "planning",
        "generating",
        "applying",
        "validating",
        "preview_refreshing",
    }
)

# Continuation via POST /chat with explicit run_id (merge / resume).
CONTINUABLE_STATUSES: frozenset[str] = frozenset(
    {
        "queued",
        "plan_ready",
        "clarification_required",
        "user_input_required",
        "awaiting_user_input",
    }
)

USER_INPUT_BLOCKING_STATUSES: frozenset[str] = frozenset(
    {"user_input_required", "awaiting_user_input"}
)
