"""Project-owned Uvicorn launcher with a parent-process control pipe. Closing stdin requests a normal lifespan shutdown on Windows and macOS alike. There is no HTTP shutdown endpoint and no lookup of unrelated processes. """ from __future__ import annotations import argparse import os import sys import threading import uvicorn def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--port", type=int, default=8810) args = parser.parse_args() server = uvicorn.Server(uvicorn.Config("apps.server.main:app", host="127.0.0.1", port=args.port, timeout_graceful_shutdown=8)) def watch_parent() -> None: try: # os.read avoids a daemon thread holding Python's buffered stdin lock # during interpreter shutdown. Any parent message or EOF means stop. os.read(sys.stdin.fileno(), 1024) except OSError: pass server.should_exit = True threading.Thread(target=watch_parent, name="assistant-parent-pipe", daemon=True).start() server.run() if __name__ == "__main__": main()