from __future__ import annotations from typing import Any from pydantic import BaseModel, Field class ParsedIntent(BaseModel): action_type: str | None = None app_code: str | None = None env: str | None = None version: str | None = None class CreateTaskRequest(BaseModel): input_text: str channel: str session_id: str tenant_id: str context: dict[str, Any] = Field(default_factory=dict) class CreateTaskData(BaseModel): task_id: str parsed_intent: ParsedIntent missing_slots: list[str] risk_level: str task_status: str next_action: str class ConfirmTaskRequest(BaseModel): confirmed: bool comment: str | None = None class CancelTaskRequest(BaseModel): reason: str | None = None class ConfirmTaskData(BaseModel): task_id: str task_status: str approval_status: str approval_id: str | None = None software_a_task_id: str | None = None software_a_task_status: str | None = None class ToolCallItem(BaseModel): tool_name: str success: bool class VerificationResult(BaseModel): process_ok: bool | None = None port_ok: bool | None = None http_ok: bool | None = None log_error_count: int | None = None class ApprovalSummary(BaseModel): approval_id: str | None = None approval_status: str | None = None reason: str | None = None class SoftwareAResultSummary(BaseModel): software_a_task_id: str | None = None task_status: str | None = None progress_percent: int | None = None error_detail: str | None = None started_at: str | None = None finished_at: str | None = None class VerificationResultSummary(BaseModel): step_id: str | None = None step_status: str | None = None success: bool | None = None duration_ms: int | None = None message: str | None = None class ResultSummaryDetail(BaseModel): final_status: str final_reason: str | None = None approval: ApprovalSummary | None = None software_a: SoftwareAResultSummary | None = None verification: VerificationResultSummary | None = None class TaskDetailData(BaseModel): task_id: str task_status: str approval_status: str risk_level: str intent: ParsedIntent software_a_task_id: str | None = None software_a_task_status: str | None = None tool_calls: list[ToolCallItem] verification_result: VerificationResult | None = None summary: str | None = None result_summary_detail: ResultSummaryDetail | None = None class TaskBasic(BaseModel): task_id: str task_status: str approval_status: str risk_level: str created_at: str updated_at: str confirmed_at: str | None = None class ApprovalTraceItem(BaseModel): approval_id: str approval_status: str risk_level: str approvers: list[str] reason: str | None = None created_at: str updated_at: str class ToolTraceItem(BaseModel): tool_call_id: str request_id: str | None = None operator_user_id: str | None = None operator_user_name: str | None = None tool_name: str success: bool duration_ms: int | None = None started_at: str | None = None finished_at: str | None = None request_payload: dict[str, Any] response_payload: dict[str, Any] class VerificationTraceItem(BaseModel): step_id: str edge_id: str tool_name: str step_status: str success: bool | None = None duration_ms: int | None = None message: str | None = None params: dict[str, Any] result_data: dict[str, Any] evidence: dict[str, Any] started_at: str | None = None finished_at: str | None = None class AuditTraceItem(BaseModel): audit_id: str request_id: str | None = None action: str result: str operator_user_id: str | None = None operator_user_name: str | None = None target: str | None = None detail: dict[str, Any] timestamp: str class AuditSummary(BaseModel): audit_event_count: int = 0 failure_count: int = 0 pending_count: int = 0 cancelled_count: int = 0 reported_count: int = 0 action_types: list[str] = Field(default_factory=list) operator_user_names: list[str] = Field(default_factory=list) result_counts: dict[str, int] = Field(default_factory=dict) class TaskMetrics(BaseModel): total_duration_ms: int | None = None confirm_wait_duration_ms: int | None = None approval_duration_ms: int | None = None execution_duration_ms: int | None = None software_a_duration_ms_total: int = 0 tool_call_duration_ms_total: int = 0 verification_duration_ms_total: int = 0 verification_queue_wait_duration_ms_total: int = 0 verification_end_to_end_duration_ms_total: int = 0 tool_call_count: int = 0 tool_call_success_count: int = 0 tool_call_failed_count: int = 0 verification_step_count: int = 0 verification_success_count: int = 0 verification_failed_count: int = 0 audit_event_count: int = 0 audit_failure_count: int = 0 class TaskReportData(BaseModel): task_basic: TaskBasic intent_snapshot: ParsedIntent approval_trace: list[ApprovalTraceItem] tool_trace: list[ToolTraceItem] verification_trace: list[VerificationTraceItem] task_metrics: TaskMetrics audit_summary: AuditSummary result_summary: str | None = None result_summary_detail: ResultSummaryDetail | None = None audit_trace: list[AuditTraceItem]