"""PhoneWork entry point: FastAPI app + Feishu long-connection client.""" from __future__ import annotations import asyncio import logging import uvicorn from fastapi import FastAPI from agent.manager import manager from bot.handler import start_websocket_client logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", ) logger = logging.getLogger(__name__) app = FastAPI(title="PhoneWork", version="0.1.0") @app.get("/health") async def health() -> dict: sessions = manager.list_sessions() return {"status": "ok", "active_sessions": len(sessions)} @app.get("/sessions") async def list_sessions() -> list: return manager.list_sessions() @app.on_event("startup") async def startup_event() -> None: # Start the session manager's idle-reaper await manager.start() # Start the Feishu WebSocket client in a background thread, # passing the running event loop so async work can be scheduled loop = asyncio.get_event_loop() start_websocket_client(loop) logger.info("PhoneWork started") @app.on_event("shutdown") async def shutdown_event() -> None: await manager.stop() logger.info("PhoneWork shut down") if __name__ == "__main__": uvicorn.run( "main:app", host="0.0.0.0", port=8000, reload=False, log_level="info", )