CoreClaw — Telegram + Claude Code bridge

Обзор

Основной Telegram-бот для работы с Claude Code. Bridging между Telegram-топиками и tmux-сессиями Claude Code.

Технические детали

  • Username: @coreclawrobot (display name в Telegram: “Босс Ассистент”)
  • Расположение: forge (82.39.215.94)
  • URL: — (только Telegram)
  • Auth: bot-based (не Telegram Login Widget/OAuth — виджет telegram.org/js/telegram-widget.js блокировался ISP Proxima Ltd на десктопе). Юзер жмёт кнопку → /api/auth/init → UUID + t.me/coreclawrobot?start=auth_<uuid> → бот ловит payload в bot.start()POST jarvis-web:3000/api/auth/from-bot с x-bot-secret (общий JARVIS_BOT_AUTH_SECRET) → frontend поллит /api/auth/poll → JWT-cookie. Файлы: app/lib/auth-store.ts (in-memory Map, TTL 5 мин, не переживает ребут — TODO перенести в Redis), app/api/auth/{init,from-bot,poll}/route.ts, app/login/page.tsx.

Архитектура

  • 1 Telegram-топик = 1 tmux-окно = 1 Claude Code сессия
  • Telegram Forum topics → tmux sessions
  • SessionStart hook пишет session_map.json
  • MonitorState отслеживает JSONL-файлы сессий

Jarvis

  • Web dashboard для инфры: https://jarvis.08317.ru
  • Next.js frontend
  • Auth: bot-based (Telegram Login Widget работает с Jarvis)
  • Инфра-граф: ReactFlow с сервисами и серверами

Карта и управление комнатами (сессия 2026-07-02)

  • MapRoomapp/rooms/rooms/MapRoom.tsx, react-leaflet v5, 3 слоя: Карта (OSM) / Спутник (Esri) / Гибрид. app/api/map/geocode/route.ts — GET ?q=Исландия → Nominatim → {lat,lon,zoom,display_name}. Автозум: place_rank для административных объектов, bbox-span для природных (озёра, острова). MapController — прямой доступ к Leaflet-инстансу для flyTo + zoom.
  • Event store: app/rooms/mapQueryStore.ts (dispatch(cmd) / subscribe(listener) / registerOpener(fn)), app/rooms/roomOpener.ts (open(key) / register(fn) — для открытия любой комнаты). Оба регистрируются в RoomLayer.tsx через useRooms().open.
  • CoreClaw-тулы: show_map (открыть карту + перелететь), map_control (zoom_in/zoom_out/pan_to), open_room (открыть любую комнату Jarvis). Файлы: coreclaw/src/tools/builtin/{map,map_control,open_room}.ts. Конфиг: config/tools.yaml, описание в config/prompts/system.md.
  • Доступные комнаты (registry.tsx): infra, map, goals (OKR), settings.
  • Голосовой поток: голос → STT → sendMessage() → CoreClaw вызывает тул → SSE {type:'artifact', value:{kind:'map_control',...}}page.tsx диспатчит в mapQueryStore/roomOpener → MapRoom подписан, выполняет команду.
  • /api/map/ добавлен в PUBLIC_PREFIXES (без JWT).
  • Паттерны для будущего голосового слоя в комнатах (proactive check-in, silent language memory) — см. markxlix-features.

История

  • 2026-06-06: восстановлены после потери сервера
  • Было до: другой сервер (потерян)
  • CoreClaw = @coreclawrobot, Jarvis = jarvis.08317.ru

Связанные сервисы

  • Postgres: coreclaw-postgres (БД coreclaw + inventory + tg_secretary)
  • Qdrant: coreclaw-qdrant (shared, также используется RAG dbrain)

Восстановление 2026-06-06 (после потери старого сервера)

DNS в Cloudflare 08317.ru: jarvis.08317.ru, secretary.08317.ru, tg.08317.ru → 82.39.215.94 (DNS only).

Подключённые тулы на тот момент: 23 builtin + 154 MCP = 177. google_workspace MCP (114 тулов, gwmcp:8888) — OAuth авторизован в тот же день, credentials в docker volume gwmcp_credentials (не терять при docker volume rm).

Оставшийся TODO с той сессии (проверить актуальность при следующей работе с голосом): Silero TTS голоса звучали плохо на русском — рассматривался переход на Gemini TTS (единый API для бота и Jarvis voice). См. также инцидент 2026-07-06 про утечки памяти выше — voice сейчас работает через jarvis-voice-bridge (socat) → coreclaw/src/voice/bridge.ts → Gemini Live API (gemini-2.5-flash-native-audio-latest, голос “Charon”).

Инциденты

2026-07-06: зависания докер-контейнера coreclaw (2 раза подряд)

Симптом у пользователя: в Jarvis-web браузере карта не находила объекты (открывалась пустая карта), голос вообще не распознавал — при этом с телефона (Telegram) всё работало. Причина: контейнер coreclaw — единая точка входа и для /api/chat (карта, через тул show_map), и для /ws/voice — подвисал (процесс жив, но перестаёт принимать соединения), оба симптома появлялись вместе.

  • Зависание №1: обнаружено с простоем логов ~2 часа. Fix: docker restart coreclaw.
  • Зависание №2: найдено сразу же при повторной проверке после фикса — контейнер зависал повторно примерно раз в 6-9 часов uptime.
  • Реальная причина обоих: не баг в coreclaw, а нехватка памяти на хосте (см. filesystem-mcp) — своп был забит на 100%, RAM на 95%+. Под таким давлением node-процесс не крашится, а подвисает вместо ответа на новые сокеты. Утечки в gwmcp и filesystem-mcp исправлены в коде (не просто рестартом) — session timeout’ы добавлены в обоих, дальше расти не должны. Если подвисание coreclaw повторится — смотреть память хоста в первую очередь, а не сам coreclaw.

2026-07-06: отключён legacy systemd coreclaw.service

Обнаружен параллельный bare-metal systemd юнит ~/.config/systemd/user/coreclaw.service (создан 2026-05-27), крашлупился каждые ~10-13 сек с EAI_AGAIN coreclaw-postgres (сотни тысяч рестартов) — не мог резолвить докеровское DNS-имя с голого хоста.

Таймлайн: CoreClaw жил как systemd-сервис с 27 мая; в докер переехал только 2026-07-05 ~15:57 (created timestamp контейнера). Старый юнит после переезда забыли остановить — 1.5 месяца крашлупа впустую (жрал CPU на постоянных рестартах node).

Fix: systemctl --user disable --now coreclaw.service. Проверено — на реальную работу не повлияло, докер-контейнер как был единственным обработчиком трафика, так и остался.

2026-07-10: пилотная установка Graphify (граф кодовой базы для AI-агентов)

По инициативе Сергея (“Graphify найди на гитхабе”) найден и проверен репо Graphify-Labs/graphify (изначально известен как safishamsi/graphify, default branch v8). Перед установкой сделан security review исходников (tree-sitter AST-парсинг, без eval/exec/shell=True, SSRF-защита на ingest, hash-стамп untrusted-контента против prompt injection) — легитимный проект, накрутки звёзд не найдено (в отличие от другого репо с тем же названием, см. feedback-check-before-code.md в auto-memory).

Coreclaw выбран как пилотный проект (активная разработка, реальная архитектурная сложность, не критичный по деньгам как vpnbot-v3).

Установлено на /home/claude (не в докер-контейнер):

  • uv tool install graphifyy — CLI graphify/graphify-mcp, изолированно
  • graphify install --project --platform claude, запущено из /home/claude/coreclaw

Что создано/изменено в coreclaw (ничего не закоммичено):

  • .claude/skills/graphify/SKILL.md + references/ — новый skill
  • .claude/settings.json — PreToolUse хуки: graphify hook-guard search на Bash, graphify hook-guard read на Read/Glob (перехватывают вопросы по кодовой базе, направляют через граф)
  • CLAUDE.md в корне репо — новый файл, туда записана секция graphify

Пред-существующие незакоммиченные правки в coreclaw (config/prompts/system.md, src/bot/handlers.ts, src/tools/builtin/map.ts, .serena/) — не мои, не тронуты.

2026-07-10: граф построен. Пайплайн выполнен вручную (Python API напрямую, SKILL.md оказался повреждён апстрим-компрессией контекста — сверял каждую сигнатуру через inspect перед вызовом).

Результат: 668 узлов, 1406 рёбер, 34 community, 10 god nodes, 5 surprising connections. Источники: AST (634 узла/1545 рёбер, tree-sitter, бесплатно) + семантика по 25 doc-файлам (34 узла/54 рёбра/3 hyperedges, через собственный dispatched subagent — ключей GEMINI_API_KEY/GOOGLE_API_KEY нет).

Health-check (diagnose_extraction): 181 dangling_endpoint_edges (рёбра на несуществующие узлы — вероятно из-за 4 пропущенных .sql-файлов, нет tree_sitter_sql) и 10 groups схлопнутых дублей (в основном повторные imports_from рёбра — норма). Не блокирует, но если понадобится точность — доставить tree-sitter-sql в venv графайфа и пересобрать.

Файлы (не закоммичены, живут вне git):

  • graphify-out/graph.json — основной граф (655KB)
  • graphify-out/graph.html — интерактивный D3-вьюер (582KB)
  • graphify-out/GRAPH_REPORT.md — читаемый отчёт с god nodes/communities/surprises/suggested questions
  • graphify-out/manifest.json — для инкрементального graphify update .
  • graphify-out/.graphify_python, .graphify_root — служебные маркеры (нужны для CLI)
  • Промежуточные .graphify_* (ast/semantic/detect/state/labels) удалены после сборки — их можно перегенерить, в git всё равно не идут

Проверено: graphify query "как работает auth" — BFS от auth.ts/AuthContext/authority.ts, 159 узлов, работает.

Закоммичено и запушено 2026-07-11 (коммит f90cfb1, ветка main, origin/main в актуальном состоянии): .claude/skills/graphify/, .claude/settings.json, CLAUDE.md, .gitignore (добавлена строка graphify-out/ — артефакты графа в git не идут, пересобираются через graphify update .). В коммит не попали чужие незакоммиченные правки (config/prompts/system.md, src/bot/handlers.ts, src/tools/builtin/map.ts) и .serena/ — они не мои, остались нетронуты и по-прежнему не в git.