Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Claude-bridge

Управление Claude Desktop через Telegram-бота с доступом ко всем инструментам десктоп-версии (MCP-серверы, коннекторы, веб-поиск, анализ файлов, артефакты).

Работает поверх Windows UI Automation (дерево доступности Chromium внутри Electron). Это сознательный выбор: подход claude-automator через CDP (--remote-debugging-port) на текущих сборках Claude Desktop заблокирован — Anthropic гейтит remote-debugging подписанным токеном (см. ниже). UIA такого ограничения не имеет и отдаёт всё нужное структурно.

Платформа: только Windows (UI Automation). Python 3.11+.

Возможности

  • Текстовый диалог с Claude Desktop из Telegram (используется подписка, не API).
  • Сессии: /new, /sessions, /switch — создание и переключение бесед; при выборе показываются последние сообщения беседы.
  • Контекст и лимиты: /context, /limits — точные проценты прямо из UI Desktop.
  • Все инструменты: запросы «Allow tool» приходят в Telegram кнопками Allow / Once / Deny; /auto on — авто-подтверждение (чувствительные — файлы, команды — всё равно спрашиваются).
  • Интерактивные вопросы Claude (AskUserQuestion) приходят в Telegram кнопками опций; выбор кликается в Desktop и возвращается агенту.
  • Команды Claude (/compact, /clear, /model …) проходят как есть.
  • Богатый релей: в футере ответа видны выполненные команды и изменённые файлы (🖥 Ran …, ✏️ Edited file.py +N -M, 🔍 Searched …).
  • Читаемая разметка: ответы конвертируются в Telegram-HTML (код-блоки, жирный, таблицы, ссылки) с безопасным откатом на текст.
  • Файлы по кнопке: под ответом — кнопка «📎 Файлы» (только по запросу, не авто). По нажатию приходят: крупные код-блоки из ответа + реальные изменённые файлы с диска (по именам из инструментов, поиск в CLAUDE_PROJECT_ROOTS).
  • Голосовые сообщения: голос/аудио из Telegram распознаются локально (faster-whisper, без ключей) и уходят в Claude как текст. Модель и язык — WHISPER_MODEL / WHISPER_LANGUAGE в .env.
  • Зеркало (/mirror on): новые ответы Claude в выбранной беседе (в т.ч. на запрос прямо в Desktop) приходят в Telegram.
  • Устойчивость: переживает отключение RDP (keepalive tscon→console + запрет сна) и перезапуск посреди ответа — бот дочитывает прерванный ответ на старте.
  • /hide on|off — сворачивать окно Claude после ответа.
  • Жёсткий allowlist по user_id.

Установка и запуск

Проще всего — bot.bat: дважды кликните, откроется панель управления (ASCII-меню): запуск / остановка / перезапуск, статус, просмотр и слежение за логом, установка зависимостей (venv + pip) и настройка .env (токен, allowed IDs, режим инструментов, модель и язык Whisper, папки проектов). Панель держит ровно один экземпляр и проверяет, что бот поднялся.

Вручную:

# 1. зависимости
copy .env.example .env        # заполните TELEGRAM_BOT_TOKEN и TELEGRAM_ALLOWED_IDS
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt

Запуск (одним процессом):

.\start-bot.ps1            # убивает старые экземпляры и запускает один

Важно: запускать БАЗОВЫМ интерпретатором, а не .venv\Scripts\python.exe -m claude_bridge напрямую — venv-лаунчер на этой системе раздваивает процесс, и Telegram рвёт polling (Conflict). start-bot.ps1 уже использует базовый python с нужным PYTHONPATH.

Автозапуск (бот живёт сам, поднимается после сбоя):

.\install-startup.ps1     # автозапуск при входе в систему (без прав админа)
# или, с правами: .\install-autostart.ps1  (Task Scheduler, рестарт при сбое)

Перед стартом: Claude Desktop должен быть запущен, открыта любая беседа. Перезапускать Desktop с флагами не нужно — UIA подключается к обычному окну.

Команды бота

Команда Действие
/help список команд
/new новая беседа
/sessions беседы из Recents (кнопки: переключить / 📌 закрепить)
/model [имя] выбрать модель (без аргумента — меню кнопками)
/find <запрос> поиск по ВСЕМ беседам (не только Recents) → открыть и закрепить
/switch <N|имя> переключиться на беседу
/pin /unpin закрепить/открепить целевую беседу
/history [N] последние N сообщений беседы
/whereami где сейчас пишем
/context /limits заполнение контекста / лимиты плана (%)
/stop прервать генерацию (есть и кнопка ⏹ на статусе)
/auto on|off авто-подтверждение инструментов
/hide on|off сворачивать окно Claude после ответа
/mirror on|off зеркалить новые ответы выбранной беседы в Telegram
/status модель, контекст/план, цель, режимы
/compact, /clear команды для самого Claude — проходят как есть

Плюс: фото и документы из Telegram уходят в Claude как вложение; ответ стримится в статус-сообщение с кнопкой ⏹ Остановить и форматируется (код-блоки/жирный/таблицы). Прерванный перезапуском ответ дочитывается на старте.

Как это устроено

Telegram  ──►  claude_bridge  ──►  Claude Desktop (окно)
              telegram_bot.py      через Windows UI Automation:
              bridge.py            • поле ввода = Group 'Prompt' (прямая печать + Enter)
              uia_desktop.py       • ответ = прямое чтение текста из дерева (без буфера)
                                   • конец генерации = исчезла кнопка 'Stop'
                                   • сессии = кнопки 'Idle/Running <имя>'
                                   • лимиты = элемент 'Usage: context N%, plan M%'
  • Дерево доступности Chromium «ленивое»: бот включает его на старте (SPI_SETSCREENREADER=1) и снимает на выходе.
  • Все обращения к UIA сериализуются в одном потоке (COM-модель).
  • Карта UIA-локаторов — UIA-MAP.md. При обновлении Claude Desktop правки локаторов и python -m claude_bridge.probe (дамп дерева) — там.

Почему не CDP

В app.asar Claude Desktop зашит гейт: аргументы remote-debugging-port/-pipe вырезаются при саморелонче, если не задан CLAUDE_CDP_AUTH — короткоживущий токен, проверяемый Ed25519-ключом Anthropic. Подделать нельзя. Поэтому — UIA.

Безопасность

Бот даёт удалённый доступ к вашему ПК через Claude. Держите TELEGRAM_ALLOWED_IDS только со своим id; чувствительные инструменты оставляйте на ручном подтверждении.

Устойчивость к RDP / сну (один раз, от админа)

Если ПК используется по RDP, после отключения сессия становится «Disc» и синтетический ввод перестаёт доставляться. Лечится один раз:

# двойной клик или из PowerShell; запросит UAC
.\setup-keepalive.bat

Скрипт настраивает питание (без сна/гашения экрана) и регистрирует SYSTEM-задачу: при отключении RDP сессия перебрасывается на консоль (tscon /dest:console) и остаётся активной/разблокированной — бот продолжает работать. Дополнительно сам бот держит систему активной (SetThreadExecutionState).

send_message проверяет, что текст реально попал в поле, и повторяет при переходной потере фокуса (RDP-реконнект/блокировка) — без молчаливой отправки «старого» сообщения.

Статус

Рабочее решение: полный цикл «сообщение → ответ» со стримингом, подтверждение инструментов и интерактивные вопросы кнопками, голосовые (локальный Whisper), файлы по кнопке, дочтение прерванного ответа, устойчивость к RDP/сну. Артефакты-панели (Canvas) — единственный пока не покрытый пункт.

About

Claude desktop-telegram bridge

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages