"""Pydantic schemas for the AI Script Builder.""" from datetime import datetime from typing import Optional from uuid import UUID from pydantic import BaseModel, Field class ScriptBuilderCreateRequest(BaseModel): """Request to start a new builder session.""" language: str = Field( default="powershell", pattern=r"^(powershell|bash|python)$", description="Script language", ) class ScriptBuilderMessageRequest(BaseModel): """User message in a builder session.""" content: str = Field(min_length=1, max_length=5000) class ScriptBuilderMessageSchema(BaseModel): """A single message in a builder session.""" id: UUID role: str content: str script: str | None = None script_filename: str | None = None line_count: int | None = None input_tokens: int | None = None output_tokens: int | None = None created_at: datetime model_config = {"from_attributes": True} class ScriptBuilderMessageResponse(BaseModel): """AI response to a builder message.""" role: str = "assistant" content: str script: str | None = None script_filename: str | None = None line_count: int | None = None timestamp: datetime model_config = {"from_attributes": True} class ScriptBuilderSessionSummary(BaseModel): """Lightweight session for list views (no messages).""" id: UUID language: str title: str | None = None message_count: int = 0 latest_script_filename: str | None = None created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class ScriptBuilderSessionDetail(BaseModel): """Full session with message history.""" id: UUID language: str title: str | None = None messages: list[ScriptBuilderMessageSchema] = [] latest_script: str | None = None latest_script_filename: str | None = None message_count: int = 0 ai_session_id: UUID | None = None created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class SaveToLibraryRequest(BaseModel): """Request to save a generated script to the Script Library.""" name: str = Field(min_length=1, max_length=200) description: str | None = None category_id: UUID | None = None share_with_team: bool = False