"""Skill schemas for AGI skill library and compilation.""" from datetime import datetime, timezone from enum import Enum from typing import Any from pydantic import BaseModel, Field, field_validator def _utc_now() -> datetime: return datetime.now(timezone.utc) class SkillKind(str, Enum): """Type of skill.""" WORKFLOW = "workflow" PROCEDURE = "procedure" TOOL_NATIVE = "tool_native" COMPOSITE = "composite" class Skill(BaseModel): """Reusable skill: declarative description + executable steps.""" skill_id: str = Field(..., min_length=1) name: str = Field(..., min_length=1) description: str = Field(default="") kind: SkillKind = Field(default=SkillKind.WORKFLOW) steps: list[dict[str, Any]] = Field(default_factory=list, description="Declarative steps (plan-like)") tool_names: list[str] = Field(default_factory=list, description="Tools this skill uses") version: int = Field(default=1, ge=1) metadata: dict[str, Any] = Field(default_factory=dict) created_at: datetime = Field(default_factory=_utc_now) @field_validator("skill_id", "name") @classmethod def validate_non_whitespace(cls, v: str) -> str: if not v.strip(): raise ValueError("Field cannot be empty or whitespace") return v class SkillVersionInfo(BaseModel): """Version and performance tracking for a skill.""" skill_id: str = Field(..., min_length=1) version: int = Field(..., ge=1) success_count: int = Field(default=0, ge=0) failure_count: int = Field(default=0, ge=0) last_success_at: datetime | None = Field(default=None) regression_test_ids: list[str] = Field(default_factory=list)