from __future__ import annotations from .shared import * class ProjectFromTextRequest(BaseModel): """零配置项目创建请求""" input_text: str = Field( ..., description="自然语言项目描述,例如:我们要做一个 AI 客服工具,基于 GPT-4o mini,对标 XX 竞品,3 周上线", min_length=10, max_length=500 ) class ProjectFromTextResponse(BaseModel): """零配置项目创建响应""" project: Dict[str, Any] signal: Dict[str, Any] charter: Dict[str, Any] tasks: List[Dict[str, Any]] risks: List[Dict[str, Any]] signal_sources: List[Dict[str, Any]] = Field(default_factory=list) analysis: Dict[str, Any] class CognitiveConflictResponse(BaseModel): """认知冲突响应""" id: str type: str description: str severity: str resolution_suggestion: Optional[str] = None related_users: List[str] class DailyBriefingResponse(BaseModel): """每日简报响应""" date: str total_updates: int your_updates: int relevant_changes: List[Dict[str, Any]] risk_alerts: List[Dict[str, Any]] alignment_needed: List[Dict[str, Any]] class FeishuCaptureRequest(BaseModel): """飞书信号捕获请求""" group_chat_id: str message_content: str sender: str feishu_message_id: Optional[str] = None class BrowserCaptureRequest(BaseModel): """浏览器信号捕获请求""" user_id: int url: str title: str content_preview: str class GitHubCaptureRequest(BaseModel): """GitHub信号捕获请求""" repo_url: str event_type: str event_data: Dict[str, Any] class ConflictDetectRequest(BaseModel): """认知冲突检测请求""" project_id: int detect_type: str = "all" # all, charter, definition class SignalSourceOnboardRequest(BaseModel): project_id: int = Field(..., ge=1) instruction: str = Field(..., min_length=6, max_length=2000) dry_run: bool = False response_mode: Literal["fast", "complete"] = "fast" class SignalSourceListResponse(BaseModel): items: List[Dict[str, Any]] class SignalSourceRepairRequest(BaseModel): project_id: int = Field(..., ge=1) registry_ids: List[int] = Field(default_factory=list, min_length=1, max_length=50) sender: str = Field(default="PMFlow修复器", min_length=1, max_length=64) class CodeCommentScanRequest(BaseModel): """代码注释扫描请求""" code_content: str file_path: str line_number: int project_id: int class BlockerResolveRequest(BaseModel): """阻塞解决请求""" blocker_id: int resolution_note: str class WorkflowTriggerRequest(BaseModel): """工作流触发请求""" event_type: str event_data: Dict[str, Any] class ExecutiveBriefingConfigRequest(BaseModel): enabled: bool = True send_time: str = Field(default="08:30", pattern=r"^\d{2}:\d{2}$") send_cycle: Literal["workdays", "daily"] = "workdays" delivery_target_type: Literal["management_group"] = "management_group" delivery_target_ref: Optional[str] = Field(default=None, max_length=128) timezone: str = Field(default="Asia/Shanghai", min_length=3, max_length=64) class ExecutiveBriefingMetric(BaseModel): label: str value: Any tone: str class ExecutiveBriefingItem(BaseModel): id: str title: str detail: str detail_lines: List[str] = Field(default_factory=list) meta: List[Dict[str, str]] = Field(default_factory=list) tone: str kind: Optional[str] = None target: Optional[Dict[str, Any]] = None project_id: Optional[int] = None project_name: Optional[str] = None user_id: Optional[int] = None owner_name: Optional[str] = None related_user_ids: List[int] = Field(default_factory=list) occurred_at: Optional[str] = None class ExecutiveBriefingSection(BaseModel): key: str title: str summary: str metrics: List[ExecutiveBriefingMetric] = Field(default_factory=list) items: List[ExecutiveBriefingItem] = Field(default_factory=list) drilldown_tab: Optional[str] = None class ExecutiveBriefingHero(BaseModel): title: str decision_count: int anomaly_count: int baseline_generated_at: Optional[str] = None live_generated_at: Optional[str] = None key_alerts: List[ExecutiveBriefingMetric] = Field(default_factory=list) snapshot_state: str = "missing" class ExecutiveBriefingPayload(BaseModel): brief_date: str mode: Literal["snapshot", "live"] summary: Dict[str, Any] hero: ExecutiveBriefingHero sections: List[ExecutiveBriefingSection] = Field(default_factory=list) delivery: Dict[str, Any] = Field(default_factory=dict) class DailyBriefingV2PersonalSummary(BaseModel): headline: str action_count: int = 0 project_count: int = 0 class DailyBriefingV2PersonalWorkload(BaseModel): user_id: int user_name: str assigned_hours: float = 0 max_weekly_hours: float = 0 workload_ratio: int = 0 tone: str = "info" class DailyBriefingV2Payload(BaseModel): brief_date: str mode: Literal["snapshot", "live"] viewer_scope: Literal["tenant_full", "personal"] hero: ExecutiveBriefingHero sections: List[ExecutiveBriefingSection] = Field(default_factory=list) personal_summary: Optional[DailyBriefingV2PersonalSummary] = None personal_workload: Optional[DailyBriefingV2PersonalWorkload] = None export_title: str