from __future__ import annotations from dataclasses import asdict, dataclass, field from typing import Any, Dict, List, Optional @dataclass class Candidate: system_id: str display_name: str category: str advisory_mode: str source_kind: str source_name: str source_confidence: str source_url: str title: str published_at: Optional[str] = None updated_at: Optional[str] = None summary: str = "" severity: str = "unknown" cvss_score: Optional[float] = None exploit_status: str = "unknown" aliases: List[str] = field(default_factory=list) cve_ids: List[str] = field(default_factory=list) ghsa_ids: List[str] = field(default_factory=list) osv_ids: List[str] = field(default_factory=list) affected_versions: List[str] = field(default_factory=list) fixed_versions: List[str] = field(default_factory=list) package_name: Optional[str] = None references: List[str] = field(default_factory=list) raw: Dict[str, Any] = field(default_factory=dict) def to_dict(self) -> Dict[str, Any]: return asdict(self) @dataclass class AdvisoryRecord: canonical_id: str system_id: str display_name: str category: str advisory_mode: str title: str summary: str published_at: Optional[str] updated_at: Optional[str] severity: str cvss_score: Optional[float] exploit_status: str source_confidence: str official_source_url: Optional[str] secondary_source_urls: List[str] aliases: List[str] cve_ids: List[str] ghsa_ids: List[str] osv_ids: List[str] affected_versions: List[str] fixed_versions: List[str] package_name: Optional[str] render_markdown: bool case_path: Optional[str] secure_code_topics: List[str] status: str triage_reasons: List[str] = field(default_factory=list) verification_status: str = "triage-manual" verification_mode: str = "synthetic" last_verified_at: Optional[str] = None last_run_id: Optional[str] = None evidence_bundle: Optional[str] = None historical_status: Optional[str] = None latest_status: Optional[str] = None browser_evidence: Dict[str, Any] = field( default_factory=lambda: { "required": False, "present": False, "refs": [], } ) repro_profile_id: Optional[str] = None artifact_mode: Optional[str] = None blocked_reason: Optional[str] = None metadata: Dict[str, Any] = field(default_factory=dict) def to_dict(self) -> Dict[str, Any]: return asdict(self)