From 5f4f97f529d2cd793c045b251b5a9c812ec04bf1 Mon Sep 17 00:00:00 2001 From: banteg <4562643+banteg@users.noreply.github.com> Date: Sun, 28 Dec 2025 21:29:34 +0400 Subject: [PATCH] feat: package codex telegram bridge with uv entrypoints --- codex/codex_telegram_bridge/pyproject.toml | 27 +++++++++++++++++++ codex/codex_telegram_bridge/readme.md | 20 +++++++------- .../src/codex_telegram_bridge/__init__.py | 2 ++ .../codex_telegram_bridge}/bridge_common.py | 0 .../codex_telegram_bridge}/exec_bridge.py | 2 +- .../codex_telegram_bridge}/mcp_bridge.py | 2 +- .../codex_telegram_bridge}/tmux_notify.py | 2 +- .../codex_telegram_bridge}/tmux_reply_bot.py | 2 +- 8 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 codex/codex_telegram_bridge/pyproject.toml create mode 100644 codex/codex_telegram_bridge/src/codex_telegram_bridge/__init__.py rename codex/codex_telegram_bridge/{ => src/codex_telegram_bridge}/bridge_common.py (100%) rename codex/codex_telegram_bridge/{ => src/codex_telegram_bridge}/exec_bridge.py (99%) rename codex/codex_telegram_bridge/{ => src/codex_telegram_bridge}/mcp_bridge.py (99%) rename codex/codex_telegram_bridge/{ => src/codex_telegram_bridge}/tmux_notify.py (95%) rename codex/codex_telegram_bridge/{ => src/codex_telegram_bridge}/tmux_reply_bot.py (99%) diff --git a/codex/codex_telegram_bridge/pyproject.toml b/codex/codex_telegram_bridge/pyproject.toml new file mode 100644 index 0000000..3c61c05 --- /dev/null +++ b/codex/codex_telegram_bridge/pyproject.toml @@ -0,0 +1,27 @@ +[project] +name = "codex-telegram-bridge" +version = "0.1.0" +description = "Telegram bridge tools for Codex." +readme = "readme.md" +requires-python = ">=3.10" +dependencies = [ + "markdown-it-py", + "sulguk", + "tomli; python_version < '3.11'", +] + +[project.scripts] +codex-telegram-exec-bridge = "codex_telegram_bridge.exec_bridge:main" +codex-telegram-mcp-bridge = "codex_telegram_bridge.mcp_bridge:main" +codex-telegram-tmux-notify = "codex_telegram_bridge.tmux_notify:main" +codex-telegram-tmux-reply = "codex_telegram_bridge.tmux_reply_bot:main" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.wheel] +packages = ["src/codex_telegram_bridge"] + +[tool.hatch.build.targets.sdist] +include = ["src/codex_telegram_bridge", "readme.md"] diff --git a/codex/codex_telegram_bridge/readme.md b/codex/codex_telegram_bridge/readme.md index 92d088e..052fecc 100644 --- a/codex/codex_telegram_bridge/readme.md +++ b/codex/codex_telegram_bridge/readme.md @@ -11,7 +11,7 @@ All options store a mapping from `(chat_id, bot_message_id)` to a route so repli ## Install 1. Ensure `uv` is installed. -2. Use the scripts in this folder as-is; `uv run` will install the inline dependencies. +2. From this folder, run the entrypoints with `uv run` (uses `pyproject.toml` deps). 3. Put your Telegram credentials in `~/.codex/telegram.toml`. Example `~/.codex/telegram.toml`: @@ -35,7 +35,7 @@ Optional keys (by mode): Run: ```bash -uv run exec_bridge.py +uv run codex-telegram-exec-bridge ``` ## Option 2: MCP server @@ -43,7 +43,7 @@ uv run exec_bridge.py Run: ```bash -uv run mcp_bridge.py +uv run codex-telegram-mcp-bridge ``` ## Option 3: tmux @@ -51,21 +51,21 @@ uv run mcp_bridge.py Reply injector: ```bash -uv run tmux_reply_bot.py +uv run codex-telegram-tmux-reply ``` Notifier (call from your existing hook): ```bash -uv run tmux_notify.py --tmux-target "codex1:0.0" --text "$TURN_TEXT" +uv run codex-telegram-tmux-notify --tmux-target "codex1:0.0" --text "$TURN_TEXT" ``` Add `--chat-id` if `chat_id` is not set in `~/.codex/telegram.toml`. ## Files -- `bridge_common.py`: shared Telegram client, chunking, and routing store -- `exec_bridge.py`: codex exec + resume bridge -- `mcp_bridge.py`: MCP stdio JSON-RPC bridge -- `tmux_notify.py`: tmux notifier helper -- `tmux_reply_bot.py`: tmux reply injector +- `src/codex_telegram_bridge/bridge_common.py`: shared Telegram client, chunking, and routing store +- `src/codex_telegram_bridge/exec_bridge.py`: codex exec + resume bridge +- `src/codex_telegram_bridge/mcp_bridge.py`: MCP stdio JSON-RPC bridge +- `src/codex_telegram_bridge/tmux_notify.py`: tmux notifier helper +- `src/codex_telegram_bridge/tmux_reply_bot.py`: tmux reply injector diff --git a/codex/codex_telegram_bridge/src/codex_telegram_bridge/__init__.py b/codex/codex_telegram_bridge/src/codex_telegram_bridge/__init__.py new file mode 100644 index 0000000..7b8fe38 --- /dev/null +++ b/codex/codex_telegram_bridge/src/codex_telegram_bridge/__init__.py @@ -0,0 +1,2 @@ +"""Telegram Codex bridge package.""" + diff --git a/codex/codex_telegram_bridge/bridge_common.py b/codex/codex_telegram_bridge/src/codex_telegram_bridge/bridge_common.py similarity index 100% rename from codex/codex_telegram_bridge/bridge_common.py rename to codex/codex_telegram_bridge/src/codex_telegram_bridge/bridge_common.py diff --git a/codex/codex_telegram_bridge/exec_bridge.py b/codex/codex_telegram_bridge/src/codex_telegram_bridge/exec_bridge.py similarity index 99% rename from codex/codex_telegram_bridge/exec_bridge.py rename to codex/codex_telegram_bridge/src/codex_telegram_bridge/exec_bridge.py index 5ed8c30..18613a9 100644 --- a/codex/codex_telegram_bridge/exec_bridge.py +++ b/codex/codex_telegram_bridge/src/codex_telegram_bridge/exec_bridge.py @@ -14,7 +14,7 @@ import time from concurrent.futures import ThreadPoolExecutor from typing import Any, Callable, Dict, Optional, Tuple -from bridge_common import ( +from .bridge_common import ( TelegramClient, RouteStore, TELEGRAM_HARD_LIMIT, diff --git a/codex/codex_telegram_bridge/mcp_bridge.py b/codex/codex_telegram_bridge/src/codex_telegram_bridge/mcp_bridge.py similarity index 99% rename from codex/codex_telegram_bridge/mcp_bridge.py rename to codex/codex_telegram_bridge/src/codex_telegram_bridge/mcp_bridge.py index 088b463..db0433a 100644 --- a/codex/codex_telegram_bridge/mcp_bridge.py +++ b/codex/codex_telegram_bridge/src/codex_telegram_bridge/mcp_bridge.py @@ -13,7 +13,7 @@ import time from queue import Queue, Empty from typing import Any, Dict, List, Optional, Tuple -from bridge_common import ( +from .bridge_common import ( TelegramClient, RouteStore, config_get, diff --git a/codex/codex_telegram_bridge/tmux_notify.py b/codex/codex_telegram_bridge/src/codex_telegram_bridge/tmux_notify.py similarity index 95% rename from codex/codex_telegram_bridge/tmux_notify.py rename to codex/codex_telegram_bridge/src/codex_telegram_bridge/tmux_notify.py index 5c38448..1f5378e 100644 --- a/codex/codex_telegram_bridge/tmux_notify.py +++ b/codex/codex_telegram_bridge/src/codex_telegram_bridge/tmux_notify.py @@ -9,7 +9,7 @@ import argparse import sys from typing import Optional -from bridge_common import TelegramClient, RouteStore, config_get, load_telegram_config +from .bridge_common import TelegramClient, RouteStore, config_get, load_telegram_config def main() -> None: diff --git a/codex/codex_telegram_bridge/tmux_reply_bot.py b/codex/codex_telegram_bridge/src/codex_telegram_bridge/tmux_reply_bot.py similarity index 99% rename from codex/codex_telegram_bridge/tmux_reply_bot.py rename to codex/codex_telegram_bridge/src/codex_telegram_bridge/tmux_reply_bot.py index ded857d..cb4f45d 100644 --- a/codex/codex_telegram_bridge/tmux_reply_bot.py +++ b/codex/codex_telegram_bridge/src/codex_telegram_bridge/tmux_reply_bot.py @@ -9,7 +9,7 @@ import subprocess import time from typing import Optional -from bridge_common import ( +from .bridge_common import ( TelegramClient, RouteStore, config_get,