From 6db6c7b6ecd586b77c5e9f2a0cc2575e2bb09401 Mon Sep 17 00:00:00 2001 From: h Date: Fri, 23 Oct 2026 22:25:12 +0200 Subject: [PATCH] feat(jobs): t3code events go back to the dispatching conversation, quiet branches close at night --- beaver_agent/jobs/closing.py | 4 +++- beaver_agent/jobs/t3code.py | 9 +++++++-- tests/test_t3code_job.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 tests/test_t3code_job.py diff --git a/beaver_agent/jobs/closing.py b/beaver_agent/jobs/closing.py index 9f3bc32..aed97e7 100644 --- a/beaver_agent/jobs/closing.py +++ b/beaver_agent/jobs/closing.py @@ -1,4 +1,4 @@ -"""Ночью после ротации: глубокие чаты, тихие два дня, закрываются, не больше трёх.""" +"""Ночью после ротации: тихие глубокие чаты - с выжимкой, тихие ветки - молча.""" from __future__ import annotations @@ -21,3 +21,5 @@ async def close_idle(run: JobRun) -> None: result.digest.path if result.digest else None, result.error, ) + for branch in await run.close_quiet(kind="branch", days=3): + _log.info("closed quiet branch %s «%s»", branch.external_id, branch.title) diff --git a/beaver_agent/jobs/t3code.py b/beaver_agent/jobs/t3code.py index d76140f..aa37f93 100644 --- a/beaver_agent/jobs/t3code.py +++ b/beaver_agent/jobs/t3code.py @@ -1,4 +1,4 @@ -"""`POST /hooks/t3code`: тред завершился, упал или спрашивает - срочно в мастер.""" +"""`POST /hooks/t3code`: событие треда - срочно в разговор, который его запустил.""" from __future__ import annotations @@ -15,7 +15,12 @@ QUESTION_HINT = ( async def t3code_event(run: JobRun) -> None: - await run.inject_master(describe(run.payload), urgency="urgent", origin="t3code") + await run.inject_into( + run.payload.get("origin"), + describe(run.payload), + urgency="urgent", + origin="t3code", + ) def describe(p: dict[str, Any]) -> str: diff --git a/tests/test_t3code_job.py b/tests/test_t3code_job.py new file mode 100644 index 0000000..3a7b49c --- /dev/null +++ b/tests/test_t3code_job.py @@ -0,0 +1,33 @@ +from typing import Any + +from beaver_agent.jobs.t3code import t3code_event + + +class FakeRun: + def __init__(self, payload: dict[str, Any]) -> None: + self.payload = payload + self.injects: list[tuple[str | None, str, str, str]] = [] + + async def inject_into( + self, public_id: str | None, text: str, *, urgency: str, origin: str + ) -> bool: + self.injects.append((public_id, text, urgency, origin)) + return True + + +async def test_the_event_goes_to_the_conversation_that_dispatched() -> None: + run = FakeRun( + { + "event": "completed", + "thread_id": "t1", + "title": "lint", + "machine": "mac", + "project": "beaver", + "origin": "conv-7", + "text": "done", + } + ) + await t3code_event(run) # ty: ignore[invalid-argument-type] + [(target, text, urgency, origin)] = run.injects + assert (target, urgency, origin) == ("conv-7", "urgent", "t3code") + assert "завершён" in text and "done" in text