feat: Telegram V2 — inbound commands + actionable approve/reject from chat (#551)

* feat(telegram): V2 inbound — command router, actionable approve/reject keyboards, chat-gated poll loop

* fix(release,x,video,telegram): terminal-state guards on approve/reject; sender-identity check

* docs(map,rag): Telegram V2 inbound surfaces and terminal-state approve/reject guards

---------

Co-authored-by: Renn F <rennf93@users.noreply.github.com>
This commit is contained in:
Renzo F
2026-07-18 00:47:09 +02:00
committed by GitHub
co-authored by Renn F
parent c9c1f62981
commit 9fbec78126
30 changed files with 2732 additions and 68 deletions
@@ -284,7 +284,14 @@ async def test_notify_telegram_send_deferred_to_after_commit(
sent: list[str] = []
class _FakeTelegramClient:
async def send_message(self, text: str) -> TelegramSendResult:
async def send_message(
self,
text: str,
*,
reply_markup: dict | None = None,
reply_to_message_id: int | None = None,
) -> TelegramSendResult:
_ = (reply_markup, reply_to_message_id)
sent.append(text)
return TelegramSendResult(sent=True)
@@ -331,7 +338,14 @@ async def test_notify_telegram_rollback_drops_send(
sent: list[str] = []
class _FakeTelegramClient:
async def send_message(self, text: str) -> TelegramSendResult:
async def send_message(
self,
text: str,
*,
reply_markup: dict | None = None,
reply_to_message_id: int | None = None,
) -> TelegramSendResult:
_ = (reply_markup, reply_to_message_id)
sent.append(text)
return TelegramSendResult(sent=True)