DEFAULT_PORT = 8091 THINKING_FAILURE_KEYWORDS = ["⚠️", "🛑", "失败", "错误", "异常", "终止", "error", "failed", "未完成", "超时", "强制"] CSRF_HEADER_NAME = "X-CSRF-Token" CSRF_SESSION_KEY = "_csrf_token" CSRF_SAFE_METHODS = {"GET", "HEAD", "OPTIONS", "TRACE"} CSRF_PROTECTED_PATHS = {"/login", "/register", "/logout"} CSRF_PROTECTED_PREFIXES = ("/api/",) CSRF_EXEMPT_PATHS = {"/api/csrf-token"} FAILED_LOGIN_LIMIT = 5 FAILED_LOGIN_LOCK_SECONDS = 300 SOCKET_TOKEN_TTL_SECONDS = 45 PROJECT_STORAGE_CACHE: Dict[str, Dict[str, Any]] = {} PROJECT_STORAGE_CACHE_TTL_SECONDS = float(os.environ.get("PROJECT_STORAGE_CACHE_TTL", "30")) USER_IDLE_TIMEOUT_SECONDS = int(os.environ.get("USER_IDLE_TIMEOUT_SECONDS", "900")) LAST_ACTIVE_FILE = Path(LOGS_DIR).expanduser().resolve() / "last_active.json" _last_active_lock = threading.Lock() _last_active_cache: Dict[str, float] = {} _idle_reaper_started = False TITLE_PROMPT_PATH = PROJECT_ROOT / "prompts" / "title_generation_prompt.txt"