diff --git a/bridge/whatsapp/index.js b/bridge/whatsapp/index.js index af17e71..1dbe004 100644 --- a/bridge/whatsapp/index.js +++ b/bridge/whatsapp/index.js @@ -113,7 +113,7 @@ async function startConnection() { // --- Express API --- const app = express(); -app.use(express.json()); +app.use(express.json({ limit: '50mb' })); app.get('/status', (_req, res) => { res.json({ diff --git a/config.json b/config.json index 6545c85..100f611 100644 --- a/config.json +++ b/config.json @@ -94,6 +94,9 @@ "Bash(scp *10.0.20.*)", "Bash(rsync *10.0.20.*)" ], + "discord": { + "email_webhook_url": "https://discord.com/api/webhooks/1496421990846697583/OM8z1eBsJC6-UB9-Zi5RkHP23NNv9UrEznRMx4Y3wSWOFmLazPoi-8_iEKMp0Qgsqr-m" + }, "ollama": { "url": "http://10.0.20.161:11434" }, diff --git a/cron/jobs.json b/cron/jobs.json index d708237..c6e6f20 100644 --- a/cron/jobs.json +++ b/cron/jobs.json @@ -37,9 +37,9 @@ "report_on": "changes", "timeout": 120, "enabled": true, - "last_run": null, - "last_status": null, - "next_run": null + "last_run": "2026-04-22T10:00:00.001000+00:00", + "last_status": "ok", + "next_run": "2026-04-22T16:00:00+00:00" }, { "name": "security-audit-daily", @@ -53,9 +53,9 @@ "report_on": "changes", "timeout": 180, "enabled": true, - "last_run": null, - "last_status": null, - "next_run": null + "last_run": "2026-04-22T03:00:00.003515+00:00", + "last_status": "error", + "next_run": "2026-04-23T03:00:00+00:00" }, { "name": "kb-index-refresh", @@ -69,9 +69,9 @@ "report_on": "never", "timeout": 120, "enabled": true, - "last_run": null, - "last_status": null, - "next_run": null + "last_run": "2026-04-22T03:30:00.003672+00:00", + "last_status": "ok", + "next_run": "2026-04-23T03:30:00+00:00" }, { "name": "archive-tasks-daily", @@ -85,9 +85,9 @@ "report_on": "changes", "timeout": 60, "enabled": true, - "last_run": null, - "last_status": null, - "next_run": null + "last_run": "2026-04-22T03:00:00.003110+00:00", + "last_status": "ok", + "next_run": "2026-04-23T03:00:00+00:00" }, { "name": "backup-config", @@ -101,9 +101,9 @@ "report_on": "never", "timeout": 120, "enabled": true, - "last_run": null, - "last_status": null, - "next_run": null + "last_run": "2026-04-22T02:00:00.001806+00:00", + "last_status": "ok", + "next_run": "2026-04-23T02:00:00+00:00" }, { "name": "insights-extract", @@ -269,8 +269,8 @@ "prompt": "Heartbeat check. Rulează src/heartbeat.py printr-un scurt raport de status.\nDacă nu e nimic de raportat (email=0, calendar nu are evenimente <2h, kb ok), răspunde doar cu HEARTBEAT_OK și oprește-te — nu trimite mesaj.\nDacă e ceva: raport scurt pe Discord #echo-work.", "allowed_tools": [], "enabled": true, - "last_run": "2026-04-21T13:00:00.002339+00:00", + "last_run": "2026-04-22T11:00:00.001844+00:00", "last_status": "ok", - "next_run": "2026-04-21T15:00:00+00:00" + "next_run": "2026-04-22T13:00:00+00:00" } ] diff --git a/dashboard/status.json b/dashboard/status.json index e0ce93d..7d0cfb2 100644 --- a/dashboard/status.json +++ b/dashboard/status.json @@ -10,33 +10,10 @@ "time": "30 Jan 2026, 22:00" }, "anaf": { - "ok": false, - "status": "MODIFICĂRI", - "message": "3 modificări detectate", - "lastCheck": "21 Apr 2026, 10:04", - "changesCount": 3, - "changes": [ - { - "name": "Declarația 100 - Obligații de plată la bugetul de stat", - "url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/100.html", - "summary": [ - "Soft J: 22.01.2026 → 07.04.2026" - ] - }, - { - "name": "Bilanț 31.12.2025 (S1002-S1005)", - "url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/situatiifinanciare/2025/1002_5_2025.html", - "summary": [ - "Pagina s-a modificat" - ] - }, - { - "name": "Situații financiare anuale 2025", - "url": "https://static.anaf.ro/static/10/Anaf/Declaratii_R/situatiifinanciare/2025/1030_2025.html", - "summary": [ - "Pagina s-a modificat" - ] - } - ] + "ok": true, + "status": "OK", + "message": "Nicio modificare detectată", + "lastCheck": "22 Apr 2026, 10:00", + "changesCount": 0 } } \ No newline at end of file diff --git a/tools/anaf-monitor/monitor.log b/tools/anaf-monitor/monitor.log index eae5aec..ce1c8f2 100644 --- a/tools/anaf-monitor/monitor.log +++ b/tools/anaf-monitor/monitor.log @@ -916,3 +916,29 @@ [2026-04-21 10:04:32] HASH CHANGED in SIT_FIN_AN_2025 (no version changes detected) [2026-04-21 10:04:32] OK: DESCARCARE_DECLARATII [2026-04-21 10:04:32] === Monitor complete === +[2026-04-21 16:00:00] === Starting ANAF monitor v2.1 === +[2026-04-21 16:00:00] OK: D100 +[2026-04-21 16:00:00] OK: D101 +[2026-04-21 16:00:00] OK: D300 +[2026-04-21 16:00:00] OK: D390 +[2026-04-21 16:00:00] OK: D394 +[2026-04-21 16:00:00] OK: D205 +[2026-04-21 16:00:01] OK: D406 +[2026-04-21 16:00:01] OK: BILANT_2025 +[2026-04-21 16:00:01] OK: SIT_FIN_SEM_2025 +[2026-04-21 16:00:01] OK: SIT_FIN_AN_2025 +[2026-04-21 16:00:01] OK: DESCARCARE_DECLARATII +[2026-04-21 16:00:01] === Monitor complete === +[2026-04-22 10:00:00] === Starting ANAF monitor v2.1 === +[2026-04-22 10:00:00] OK: D100 +[2026-04-22 10:00:00] OK: D101 +[2026-04-22 10:00:00] OK: D300 +[2026-04-22 10:00:03] OK: D390 +[2026-04-22 10:00:03] OK: D394 +[2026-04-22 10:00:03] OK: D205 +[2026-04-22 10:00:03] OK: D406 +[2026-04-22 10:00:04] OK: BILANT_2025 +[2026-04-22 10:00:04] OK: SIT_FIN_SEM_2025 +[2026-04-22 10:00:04] OK: SIT_FIN_AN_2025 +[2026-04-22 10:00:04] OK: DESCARCARE_DECLARATII +[2026-04-22 10:00:04] === Monitor complete === diff --git a/tools/email_digest.py b/tools/email_digest.py index c212777..e015652 100644 --- a/tools/email_digest.py +++ b/tools/email_digest.py @@ -88,6 +88,25 @@ def send_whatsapp(to: str, text: str) -> bool: return False +def send_discord_webhook(text: str) -> bool: + """Trimite mesaj pe Discord via webhook (max 2000 chars per mesaj).""" + config = Config(PROJECT_ROOT / "config.json") + url = config.get("discord.email_webhook_url", "") + if not url: + return False + try: + chunks = [text[i:i+2000] for i in range(0, len(text), 2000)] + for chunk in chunks: + resp = requests.post(url, json={"content": chunk}, timeout=15) + if resp.status_code not in (200, 204): + print(f"[discord webhook] status {resp.status_code}", file=sys.stderr) + return False + return True + except Exception as e: + print(f"[discord webhook eroare] {e}", file=sys.stderr) + return False + + def send_whatsapp_document(to: str, filepath: str) -> bool: """Trimite un fișier ca document WhatsApp prin bridge.""" try: @@ -145,6 +164,12 @@ def run_digest(): else: print(f"❌ Trimitere eșuată: {subject}") + ok_dc = send_discord_webhook(summary) + if ok_dc: + print(f"✅ Trimis pe Discord: {subject}") + else: + print(f"❌ Discord eșuat: {subject}") + for att_path in attachment_paths: ok_att = send_whatsapp_document(owner_jid, att_path) name = Path(att_path).name diff --git a/tools/email_forward.py b/tools/email_forward.py index f8f290c..a03998e 100644 --- a/tools/email_forward.py +++ b/tools/email_forward.py @@ -117,6 +117,25 @@ def send_whatsapp(to: str, text: str) -> bool: return False +def send_discord_webhook(text: str) -> bool: + """Trimite mesaj pe Discord via webhook (max 2000 chars per mesaj).""" + config = Config(PROJECT_ROOT / "config.json") + url = config.get("discord.email_webhook_url", "") + if not url: + return False + try: + chunks = [text[i:i+2000] for i in range(0, len(text), 2000)] + for chunk in chunks: + resp = requests.post(url, json={"content": chunk}, timeout=15) + if resp.status_code not in (200, 204): + print(f"[discord webhook] status {resp.status_code}", file=sys.stderr) + return False + return True + except Exception as e: + print(f"[discord webhook eroare] {e}", file=sys.stderr) + return False + + def send_whatsapp_document(to: str, filename: str, data: bytes) -> bool: try: mimetype = mimetypes.guess_type(filename)[0] or "application/octet-stream" @@ -212,6 +231,13 @@ def run_forward(): else: print(f"Trimis pe WhatsApp ({len(parts)} mesaje): {subject}") + full_text = "\n".join(parts) + ok_dc = send_discord_webhook(full_text) + if ok_dc: + print(f"Trimis pe Discord: {subject}") + else: + print(f"Discord eșuat: {subject}") + for fname, fdata in em.get('attachment_data', {}).items(): ok_att = send_whatsapp_document(owner_jid, fname, fdata) if ok_att: