from pydantic import BaseModel, Field class ReviewWorkerConfig(BaseModel): """Configuration for the post-turn background skill review worker.""" enabled: bool = Field(default=False, description="Whether the review worker is active.") min_tool_calls: int = Field(default=5, description="Minimum tool calls in a turn to trigger review. Matches the prompt's '≥5 steps' hard condition so simple queries never reach the LLM reviewer.") max_messages: int = Field(default=60, description="Max messages passed to the review LLM.") model_name: str | None = Field(default=None, description="Model to use for review; defaults to primary model.") timeout_seconds: int = Field(default=120, description="Overall timeout for a single review run.") class CuratorConfig(BaseModel): """Configuration for the background skill curator.""" enabled: bool = Field(default=False, description="Whether the curator runs automatically.") interval_hours: int = Field(default=168, description="Hours between curator runs (default: 7 days).") stale_after_days: int = Field(default=30, description="Days of inactivity before a skill is marked stale.") archive_after_days: int = Field(default=90, description="Days of inactivity before a stale skill is archived.") review_timeout_seconds: int = Field(default=600, description="Overall timeout (seconds) for the LLM review pass.") model_name: str | None = Field(default=None, description="Model name for the curator LLM review pass. Defaults to the primary chat model.") class SkillEvolutionConfig(BaseModel): """Configuration for agent-managed skill evolution.""" enabled: bool = Field( default=False, description="Whether the agent can create and modify skills under skills/custom.", ) curator: CuratorConfig = Field( default_factory=CuratorConfig, description="Configuration for the background skill curator.", ) review_worker: ReviewWorkerConfig = Field( default_factory=ReviewWorkerConfig, description="Configuration for the post-turn background skill review worker.", )