#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ loop.py — cloud runner for confluence-agent on Hugging Face Spaces (Docker). - HF ke liye ek chhota health-check HTTP server PORT (7860) pe (warna Space "running" nahi maana jata). - Phir har CYCLE_SECONDS (default 900 = 15m) pe agent.main() chalata hai (Telegram alerts). Har cycle exception-safe; ek cycle fail ho to agla normally chalega. Telegram creds env se: TG_TOKEN, TG_CHAT_ID (Space secrets). """ import os import time import threading import traceback from datetime import datetime, timezone from http.server import BaseHTTPRequestHandler, HTTPServer import agent # agent.py (same dir) INTERVAL = int(os.getenv("CYCLE_SECONDS", "900")) # 15 min PORT = int(os.getenv("PORT", "7860")) _last = {"ts": None, "ok": None} class Ping(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-Type", "text/plain") self.end_headers() msg = f"confluence-agent running\nlast_cycle={_last['ts']} ok={_last['ok']}\n" self.wfile.write(msg.encode()) def log_message(self, *args): pass def start_http(): HTTPServer(("0.0.0.0", PORT), Ping).serve_forever() def main(): threading.Thread(target=start_http, daemon=True).start() print(f"[loop] health server on :{PORT}; cycle every {INTERVAL}s", flush=True) while True: t0 = time.time() try: agent.main() _last["ok"] = True except Exception: _last["ok"] = False print("[loop] CYCLE ERROR:\n" + traceback.format_exc(), flush=True) _last["ts"] = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M UTC") dt = time.time() - t0 sleep_s = max(30, INTERVAL - dt) print(f"[loop] cycle took {dt:.0f}s; sleeping {sleep_s:.0f}s", flush=True) time.sleep(sleep_s) if __name__ == "__main__": main()