from __future__ import annotations import argparse import json import os from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path from urllib.parse import urlparse from llm import llm_status from report import build_report PROJECT_ROOT = Path(__file__).resolve().parents[1] WEB_ROOT = PROJECT_ROOT / "web" class TideHandler(SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory=str(WEB_ROOT), **kwargs) def do_GET(self) -> None: route = urlparse(self.path).path if route == "/healthz": self._json_response( { "status": "ok", "service": "tide-api", "llm": llm_status(PROJECT_ROOT / ".env"), } ) return super().do_GET() def do_POST(self) -> None: route = urlparse(self.path).path if route != "/api/report": self.send_error(404, "Unknown route") return try: length = int(self.headers.get("content-length", "0")) payload = self.rfile.read(length) form_data = json.loads(payload.decode("utf-8")) report = build_report(form_data, PROJECT_ROOT) except Exception as exc: # Keep local MVP errors visible to the browser. self._json_response({"ok": False, "error": str(exc)}, status=500) return self._json_response(report) def log_message(self, format: str, *args) -> None: print(f"{self.address_string()} - {format % args}") def _json_response(self, payload: dict, status: int = 200) -> None: body = json.dumps(payload, indent=2).encode("utf-8") self.send_response(status) self.send_header("content-type", "application/json; charset=utf-8") self.send_header("cache-control", "no-store") self.send_header("x-content-type-options", "nosniff") self.send_header("content-length", str(len(body))) self.end_headers() self.wfile.write(body) def main() -> None: parser = argparse.ArgumentParser(description="Run the TIDE form MVP server.") parser.add_argument("--host", default=os.getenv("TIDE_HOST", "127.0.0.1")) parser.add_argument("--port", type=int, default=int(os.getenv("PORT", "8000"))) args = parser.parse_args() server = ThreadingHTTPServer((args.host, args.port), TideHandler) print(f"TIDE form MVP running at http://{args.host}:{args.port}") server.serve_forever() if __name__ == "__main__": main()