Compare commits
5 Commits
b9a5f733c2
...
1b2b37a6bb
| Author | SHA1 | Date | |
|---|---|---|---|
| 1b2b37a6bb | |||
| 277a43b81f | |||
| 04d49e7ea3 | |||
| 537bab465c | |||
| 0c02f0de50 |
@@ -37,9 +37,9 @@
|
|||||||
"report_on": "changes",
|
"report_on": "changes",
|
||||||
"timeout": 120,
|
"timeout": 120,
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"last_run": "2026-04-22T16:00:00.001042+00:00",
|
"last_run": "2026-04-23T16:00:00.001018+00:00",
|
||||||
"last_status": "ok",
|
"last_status": "ok",
|
||||||
"next_run": "2026-04-23T10:00:00+00:00"
|
"next_run": "2026-04-24T10:00:00+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "security-audit-daily",
|
"name": "security-audit-daily",
|
||||||
@@ -263,14 +263,14 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "heartbeat-2h",
|
"name": "heartbeat-2h",
|
||||||
"cron": "0 7-23/2 * * *",
|
"cron": "0 6-18/2 * * *",
|
||||||
"channel": "echo-work",
|
"channel": "echo-work",
|
||||||
"model": "sonnet",
|
"model": "sonnet",
|
||||||
"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.",
|
"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": [],
|
"allowed_tools": [],
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"last_run": "2026-04-23T09:00:00.001275+00:00",
|
"last_run": "2026-04-23T21:00:00.000995+00:00",
|
||||||
"last_status": "ok",
|
"last_status": "ok",
|
||||||
"next_run": "2026-04-23T11:00:00+00:00"
|
"next_run": "2026-04-23T23:00:00+00:00"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"last_sent": 14,
|
"last_sent": 15,
|
||||||
"year": 2026,
|
"year": 2026,
|
||||||
"last_sent_at": "2026-04-09T14:23:55.586085+00:00"
|
"last_sent_at": "2026-04-23T14:10:50.295027+00:00"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"ok": true,
|
"ok": true,
|
||||||
"status": "OK",
|
"status": "OK",
|
||||||
"message": "Nicio modificare detectată",
|
"message": "Nicio modificare detectată",
|
||||||
"lastCheck": "22 Apr 2026, 16:00",
|
"lastCheck": "23 Apr 2026, 16:00",
|
||||||
"changesCount": 0
|
"changesCount": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
31
src/main.py
31
src/main.py
@@ -83,37 +83,6 @@ def main():
|
|||||||
scheduler = Scheduler(send_callback=_send_to_channel, config=config)
|
scheduler = Scheduler(send_callback=_send_to_channel, config=config)
|
||||||
client.scheduler = scheduler # type: ignore[attr-defined]
|
client.scheduler = scheduler # type: ignore[attr-defined]
|
||||||
|
|
||||||
# Heartbeat: register as periodic job if enabled
|
|
||||||
hb_config = config.get("heartbeat", {})
|
|
||||||
if hb_config.get("enabled"):
|
|
||||||
from src.heartbeat import run_heartbeat
|
|
||||||
|
|
||||||
interval_min = hb_config.get("interval_minutes", 30)
|
|
||||||
hb_channel = hb_config.get("channel", "echo-core")
|
|
||||||
|
|
||||||
async def _heartbeat_tick() -> None:
|
|
||||||
"""Run heartbeat and send findings to channel."""
|
|
||||||
try:
|
|
||||||
result = await asyncio.to_thread(run_heartbeat, config)
|
|
||||||
logger.info("Heartbeat: %s", result)
|
|
||||||
if result and "HEARTBEAT_OK" not in result:
|
|
||||||
await _send_to_channel(hb_channel, result)
|
|
||||||
except Exception as exc:
|
|
||||||
logger.error("Heartbeat failed: %s", exc)
|
|
||||||
|
|
||||||
from apscheduler.triggers.interval import IntervalTrigger
|
|
||||||
|
|
||||||
scheduler._scheduler.add_job(
|
|
||||||
_heartbeat_tick,
|
|
||||||
trigger=IntervalTrigger(minutes=interval_min),
|
|
||||||
id="__heartbeat__",
|
|
||||||
max_instances=1,
|
|
||||||
)
|
|
||||||
logger.info(
|
|
||||||
"Heartbeat registered (every %d min, channel: %s)",
|
|
||||||
interval_min, hb_channel,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Newsletter Cercetași checker (optional)
|
# Newsletter Cercetași checker (optional)
|
||||||
newsletter_config = config.get("newsletter_cercetasi", {})
|
newsletter_config = config.get("newsletter_cercetasi", {})
|
||||||
if newsletter_config.get("enabled"):
|
if newsletter_config.get("enabled"):
|
||||||
|
|||||||
@@ -374,7 +374,7 @@ class Scheduler:
|
|||||||
self._save_jobs()
|
self._save_jobs()
|
||||||
|
|
||||||
# Send output via callback if we have something to send
|
# Send output via callback if we have something to send
|
||||||
if result_text and self._send_callback:
|
if result_text and "HEARTBEAT_OK" not in result_text and self._send_callback:
|
||||||
try:
|
try:
|
||||||
await self._send_callback(job["channel"], result_text)
|
await self._send_callback(job["channel"], result_text)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
@@ -393,6 +393,7 @@ class Scheduler:
|
|||||||
CLAUDE_BIN, "-p", job["prompt"],
|
CLAUDE_BIN, "-p", job["prompt"],
|
||||||
"--model", job["model"],
|
"--model", job["model"],
|
||||||
"--output-format", "json",
|
"--output-format", "json",
|
||||||
|
"--dangerously-skip-permissions",
|
||||||
]
|
]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -955,3 +955,29 @@
|
|||||||
[2026-04-22 16:00:01] OK: SIT_FIN_AN_2025
|
[2026-04-22 16:00:01] OK: SIT_FIN_AN_2025
|
||||||
[2026-04-22 16:00:01] OK: DESCARCARE_DECLARATII
|
[2026-04-22 16:00:01] OK: DESCARCARE_DECLARATII
|
||||||
[2026-04-22 16:00:01] === Monitor complete ===
|
[2026-04-22 16:00:01] === Monitor complete ===
|
||||||
|
[2026-04-23 10:00:00] === Starting ANAF monitor v2.1 ===
|
||||||
|
[2026-04-23 10:00:00] OK: D100
|
||||||
|
[2026-04-23 10:00:00] OK: D101
|
||||||
|
[2026-04-23 10:00:00] OK: D300
|
||||||
|
[2026-04-23 10:00:00] OK: D390
|
||||||
|
[2026-04-23 10:00:00] OK: D394
|
||||||
|
[2026-04-23 10:00:00] OK: D205
|
||||||
|
[2026-04-23 10:00:00] OK: D406
|
||||||
|
[2026-04-23 10:00:01] OK: BILANT_2025
|
||||||
|
[2026-04-23 10:00:01] OK: SIT_FIN_SEM_2025
|
||||||
|
[2026-04-23 10:00:01] OK: SIT_FIN_AN_2025
|
||||||
|
[2026-04-23 10:00:01] OK: DESCARCARE_DECLARATII
|
||||||
|
[2026-04-23 10:00:01] === Monitor complete ===
|
||||||
|
[2026-04-23 16:00:00] === Starting ANAF monitor v2.1 ===
|
||||||
|
[2026-04-23 16:00:00] OK: D100
|
||||||
|
[2026-04-23 16:00:00] OK: D101
|
||||||
|
[2026-04-23 16:00:00] OK: D300
|
||||||
|
[2026-04-23 16:00:00] OK: D390
|
||||||
|
[2026-04-23 16:00:00] OK: D394
|
||||||
|
[2026-04-23 16:00:00] OK: D205
|
||||||
|
[2026-04-23 16:00:01] OK: D406
|
||||||
|
[2026-04-23 16:00:01] OK: BILANT_2025
|
||||||
|
[2026-04-23 16:00:01] OK: SIT_FIN_SEM_2025
|
||||||
|
[2026-04-23 16:00:01] OK: SIT_FIN_AN_2025
|
||||||
|
[2026-04-23 16:00:01] OK: DESCARCARE_DECLARATII
|
||||||
|
[2026-04-23 16:00:01] === Monitor complete ===
|
||||||
|
|||||||
Reference in New Issue
Block a user