PMFlow/backend/app/api/ai_steward_api/schemas.py

169 lines
4.8 KiB
Python

from __future__ import annotations
from .shared import *
class CognitiveConflictResponse(BaseModel):
"""认知冲突响应"""
id: str
type: str
display_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
display_title: str
display_subtitle: str
display_source: str
technical_identifier: Optional[str] = None
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