Dave-13/DevSecOps
0
1"""2OpenEnv-style environment for the DevSecOps agent.3Exposes state, actions, and a reward function.4"""5 6from core.test_runner import run_tests7from agents.security import run_security_checks8 9 10class OpenEnvDevSecOps:11 def __init__(self, original_code: str, logs: str, test_code: str):12 self._original_code = original_code13 self._test_code = test_code14 self.state = {15 "codebase": original_code,16 "logs": logs,17 "test_results": {},18 "security_flags": {},19 "retries": 0,20 "reward": 0.0,21 }22 23 # ── ACTIONS ──────────────────────────────────────────────────────────────24 25 def apply_patch(self, patched_code: str) -> dict:26 self.state["codebase"] = patched_code27 return {"applied": True}28 29 def run_tests(self) -> dict:30 result = run_tests(self.state["codebase"], self._test_code)31 self.state["test_results"] = result32 return result33 34 def run_security_checks(self) -> dict:35 result = run_security_checks(self.state["codebase"])36 self.state["security_flags"] = result37 return result38 39 def reset_env(self):40 self.state["codebase"] = self._original_code41 self.state["test_results"] = {}42 self.state["security_flags"] = {}43 self.state["retries"] = 044 self.state["reward"] = 0.045 46 # ── REWARD ────────────────────────────────────────────────────────────────47 48 def compute_reward(self) -> float:49 r = 0.050 if self.state["test_results"].get("passed"):51 r += 1.052 else:53 r -= 1.054 if self.state["security_flags"].get("secure"):55 r += 1.056 r -= 0.5 * self.state["retries"]57 self.state["reward"] = r58 return r59 60 def step(self, patched_code: str) -> dict:61 """Single environment step: apply → test → security → reward."""62 self.state["retries"] += 163 self.apply_patch(patched_code)64 test_result = self.run_tests()65 security_result = self.run_security_checks()66 reward = self.compute_reward()67 done = test_result.get("passed") and security_result.get("secure")68 return {69 "test_result": test_result,70 "security_result": security_result,71 "reward": reward,72 "done": done,73 "state": self.state,74 }75 