"""Entry point del Runtime servidor. Uso: uv run vms-runtime-server --vmsproj path/to/project.vmsproj uv run vms-runtime-server (genera proyecto demo y arranca) Sin --vmsproj genera el proyecto demo de Sprint 0 y arranca el servidor con simulator-driver para que puedas probar el cliente y la API. """ from __future__ import annotations import argparse import logging import sys from pathlib import Path def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser(prog="vms-runtime-server") parser.add_argument( "--vmsproj", type=Path, default=None, help="Ruta al .vmsproj a cargar. Default: genera proyecto demo Sprint 0.", ) parser.add_argument("--host", default="127.0.0.1") parser.add_argument("--port", type=int, default=8765) parser.add_argument("--db", type=Path, default=None, help="Historian DuckDB (default: in-memory)") parser.add_argument("--verbose", action="store_true") args = parser.parse_args(argv) from vmssailor.shared.logging_setup import setup_logging setup_logging(verbose=args.verbose) log = logging.getLogger("vms-runtime-server") if args.vmsproj: from vmssailor.core.persistence import load_project project = load_project(args.vmsproj) log.info("Loaded project from %s", args.vmsproj) else: from vmssailor.tools.generate_test_project import build_demo_project project = build_demo_project() log.info("No --vmsproj — using built-in demo project") from vmssailor.runtime.server.api import create_app from vmssailor.runtime.server.runtime_app import build_runtime runtime = build_runtime(project, historian_db=args.db) app = create_app(runtime) import uvicorn uvicorn.run(app, host=args.host, port=args.port, log_level="info" if args.verbose else "warning") return 0 if __name__ == "__main__": sys.exit(main())