from __future__ import annotations from dataclasses import dataclass, field from typing import Any def confidence_label(confidence: float) -> str: if confidence >= 0.8: return "high" if confidence >= 0.5: return "medium" return "low" @dataclass(frozen=True) class Repository: id: int name: str url: str description: str | None branch: str status: str @dataclass(frozen=True) class RepositorySnapshot: id: int repository_id: int commit_hash: str branch: str source_path: str file_count: int @dataclass(frozen=True) class AnalysisRun: id: int repository_id: int snapshot_id: int | None status: str started_at: str completed_at: str | None error_message: str | None scanner_version: str @dataclass(frozen=True) class ReviewDecision: id: int repository_id: int analysis_run_id: int | None action: str notes: str created_at: str @dataclass(frozen=True) class ExpectationGap: id: int repository_id: int analysis_run_id: int | None expected_type: str expected_name: str source: str notes: str status: str created_at: str @dataclass(frozen=True) class AnalysisRunDiffItem: change_type: str item_type: str key: str base: dict[str, Any] | None = None target: dict[str, Any] | None = None @dataclass(frozen=True) class AnalysisRunDiffSection: added: list[AnalysisRunDiffItem] = field(default_factory=list) removed: list[AnalysisRunDiffItem] = field(default_factory=list) changed: list[AnalysisRunDiffItem] = field(default_factory=list) weakened: list[AnalysisRunDiffItem] = field(default_factory=list) @dataclass(frozen=True) class AnalysisRunDiff: repository: Repository base_run: AnalysisRun target_run: AnalysisRun facts: AnalysisRunDiffSection chunks: AnalysisRunDiffSection candidates: AnalysisRunDiffSection approved_entries: AnalysisRunDiffSection @dataclass(frozen=True) class ObservedFact: id: int repository_id: int analysis_run_id: int snapshot_id: int | None kind: str path: str name: str value: str metadata: dict[str, Any] @dataclass(frozen=True) class ContentChunk: id: int repository_id: int analysis_run_id: int snapshot_id: int | None path: str kind: str start_line: int end_line: int text: str metadata: dict[str, Any] = field(default_factory=dict) @dataclass(frozen=True) class ScanSummary: analysis_run: AnalysisRun snapshot: RepositorySnapshot | None facts: list[ObservedFact] @dataclass(frozen=True) class CharacteristicRebuildResult: repository: Repository analysis_run: AnalysisRun dry_run: bool confirmed: bool cleared_approved: bool previous_counts: dict[str, int] previous_ids: dict[str, list[int]] candidate_counts: dict[str, int] @dataclass(frozen=True) class SourceReference: fact_id: int | None path: str kind: str name: str line: int | None = None @dataclass(frozen=True) class CandidateEvidence: id: int type: str reference: str strength: str status: str source_refs: list[SourceReference] target_kind: str = "capability" target_id: int | None = None reference_kind: str = "source" reference_id: int | None = None @dataclass(frozen=True) class CandidateFeature: id: int name: str type: str location: str confidence: float status: str source_refs: list[SourceReference] confidence_label: str = "" primary_class: str = "" attributes: list[str] = field(default_factory=list) @dataclass(frozen=True) class CandidateCapability: id: int name: str description: str inputs: list[str] outputs: list[str] confidence: float status: str source_refs: list[SourceReference] confidence_label: str = "" primary_class: str = "capability" attributes: list[str] = field(default_factory=list) features: list[CandidateFeature] = field(default_factory=list) evidence: list[CandidateEvidence] = field(default_factory=list) @dataclass(frozen=True) class CandidateAbility: id: int name: str description: str confidence: float status: str source_refs: list[SourceReference] confidence_label: str = "" primary_class: str = "ability" attributes: list[str] = field(default_factory=list) capabilities: list[CandidateCapability] = field(default_factory=list) @dataclass(frozen=True) class CandidateGraph: repository: Repository analysis_run: AnalysisRun abilities: list[CandidateAbility] @dataclass(frozen=True) class Evidence: id: int type: str reference: str strength: str source_refs: list[SourceReference] = field(default_factory=list) target_kind: str = "capability" target_id: int | None = None reference_kind: str = "source" reference_id: int | None = None @dataclass(frozen=True) class Scope: id: int name: str description: str confidence: float confidence_label: str = "" @dataclass(frozen=True) class Feature: id: int name: str type: str location: str confidence: float confidence_label: str = "" source_refs: list[SourceReference] = field(default_factory=list) primary_class: str = "" attributes: list[str] = field(default_factory=list) @dataclass(frozen=True) class Capability: id: int name: str description: str inputs: list[str] outputs: list[str] confidence: float confidence_label: str = "" primary_class: str = "capability" attributes: list[str] = field(default_factory=list) features: list[Feature] = field(default_factory=list) evidence: list[Evidence] = field(default_factory=list) @dataclass(frozen=True) class Ability: id: int name: str description: str confidence: float confidence_label: str = "" primary_class: str = "ability" attributes: list[str] = field(default_factory=list) capabilities: list[Capability] = field(default_factory=list) @dataclass(frozen=True) class RepositoryAbilityMap: repository: Repository scope: Scope abilities: list[Ability] @dataclass(frozen=True) class SearchResult: repository_id: int repository_name: str match_type: str match_name: str confidence: float confidence_label: str = "" match_description: str = "" matched_field: str = "" ability_id: int | None = None ability_name: str | None = None capability_id: int | None = None capability_name: str | None = None evidence_level: str | None = None source_reference: str | None = None text_score: float = 0.0 vector_score: float = 0.0 hybrid_score: float = 0.0 @dataclass(frozen=True) class AbilitySummary: id: int repository_id: int repository_name: str name: str description: str confidence: float confidence_label: str = "" @dataclass(frozen=True) class CapabilitySummary: id: int repository_id: int repository_name: str ability_id: int ability_name: str name: str description: str confidence: float confidence_label: str = ""