添加项目基础文件和目录结构,包括: - 初始化空包目录(bot/agent/orchestrator) - 配置文件(config.py)和示例(keyring.example.yaml) - 依赖文件(requirements.txt) - 主程序入口(main.py) - 调试脚本(debug_test.py) - 文档说明(README.md) - Git忽略文件(.gitignore) - 核心功能模块(pty_process/manager/handler/feishu等)
60 lines
1.3 KiB
Python
60 lines
1.3 KiB
Python
"""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",
|
|
)
|