MVP Telegram bot для управления локальным Codex Desktop на Mac.
- Показывает проекты кнопками.
- Показывает и создает чаты внутри проекта.
- Автоматически подтягивает уже существующие Codex-сессии из
~/.codex/sessions. - Принимает текст, фото, документы, видео, аудио и voice как запрос к Codex.
- Ставит запрос в SQLite-очередь.
- Локальный worker запускает Codex Desktop
app-serverчерез stdio. - После завершения задачи бот делает background refresh
codex://threads/<session_id>черезopen -g, чтобы Desktop подтянул новые сообщения без переключения окна. codex execдля Telegram-задач не используется.- Для выбранного Codex-чата бот ждет завершение в
~/.codex/sessionsи возвращает финальный ответ в Telegram. - Возвращает итоговый ответ Codex в Telegram.
- Длинные ответы режет на части по 3500 символов.
- Пускает только Telegram user id из
TELEGRAM_ALLOWED_USER_IDS. - В итоговых ответах показывает, из какого проекта и чата пришел ответ.
- Внизу Telegram закрепляется постоянное меню: проекты, чаты, новый чат, модель, статус, помощь.
- Позволяет выбрать модель GPT и скорость рассуждения для новых задач.
MVP сохраняет историю jobs и вложения в SQLite/data/attachments. Для старых Codex-сессий сохраняется codex_session_id, чтобы отправлять задачи и уведомления через Codex Desktop/App.
Новый чат, созданный в Telegram, получает новый Codex Desktop thread при первой задаче. Уже существующие Codex Desktop чаты импортируются из ~/.codex/sessions.
При старте и при открытии /projects бот сканирует:
~/.codex/sessions
Из каждой найденной сессии он берет:
session_meta.idкакcodex_session_id;session_meta.cwdкак проект;- первый нормальный пользовательский запрос как название чата.
Проекты из config/projects.json показываются первыми. Остальные проекты добавляются автоматически по найденным cwd.
Такие автоматически найденные проекты показываются по имени папки.
- Открой Telegram.
- Найди
@BotFather. - Отправь:
/newbot
- Задай имя и username бота.
- BotFather выдаст token. Вставь его в
.envкакTELEGRAM_BOT_TOKEN.
Не отправляй token в чат и не коммить .env.
Варианты:
- Напиши
@userinfobotв Telegram. - Или временно напиши своему боту и посмотри update через Telegram API, если уже знаешь token.
В .env укажи:
TELEGRAM_ALLOWED_USER_IDS=123456789Если нужно несколько id:
TELEGRAM_ALLOWED_USER_IDS=123456789,987654321Создай файл:
cd /path/to/codex-telegram-agent
cp .env.example .envПример:
TELEGRAM_BOT_TOKEN=put_real_token_here
TELEGRAM_ALLOWED_USER_IDS=123456789
CODEX_BINARY=codex
CODEX_AGENT_DB=/path/to/codex-telegram-agent/data/agent.sqlite
CODEX_AGENT_LOG=/path/to/codex-telegram-agent/logs/agent.log
MAX_PARALLEL_JOBS=1
CODEX_DESKTOP_TIMEOUT_SECONDS=7200CODEX_BINARY оставлен для совместимости, но Telegram-задачи отправляются только в Codex Desktop.
Создай локальный файл из примера:
cp config/projects.example.json config/projects.jsonФормат:
{
"projects": [
{
"id": "example_project",
"title": "Example Project",
"cwd": "/absolute/path/to/your/project",
"enabled": true
}
]
}config/projects.json содержит локальные пути и не должен попадать в git.
При старте агент проверяет, что файл существует, каждый enabled cwd существует, и Codex Desktop app-server доступен.
cd /path/to/codex-telegram-agent
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python -m src.mainЛог:
/path/to/codex-telegram-agent/logs/agent.log
SQLite:
/path/to/codex-telegram-agent/data/agent.sqlite
- Напиши боту:
/start
- Выбери проект.
- Выбери уже существующий Codex Desktop чат или нажми
Новый чат. - При необходимости нажми
Модельи выбери GPT/скорость. - Отправь тестовый запрос:
Скажи коротко, в какой папке ты работаешь.
Можно отправить фото или документ с подписью. Вложения передаются в Codex Desktop как локальные пути в prompt.
Ожидаемый поток:
Задача поставлена в очередь: #1
В работе в Codex Desktop: #1
Проект: ...
Чат: ...
Готово: #1
...
Создай файл:
~/Library/LaunchAgents/com.tim.codex-telegram-agent.plist
Содержимое:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.tim.codex-telegram-agent</string>
<key>ProgramArguments</key>
<array>
<string>/path/to/codex-telegram-agent/.venv/bin/python</string>
<string>-m</string>
<string>src.main</string>
</array>
<key>WorkingDirectory</key>
<string>/path/to/codex-telegram-agent</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/path/to/codex-telegram-agent/logs/launchd.out.log</string>
<key>StandardErrorPath</key>
<string>/path/to/codex-telegram-agent/logs/launchd.err.log</string>
</dict>
</plist>Загрузить:
launchctl load ~/Library/LaunchAgents/com.tim.codex-telegram-agent.plistОстановить:
launchctl unload ~/Library/LaunchAgents/com.tim.codex-telegram-agent.plistПроверить:
launchctl list | grep com.tim.codex-telegram-agent
tail -f /path/to/codex-telegram-agent/logs/agent.log/start- выбрать проект./projects- выбрать проект./chats- выбрать чат активного проекта./newchat- создать чат./status- активный проект, активный чат и последняя задача./cancel- отменить queued задачу./watch- включить уведомления о завершении для активного Codex-чата./unwatch- выключить уведомления для активного Codex-чата./help- краткая справка.
Бот скачивает вложения в:
/path/to/codex-telegram-agent/data/attachments
Поддерживается MVP:
- фото;
- документы;
- видео;
- аудио;
- voice.
В Desktop-only режиме вложения добавляются в prompt как локальные пути, чтобы Codex Desktop мог открыть их с этого Mac.
Когда выбираешь Codex-чат в Telegram, бот автоматически включает наблюдение за этой локальной Codex-сессией.
Если потом запустить работу прямо из Codex Desktop/App в этом же чате, агент увидит завершение в ~/.codex/sessions и отправит в Telegram проект, чат и финальный ответ Codex.
Формат уведомления:
Проект: <project title>
Чат: <chat title>
<финальный ответ Codex>
Если Codex-сессия не относится к проекту из config/projects.json, проект показывается как:
<имя папки>
Команды:
/watch
/unwatch