"""Personal Space API schemas.""" from __future__ import annotations from typing import Any, Literal, Optional from pydantic import BaseModel, Field SavedIdeaStatus = Literal["saved", "enriched", "needs_more_info", "draft_ready", "promoted", "archived"] SavedIdeaSourceType = Literal["project_launch", "ai_concierge", "logout_guard", "feishu", "upload", "manual"] SavedIdeaInputMode = Literal["idea", "import", "template"] SavedIdeaEnrichmentStatus = Literal["baseline", "ai_enriched", "ai_failed"] class SavedIdeaAttachment(BaseModel): type: str = "text" name: Optional[str] = None summary: Optional[str] = None payload: Optional[dict[str, Any]] = None class SavedIdeaCreateRequest(BaseModel): raw_text: str = Field(min_length=1, max_length=4000) title: Optional[str] = Field(default=None, max_length=255) summary: Optional[str] = Field(default=None, max_length=1000) source_type: SavedIdeaSourceType = "project_launch" source_ref: Optional[str] = Field(default=None, max_length=255) input_mode: SavedIdeaInputMode = "idea" attachments: list[SavedIdeaAttachment] = Field(default_factory=list) class SavedIdeaUpdateRequest(BaseModel): title: Optional[str] = Field(default=None, min_length=1, max_length=255) raw_text: Optional[str] = Field(default=None, min_length=1, max_length=4000) summary: Optional[str] = Field(default=None, min_length=1, max_length=1000) status: Optional[SavedIdeaStatus] = None class SavedIdeaRead(BaseModel): id: str title: str raw_text: str summary: str source_type: str source_ref: Optional[str] = None input_mode: str attachments: list[dict[str, Any]] = Field(default_factory=list) status: str status_label: str ai_summary: Optional[str] = None missing_questions: list[str] = Field(default_factory=list) readiness_score: float enrichment_status: str = "baseline" enrichment_payload: dict[str, Any] = Field(default_factory=dict) enrichment_error: Optional[str] = None enriched_at: Optional[str] = None launch_draft_id: Optional[str] = None promoted_project_id: Optional[int] = None created_at: str updated_at: str href: str class SavedIdeaListResponse(BaseModel): items: list[SavedIdeaRead] = Field(default_factory=list) class SavedIdeaPromoteResponse(BaseModel): idea: SavedIdeaRead draft: dict[str, Any] redirect_url: str __all__ = [ "SavedIdeaAttachment", "SavedIdeaCreateRequest", "SavedIdeaEnrichmentStatus", "SavedIdeaListResponse", "SavedIdeaPromoteResponse", "SavedIdeaRead", "SavedIdeaUpdateRequest", ]