.агенты
DotAgents
Телефон вибрирует, на экране: команда, которую хочет выполнить агент, и две кнопки: allow, deny.
суть
Cursor или Claude Code работает на твоей машине, а DotAgents стоит рядом и отдаёт тебе контроль через Telegram. Живое сообщение с тем, что агент делает прямо сейчас. Запрос на approve, когда он тянется к рискованной команде. Follow-up в очередь, пока ты в дороге. Всё локально: облачного релея нет, код с машины не уходит.
Платформа изнутри
Два экрана одной истории: слева в терминале работает Claude Code, справа в Telegram сидишь ты. Агент дошёл до опасной команды и встал; реши за него с телефона и посмотри, как контроль работает изнутри.
Два экрана одной сессии: слева Claude Code работает в терминале, справа ты управляешь им из Telegram: разрешаешь или отклоняешь каждую рискованную команду.
Как это работает
- 1Claude Code сам работает в терминале на твоей машине
- 2Дошёл до опасной команды: хук ставит его на паузу и пишет тебе в Telegram
- 3Жмёшь Allow или Deny, и так, пока задача не будет готова
Claude Code ·
started just now · 0 tools ·
0 files · mode: remote
Approval · a2b3c 14:33
Что вы разрешаете:
Задача завершена
Следующая задача:
Канал управления уходит в Telegram. Код, approvals и transcript остаются на машине: API слушает только 127.0.0.1.
Режим демона
Меняет, как решается следующий запрос.
Безопасность
- passcode argon2id
- HMAC + одноразовый nonce
- только владелец
- audit-log решений
- API только 127.0.0.1
- env без секретов при спавне
- 19k+ строк
- 132 теста
- 3 миграции
- long-poll 270 c
масштаб
размер и срок: что стоит за продуктом.
архитектура
Телефон владельца: статус, approve/deny, follow-up
- aiogram bot polling
Long-polling: live-сообщение, HMAC-кнопки, режимы
- FastAPI loopback spawn
Решение по риск-вызову: режим или владелец, fail-closed
- aiogram bot notify
Демон на 127.0.0.1: сессии, события, approvals
- AgentRunner
- Approvals
Спавнит CLI-агента, качает stdout в события
- Agent CLIs subprocess
- SQLite
Fail-closed хуки в Cursor/Claude блокируют риск-вызов
- FastAPI loopback approve?
claude / cursor-agent как подпроцессы, cwd=проект
- LLM provider API
- IDE hooks pre-call
Сессии, события, approvals, nonces и audit-log
Anthropic / OpenAI: зовёт сам CLI, не демон
стек
- Язык 1
- Фреймворк 4
- Данные 3
- Инфраструктура 5
- Клиент 1
- AI / ML 3
Язык
- Python 3.12
Фреймворк
- aiogram 3.27
- FastAPI 0.111
- Typer
- structlog
Данные
- SQLite
- SQLAlchemy 2
- Alembic
Инфраструктура
- IDE hooks
- loopback API
- HMAC + nonce
- argon2id
- auto-migrations
Клиент
- Telegram Bot API
AI / ML
- Cursor IDE
- Claude Code CLI
- Antigravity
что умеет
ключевые возможности продукта прямо сейчас.
Approve / deny с телефона
Агент занёс руку над рискованной командой, хук замораживает выполнение и шлёт запрос в Telegram: сама команда и две кнопки. Allow запускает, deny или молчание отклоняют. Fail-closed по умолчанию, а не по настройке.
Хуки before_shell и before_mcp уходят в long-poll (до ~270 секунд) и ждут решения. Любая ошибка, таймаут или недоступность демона трактуются как deny с ненулевым кодом выхода. Класс риска считает сервер: агент не может понизить его сам, только эскалировать. То же решение доступно и в опциональном Mini App.
Live-статус одним сообщением
Пока агент работает, в чате живёт одно редактируемое сообщение: что он делает прямо сейчас, какие файлы трогает, последний ответ. Стоп-кнопка там же, IDE открывать не нужно.
LiveMessageService дебаунсит правки (~2.5 секунды), переживает 429 Retry-After и «message not modified», а при переполнении 4096 символов перекатывает хвост во второе сообщение. Если сообщению больше 48 часов, шлёт новое.
Спавн и follow-up из чата
Сессию агента можно завести прямо из Telegram: мастер /new проведёт от проекта к промпту. Следующая задача встаёт в FIFO-очередь и прилетает агенту, как только он освободится, а хвост транскрипта читается тут же, без IDE.
Супервизор AgentRunner поднимает CLI-агента подпроцессом: подаёт follow-up'ы в stdin, сливает stderr, гонит stdout в поток событий. FollowupService выдаёт задачи по одной с блокировкой строки (skip_locked, с fallback для SQLite). История Cursor импортируется, транскрипт Claude Code синхронизируется живым SSE.
Три агента, один мост
Хуки ставятся в Cursor, Claude Code и Antigravity одной командой Typer-CLI. Для Cursor и Claude Code сессию можно ещё и заспавнить из Telegram; Antigravity пока подключается только через хуки.
CLI сам разводит хуки по всем трём агентам и регистрирует проекты (dotagents project add). Bot-спавн Antigravity ждёт headless-CLI от вендора, поэтому для него доступен именно контур approve/deny, а не запуск из чата.
Security-first, всё локально
Argon2id на входе, HMAC плюс nonce на каждом callback, whitelist владельца, полный audit-log, а API живёт только на 127.0.0.1. Ни облачного релея, ни выхода кода с машины.
Nonce одноразовый и с истечением, поэтому replay и подделка callback не проходят. Перед спавном из окружения вырезаются секреты (токен бота, HMAC-ключ), cwd форсится в каталог проекта, shell=True не используется, а секрет заголовка сверяется constant-time.
Три режима на сессию
remote спрашивает по каждому защищённому действию, readonly пропускает и только уведомляет, standby молча отклоняет опасное. Режим переключается и глобально, и по отдельной сессии.
AgentMode задаёт политику ask, allow или deny. Сессии живут в SQLite с idle- и абсолютным TTL, а SessionReaper подчищает просроченные.
хронология
как продукт рос от первой версии.
-
19 Apr 2026
Stage 1: мост безопасности за день
За день поднят каркас и рабочий мост: FastAPI на loopback, aiogram-бот, SQLAlchemy 2 с Alembic. Хуки Cursor и Claude Code, fail-closed approve/deny, три режима, passcode на argon2id, HMAC с nonce и audit-log.
-
22 Apr 2026
Stage 2: агенты прямо из Telegram
Сессию агента можно заспавнить из бота: мастер /new (проект, агент, промпт), супервизор подпроцессов AgentRunner, loopback-команды spawn/input/stop, реестр проектов через CLI и авто-миграции на старте.
-
23 Apr 2026
Telegram Mini App
Опциональный Mini App на /webapp: живой SSE-стрим, транскрипт и approve/deny в веб-вью. Owner-only, вход по initData с HMAC.
-
29 Apr 2026
Сессии и синхронизация транскрипта
Управление сессиями из чата, инлайн-действия (режим, refresh, stop), живая синхронизация транскрипта Claude Code через SSE и approve/deny-UI в Mini App.
-
1 Jul 2026
Хардинг перед публикацией
Fail-closed хуки и предрелизный харденинг, патч уязвимых зависимостей, починка тестов (их уже 140) и зелёный штамп аудита. Лицензия переведена в proprietary.
-
Next
Stage 2 остаток: голос и универсальный MCP
MCP-сервер с notify- и ask-инструментами для Claude Code, Codex и Gemini; голосовые сообщения через локальный Whisper становятся командой активной сессии.