From 8be15d7df3f88ccbea129a6343c2ba1f34617196 Mon Sep 17 00:00:00 2001 From: banteg <4562643+banteg@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:42:03 +0400 Subject: [PATCH] feat: add backlog processing flag --- codex_telegram_bridge/readme.md | 9 +++++++++ .../src/codex_telegram_bridge/exec_bridge.py | 13 +++++++++++++ .../src/codex_telegram_bridge/mcp_bridge.py | 16 +++++++++++++++- .../src/codex_telegram_bridge/tmux_reply_bot.py | 16 +++++++++++++++- 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/codex_telegram_bridge/readme.md b/codex_telegram_bridge/readme.md index 32d2887..260a77c 100644 --- a/codex_telegram_bridge/readme.md +++ b/codex_telegram_bridge/readme.md @@ -43,6 +43,7 @@ Optional flags: - `--progress-edit-every FLOAT` (default `2.5`) - `--progress-silent/--no-progress-silent` (default silent) - `--final-notify/--no-final-notify` (default notify via new message) +- `--ignore-backlog/--process-backlog` (default ignore pending updates) ## Option 2: MCP server @@ -52,6 +53,10 @@ Run: uv run mcp-bridge ``` +Optional flags: + +- `--ignore-backlog/--process-backlog` (default ignore pending updates) + ## Option 3: tmux Reply injector: @@ -60,6 +65,10 @@ Reply injector: uv run tmux-reply ``` +Optional flags: + +- `--ignore-backlog/--process-backlog` (default ignore pending updates) + Notifier (call from your existing hook): ```bash diff --git a/codex_telegram_bridge/src/codex_telegram_bridge/exec_bridge.py b/codex_telegram_bridge/src/codex_telegram_bridge/exec_bridge.py index 10a183f..e16e922 100644 --- a/codex_telegram_bridge/src/codex_telegram_bridge/exec_bridge.py +++ b/codex_telegram_bridge/src/codex_telegram_bridge/exec_bridge.py @@ -279,6 +279,11 @@ def run( "--final-notify/--no-final-notify", help="Send the final response as a new message (not an edit).", ), + ignore_backlog: bool = typer.Option( + True, + "--ignore-backlog/--process-backlog", + help="Skip pending Telegram updates that arrived before startup.", + ), ) -> None: config = load_telegram_config() token = config_get(config, "bot_token") or "" @@ -327,6 +332,7 @@ def run( max_workers = None pool = ThreadPoolExecutor(max_workers=max_workers or 4) offset: Optional[int] = None + ignore_backlog = bool(ignore_backlog) log(f"[startup] pwd={startup_pwd}") log("Option1 bridge running (codex exec). Long-polling Telegram...") @@ -482,6 +488,13 @@ def run( time.sleep(2.0) continue + if ignore_backlog: + if updates: + offset = updates[-1]["update_id"] + 1 + log(f"[startup] drained {len(updates)} pending update(s)") + continue + ignore_backlog = False + for upd in updates: offset = upd["update_id"] + 1 msg = upd.get("message") or {} diff --git a/codex_telegram_bridge/src/codex_telegram_bridge/mcp_bridge.py b/codex_telegram_bridge/src/codex_telegram_bridge/mcp_bridge.py index 2e20bc2..149cd13 100644 --- a/codex_telegram_bridge/src/codex_telegram_bridge/mcp_bridge.py +++ b/codex_telegram_bridge/src/codex_telegram_bridge/mcp_bridge.py @@ -255,7 +255,13 @@ class MCPStdioClient: pass -def run() -> None: +def run( + ignore_backlog: bool = typer.Option( + True, + "--ignore-backlog/--process-backlog", + help="Skip pending Telegram updates that arrived before startup.", + ), +) -> None: config = load_telegram_config() token = config_get(config, "bot_token") or "" db_path = config_get(config, "bridge_db") or "./bridge_routes.sqlite3" @@ -289,6 +295,7 @@ def run() -> None: print(f"tools/list failed: {e}") offset: Optional[int] = None + ignore_backlog = bool(ignore_backlog) print("Option2 bridge running (codex mcp-server). Long-polling Telegram...") @@ -345,6 +352,13 @@ def run() -> None: time.sleep(2.0) continue + if ignore_backlog: + if updates: + offset = updates[-1]["update_id"] + 1 + print(f"[startup] drained {len(updates)} pending update(s)") + continue + ignore_backlog = False + for upd in updates: offset = upd["update_id"] + 1 msg = upd.get("message") or {} diff --git a/codex_telegram_bridge/src/codex_telegram_bridge/tmux_reply_bot.py b/codex_telegram_bridge/src/codex_telegram_bridge/tmux_reply_bot.py index 248862a..743490b 100644 --- a/codex_telegram_bridge/src/codex_telegram_bridge/tmux_reply_bot.py +++ b/codex_telegram_bridge/src/codex_telegram_bridge/tmux_reply_bot.py @@ -32,7 +32,13 @@ def tmux_send_text(target: str, text: str, press_enter: bool = True) -> None: subprocess.check_call(["tmux", "send-keys", "-t", target, "Enter"]) -def run() -> None: +def run( + ignore_backlog: bool = typer.Option( + True, + "--ignore-backlog/--process-backlog", + help="Skip pending Telegram updates that arrived before startup.", + ), +) -> None: config = load_telegram_config() token = config_get(config, "bot_token") or "" db_path = config_get(config, "bridge_db") or "./bridge_routes.sqlite3" @@ -42,6 +48,7 @@ def run() -> None: store = RouteStore(db_path) offset: Optional[int] = None + ignore_backlog = bool(ignore_backlog) print("Option3 reply bot running (tmux injector). Long-polling Telegram...") while True: @@ -52,6 +59,13 @@ def run() -> None: time.sleep(2.0) continue + if ignore_backlog: + if updates: + offset = updates[-1]["update_id"] + 1 + print(f"[startup] drained {len(updates)} pending update(s)") + continue + ignore_backlog = False + for upd in updates: offset = upd["update_id"] + 1 msg = upd.get("message") or {}