from __future__ import annotations from typing import Any, Dict, List, Literal, Optional from pydantic import Field try: from core.env_server.types import Action, Observation, State except ImportError: try: from openenv.core.env_server.types import Action, Observation, State except ImportError: from openenv_core.env_server.types import Action, Observation, State ActionType = Literal["inspect_file", "submit_finding", "submit_final_report"] VulnerabilityType = Literal[ "sql_injection", "command_injection", "path_traversal", "weak_authentication", "insecure_deserialization", "ssrf", "hardcoded_secret", "xss", ] Severity = Literal["low", "medium", "high", "critical"] class CodeSecurityAction(Action): """Action sent by the agent during a security audit episode.""" action_type: ActionType filename: Optional[str] = None line_start: Optional[int] = Field(default=None, ge=1) line_end: Optional[int] = Field(default=None, ge=1) vuln_type: Optional[VulnerabilityType] = None severity: Optional[Severity] = None confidence: float = Field(default=0.5, ge=0.0, le=1.0) evidence: str = "" summary: str = "" class FindingRecord(State): """Stored record of one submitted finding.""" finding_id: str filename: str line_start: int line_end: int vuln_type: str severity: str confidence: float evidence: str summary: str matched_vulnerability_id: Optional[str] = None component_score: float = 0.0 class CodeSecurityObservation(Observation): """Observation returned after reset() and step().""" task_id: str task_title: str difficulty: str objective: str instructions: str available_files: List[str] = Field(default_factory=list) focused_file: Optional[str] = None file_excerpt: str = "" findings_so_far: List[Dict[str, Any]] = Field(default_factory=list) steps_remaining: int = 0 last_feedback: str = "" score_hint: float = Field(default=0.0, ge=0.0, le=1.0) class CodeSecurityState(State): """Internal environment state for the current security auditing episode.""" task_id: str = "" task_title: str = "" difficulty: str = "" objective: str = "" max_steps: int = 0 inspected_files: List[str] = Field(default_factory=list) findings_submitted: List[FindingRecord] = Field(default_factory=list) matched_vulnerability_ids: List[str] = Field(default_factory=list) false_positive_count: int = 0 duplicate_submission_count: int = 0 quality_multiplier: float = 1.0 final_score: Optional[float] = None