from __future__ import annotations import uuid from datetime import datetime from pydantic import BaseModel, Field class RecentlyOnScopeGenerate(BaseModel): range: str = Field(default="1h", description="Time range such as 15m, 1h, 6h, or 1d") since: datetime | None = None until: datetime | None = None class RecentlyOnScopeSourceCounts(BaseModel): progress_events: int = 0 decisions: int = 0 workstreams: int = 0 tasks: int = 0 repos: int = 0 attention_items: int = 0 class RecentlyOnScopeReportMetadata(BaseModel): id: str domain_slug: str range: str since: datetime until: datetime generated_at: datetime path: str source_counts: RecentlyOnScopeSourceCounts class RecentlyOnScopeGeneratedReport(RecentlyOnScopeReportMetadata): markdown: str class RecentlyOnScopeHourlyGenerate(RecentlyOnScopeGenerate): active_only: bool = True include_attention: bool = False class RecentlyOnScopeSkippedDomain(BaseModel): domain_slug: str reason: str source_counts: RecentlyOnScopeSourceCounts class RecentlyOnScopeFailedDomain(BaseModel): domain_slug: str error: str class RecentlyOnScopeHourlyRun(BaseModel): range: str since: datetime until: datetime generated_at: datetime active_only: bool include_attention: bool generated: list[RecentlyOnScopeReportMetadata] = Field(default_factory=list) skipped: list[RecentlyOnScopeSkippedDomain] = Field(default_factory=list) failed: list[RecentlyOnScopeFailedDomain] = Field(default_factory=list) progress_event_id: uuid.UUID | None = None