"""HTTP server for running the code-review environment in a Space/container.""" from __future__ import annotations import os from threading import Lock from typing import Any, Dict from flask import Flask, jsonify, request from environment.env import CodeReviewEnv app = Flask(__name__) _env = CodeReviewEnv() _lock = Lock() @app.get("/") def root() -> Any: return jsonify({ "status": "ok", "service": "code-review-agent-env", "endpoints": ["/health", "/reset", "/step", "/state"], }) @app.get("/health") def health() -> Any: return jsonify({"status": "healthy"}) @app.route("/reset", methods=["GET", "POST"]) def reset() -> Any: payload: Dict[str, Any] = request.get_json(silent=True) or {} task_id = payload.get("task_id") or request.args.get("task_id") with _lock: obs = _env.reset(task_id=task_id) return jsonify({"observation": obs}) @app.post("/step") def step() -> Any: payload = request.get_json(silent=True) or {} action = payload.get("action") if not isinstance(action, dict): return jsonify({"error": "Request body must include an 'action' object"}), 400 with _lock: observation, reward, done, info = _env.step(action) return jsonify( { "observation": observation, "reward": reward, "done": done, "info": info, } ) @app.get("/state") def state() -> Any: with _lock: current_state = _env.state() return jsonify(current_state) def main() -> None: host = os.getenv("HOST", "0.0.0.0") port = int(os.getenv("PORT", "7860")) app.run(host=host, port=port) if __name__ == "__main__": main()