fix(discord-bridge): zgomot in bot.log si doua tipuri de stream necunoscute

Trei lucruri observate in logurile de productie dupa restartul precedent.

1. Ecoul propriilor mesaje umplea bot.log cu WARNING. Propriile mesaje au si
   ele `author.bot == True`, iar verificarea generica de bot venea INAINTEA
   celei pe `self_id` — deci raspunsurile botului se jurnalizau ca "bot
   strain", la fiecare mesaj. Verificarea pe `self_id` trece prima (motivul e
   acum precis), iar refuzurile de rutina — propriile mesaje si ceilalti boti —
   merg la DEBUG. Guild / canal / utilizator strain si webhook raman WARNING:
   alea chiar sunt semnal de securitate si erau inecate in zgomot.

2. `tool_progress` (heartbeat la 30s cat timp o unealta ruleaza) devine
   eveniment `ToolProgress`. Mesajul live arata acum "⏳ ruleaza de 2m30s" sub
   unealta curenta — singurul semn ca un tur lung lucreaza si nu a inghetat.

3. `rate_limit_event` devine eveniment `RateLimit` si apare in `/status` la
   randul `utilizare`. Cum nu exista plafon de cost (abonament, nu API),
   fereastra de utilizare e singura limita reala; se avertizeaza in log o data
   per schimbare de stare, nu la fiecare eveniment.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B29CApsP1JkSdjYaGaHpE7
This commit is contained in:
Claude Agent
2026-08-31 07:46:51 +00:00
parent 1cc1a572d9
commit a89cf201ab
6 changed files with 243 additions and 8 deletions

View File

@@ -64,11 +64,11 @@ def test_result_de_eroare_marcat():
def test_tip_necunoscut_logat_o_singura_data():
calls = []
p = P(version_fn=lambda: (calls.append(1), "2.1.251")[1])
line = json.dumps({"type": "rate_limit_event", "detail": "x"})
line = json.dumps({"type": "tip_care_nu_exista", "detail": "x"})
assert p.feed_line(line) == []
assert p.feed_line(line) == []
assert p.feed_line(json.dumps({"type": "alt_tip_nou"})) == []
assert p.unknown_types == {"rate_limit_event", "alt_tip_nou"}
assert p.unknown_types == {"tip_care_nu_exista", "alt_tip_nou"}
assert len(calls) == 2 # o data per tip, nu per linie
@@ -120,3 +120,54 @@ async def test_aiter_accepta_bytes_si_gunoi():
b'{"type":"result","total_cost_usd":0.5}\n',
]))]
assert len(evs) == 1 and evs[0].total_cost_usd == 0.5
# ------------------------------------------ tool_progress si rate_limit_event
# Ambele apareau in bot.log ca "tip necunoscut ignorat" (claude 2.1.251).
def test_tool_progress_devine_eveniment():
p = P()
ev = p.feed_line(json.dumps({
"type": "tool_progress",
"tool_use_id": "toolu_01-heartbeat-0",
"tool_name": "Bash",
"parent_tool_use_id": "toolu_01",
"elapsed_time_seconds": 30,
"heartbeat": True,
}))[0]
assert isinstance(ev, stream.ToolProgress)
assert (ev.tool_name, ev.elapsed_s, ev.heartbeat) == ("Bash", 30, True)
assert p.unknown_types == set()
def test_tool_progress_cu_campuri_aiurea_nu_arunca():
p = P()
ev = p.feed_line(json.dumps({"type": "tool_progress", "elapsed_time_seconds": "x"}))[0]
assert (ev.tool_name, ev.elapsed_s, ev.heartbeat) == ("?", 0, False)
def test_rate_limit_event_devine_eveniment():
p = P()
ev = p.feed_line(json.dumps({
"type": "rate_limit_event",
"rate_limit_info": {
"status": "allowed", "resetsAt": 1788171600,
"rateLimitType": "five_hour", "overageStatus": "rejected",
},
}))[0]
assert isinstance(ev, stream.RateLimit)
assert ev.ok and ev.limit_type == "five_hour" and ev.resets_at == 1788171600
assert p.unknown_types == set()
def test_rate_limit_event_franat_nu_e_ok():
p = P()
ev = p.feed_line(json.dumps(
{"type": "rate_limit_event", "rate_limit_info": {"status": "rejected"}}))[0]
assert not ev.ok and ev.status == "rejected"
def test_rate_limit_event_fara_info_nu_arunca():
p = P()
ev = p.feed_line(json.dumps({"type": "rate_limit_event"}))[0]
assert not ev.ok and ev.status == "necunoscut" and ev.resets_at == 0