from datetime import datetime from pydantic import BaseModel, Field from .models import PageContext, Channel, RiskLevel, PublishMode class MediaAttachment(BaseModel): media_path: str media_type: str = "image" mime_type: str | None = None alt_text: str | None = None label: str | None = None class NormalizedInboundEvent(BaseModel): page_context: PageContext platform_page_id: str channel: Channel event_type: str sender_id_hash: str | None = None object_id: str | None = None parent_id: str | None = None permalink_url: str | None = None message_text: str | None = None normalized_payload: dict = Field(default_factory=dict) class CreateDraftRequest(BaseModel): page_context: PageContext channel: Channel source_event_id: int | None = None target_object_id: str | None = None recipient_psid: str | None = None draft_text: str sources: list[str] = Field(default_factory=list) media_attachments: list[MediaAttachment] = Field(default_factory=list) media_required: bool = False publish_mode: PublishMode = PublishMode.now scheduled_publish_time: datetime | None = None risk_level: RiskLevel = RiskLevel.medium created_by: str = "openclaw" class ApproveDraftRequest(BaseModel): approved_by: str edited_text: str | None = None publish_mode: PublishMode | None = None scheduled_publish_time: datetime | None = None class EditDraftRequest(BaseModel): edited_by: str draft_text: str | None = None sources: list[str] | None = None media_attachments: list[MediaAttachment] | None = None media_required: bool | None = None publish_mode: PublishMode | None = None scheduled_publish_time: datetime | None = None class RejectDraftRequest(BaseModel): rejected_by: str reason: str class PublishPagePostRequest(BaseModel): page_context: PageContext message: str approved_by: str sources: list[str] = Field(default_factory=list) media_attachments: list[MediaAttachment] = Field(default_factory=list) media_required: bool = False publish_mode: PublishMode = PublishMode.now scheduled_publish_time: datetime | None = None class PublishReelRequest(BaseModel): page_context: PageContext video_path: str description: str approved_by: str title: str | None = None validation_only: bool = False sources: list[str] = Field(default_factory=list) class SendMessengerRequest(BaseModel): page_context: PageContext recipient_psid: str message: str approved_by: str messaging_type: str = "RESPONSE" class ReplyToCommentRequest(BaseModel): page_context: PageContext comment_id: str message: str approved_by: str class ModerateCommentRequest(BaseModel): page_context: PageContext comment_id: str action: str = Field(pattern="^(hide|unhide|delete)$") approved_by: str reason: str