danilinao/dsh-telegram-channel-ru

dsh-telegram-channel-ru

DeepSeek Harness 的 Telegram 遥控器:在手机上接续正在运行的 Web 会话并回答问题,界面为俄语。hi-wenw/dsh-telegram-channel 的俄语分支(MIT)。

待分类dsh-plugin-marketdsh-plugins

dsh-telegram-channel-ru

**Русский клон hi-wenw/dsh-telegram-channel
с доработками.** Взята база 0.3.5 (коммит 7af6cef) и добавлено: полностью
русский интерфейс, скрытие архивных сессий в меню выбора, наименование сессии на
кнопке, чтение каталога через хост-сервисы DSH 0.2 (там, где оригинал ждал
удалённый apiProxy), и русская карточка бота. Репозиторий:
. Что именно изменено и как
синхронизироваться с оригиналом — в UPSTREAM.md.
Имя пакета и имя репозитория — `dsh-telegram-channel-ru` (суффикс -ru
отделяет русское ответвление от оригинала в общем пространстве имён; на npm
пакет с 0.8.1). Плагин в профиле DSH тоже называется dsh-telegram-channel-ru.
Старые адреса danilinao/dsh-telegram-channel продолжают работать — GitHub
редиректит их на новое имя.

Telegram-пульт для DeepSeek Harness: телефон подключается к уже идущей сессии на компьютере и продолжает её — один диалог, две стороны. Компьютер остаётся источником истины: плагин не запускает второй агент и не дублирует контекст, а работает с теми же сессиями, что открыты в Web. Плагин живёт внутри процесса dsh web и подключается в профиль как link:.

Что умеет

  • Настройки в Web-интерфейсе: вкладка «Telegram» в «Настройках». Токен,

список пользователей, доступ и формат сообщений — как у cost-meter и plugin-market, без перезапуска dsh и без ручной правки YAML. Та же форма открывается и с карточки плагина (Plugins → dsh-telegram-channel-ru). Несколько человек в белом списке, добавление по @username и по id.

  • Пульт к живой сессии. /sessions → рабочая область → сессия → привязка.

Дальше всё, что вы пишете в Telegram, попадает в эту же сессию; ответы и работа инструментов видны и на компьютере.

  • Русский интерфейс. Команды, меню бота, пикеры, /status, /compact,

уведомления и карточка бота — по-русски.

  • Архивные сессии скрыты. Меню показывает только живые сессии: учитываются

оба написания id (session- и `), проекционные флаги архива и список archivedSessionIds`. Области, где не осталось ничего живого, из меню тоже исчезают.

  • На кнопке — имя сессии. N. ▶/▷; имя берётся из заголовка

сессии, иначе из первого сообщения, иначе рабочая область · дата. ▶ — сессия в памяти, ▷ — поднимется при привязке.

  • Не только текст. Картинки (png/jpeg/webp/gif, в том числе с подписью;

альбомы склеиваются в одно сообщение) и текстовые документы — txt, md, json, yaml, csv, код (.gd, .ts, .py, …), до 128 КБ: файл приходит в сессию текстом вместе с подписью. Бинарные файлы — через Web.

  • Двусторонние вопросы и подтверждения. Когда агент спрашивает «какой

вариант?» или просит разрешение на инструмент, ответить можно из Telegram: варианты приходят inline-кнопками, есть «✏️ Свой ответ» для свободного текста и «✅ Готово» для мультивыбора; разрешение — кнопками «✅ Разрешить» / «⛔ Отклонить». Буквы (A, B) и обычный текст тоже принимаются; ответ из Web закрывает канал в TG.

  • Модель, контекст, сжатие. /model, /status, /compact, /mission,

/stop, /new — из телефона.

  • Проекты и сессии целиком с телефона. В списке видны все рабочие области,

включая пустые; в пустой области кнопка создаёт сессию. /newproject (или кнопка «➕ Новый проект») добавляет в реестр новую папку, /new создаёт диалог в текущей области, 🗄 у сессии или /archive убирают её в архив (работа останавливается, из меню и Web сессия исчезает).

  • Команды и рассуждения — целиком, но под спойлером. Вызовы инструментов

приходят с полными аргументами, а рассуждения модели — отдельным блоком «🧠 Рассуждения» перед каждым ответом. И то и другое свёрнуто в «раскрывающуюся цитату» Telegram (`) и разворачивается одним тапом; /reasoning off` отключает рассуждения для конкретного чата (по умолчанию они включены).

  • История при открытии сессии. При привязке сразу показываются последние

сообщения диалога; кнопка «⬅ Раньше» листает глубже, /history [seq] — тоже вручную. В истории видны реплики пользователя, ответы ассистента и рассуждения модели («🧠 Рассуждения» спойлером), а вызовы инструментов — спойлером «🛠 имя» и их можно убрать: /history tools off или кнопка «🛠 Вызовы» под страницей (запоминается для чата, по умолчанию они показаны).

  • Архив отдельно от списка. В списке сессий области только неархивные; ниже

кнопка «🗂 Архивные (N)» — она открывает архив этой области с кнопкой «↩» (вернуть) и «← К сессиям». Глобальный архив тоже доступен: /archived.

  • Осмысленные имена сессий. Если у сессии нет заголовка и проекций, имя

берётся из её журнала на диске — первое сообщение пользователя. Поэтому в списке видно «Проект: … Synthriders — Beatmap Studio…», а не один и тот же «Synthriders» на все одиннадцать строк; рядом дата и хвост id. Пустые сессии (в журнале нет ни одного сообщения) не показываются — внизу приписка «Скрыто пустых сессий: N».

  • Уведомления о состоянии сессии. В чат приходит: успешное завершение хода,

падение с текстом ошибки и подсказкой (кончились токены/квота, лимит запросов, модель недоступна, переполнен контекст, сеть, ключ), достижение лимита выходных токенов, аварийный обрыв, и вопрос агента («❓ Сессия задала вопрос и ждёт ответа») — с названием сессии и проекта. По умолчанию бот следит за всеми сессиями, включая запущенные с компьютера; /notify bound сужает до привязанной, /notify on | errors | off задаёт набор событий. Под уведомлением — кнопки: 🔁 Повторить после ошибки, ▶ Продолжить после лимита токенов, 📜 Последний ответ и 📖 История.

Установка

Из npm — dsh-telegram-channel-ru:

dsh plugin --profile web add dsh-telegram-channel-ru
systemctl restart dsh           # плагин монтируется при старте

Из репозитория (разработка) — плагин подключается как link: и исполняется прямо из папки проекта:

git clone https://github.com/danilinao/dsh-telegram-channel-ru
dsh plugin --profile web add link:$PWD/dsh-telegram-channel
systemctl restart dsh

В репозитории лежит уже собранный lib/, так что клон работает без сборки. Если правите код — соберите заново (src/ → lib/): см. BUILD.md (npm install && npm run check).

Конфигурация — строка - id: dsh-telegram-channel-ru в ~/.dsh/profiles/web/cordis.patch.yml (именно id-оверрайд, а не insert: id уже вставлен бандлом плагина):

- id: dsh-telegram-channel-ru
  name: dsh-telegram-channel-ru
  config:
    token: "<токен от @BotFather>"
    allowedUserIds: [<ваш числовой id из @userinfobot>]
Переезд с 0.8.0 на 0.8.1. Пакет переименован в dsh-telegram-channel-ru,
и вместе с ним изменился id плагина в профиле: старая строка
- id: dsh-telegram-channel больше не совпадает с именем пакета, а значит
конфиг (токен и белый список) не применится. Порядок: добавить в
cordis.patch.yml строку с новым id (и name: dsh-telegram-channel-ru) с тем
же config, затем удалить старую строку и сделать
dsh plugin --profile web remove dsh-telegram-channel; перезапуск — после этого.

Ключ · Смысл token / DSH_TELEGRAM_TOKEN · токен бота allowedUserIds / DSH_TELEGRAM_ALLOWED_USER_IDS · белый список; пусто — бот не отвечает никому allowAllUsers · true только для отладки maxMessageLength · по умолчанию 4096 pollingTimeoutSec · по умолчанию 30 rendering · html (по умолчанию, любой клиент) или rich users · список людей из GUI: id, подпись (name), enabled; главнее плоского списка

Настройки в Web-интерфейсе

Всё, что раньше правили руками в cordis.patch.yml, теперь есть в GUI — Настройки → Telegram (вкладка рядом с «Расходами» и «Plugins»): форма регистрируется в слот settings.section под id плагина, а заголовок вкладки берётся из локали (ru/en) и следует за активным языком. Та же самая форма по-прежнему открывается на карточке плагина (Plugins → dsh-telegram-channel-ru): обе стороны — один компонент и один configForms- скоуп, поэтому настройки не могут разойтись.

  • Токен бота — поле «только для записи»: DSH не отдаёт секрет в браузер

(.role('secret')), поэтому страница показывает лишь «сохранён» и строку статуса «Бот подключён: @имя». Пустое поле = «оставить как есть», кнопка «Проверить» заново спрашивает Telegram (getMe).

  • Пользователи — несколько человек сразу: id, подпись, галочка «Отвечать».

Добавление по числовому id или по @username (бот резолвит его через getChat), плюс чипсы «недавно писали боту» — один клик на того, кто уже постучался. Снятая галочка оставляет человека в списке, но бот не отвечает.

  • Доступ — «Разрешить всем» (опасно, только для отладки).
  • Оформление — html / rich.
  • Дополнительно — максимальная длина сообщения и таймаут long-poll.

Сохранение — одна атомарная запись в профиль: страница отправляет только изменённые поля, поэтому токен не переписывается заново при каждой правке. Перезапуск `dsh` не нужен: плагин слушает loader/volatile-update, останавливает старый мост и поднимает новый с новыми значениями; смещение getUpdates при этом сохраняется, так что уже обработанные сообщения не обрабатываются дважды.

То же самое в cordis.patch.yml (страница пишет именно это):

- id: dsh-telegram-channel-ru
  name: dsh-telegram-channel-ru
  config:
    token: "<токен>"
    users:
      - id: 333041652
        name: Алексей
        enabled: true
      - id: 777000888
        enabled: false
    allowAllUsers: false
    rendering: html

allowedUserIds (плоский список из 0.8.x) продолжает работать — он читается, пока users пуст. Первое сохранение из GUI пишет users и убирает allowedUserIds, чтобы не осталось второго, невидимого белого списка.

Важно про несколько человек. Бот не разделяет доступ к сессиям: каждый из
списка видит все рабочие области и может привязаться к любой сессии — ровно
так, как это делал единственный владелец. Если это не подходит, добавляйте
людей точечно и держите allowAllUsers выключенным.

Страница берёт с хоста только несекретные сведения (getMe, имена из getChat) через два маршрута под /plugins/dsh-telegram-channel-ru/settings/ (info и resolve); токен по ним не ходит. Нужен DSH 0.2.x: в 0.1.x у Plugins нет форм, и раздел просто не появится.

Команды

Команда · Что делает /sessions · рабочие области → сессии → привязка (архив и пустые скрыты) /last · последний вопрос-ответ привязанной сессии /model · сменить модель (действует со следующего хода) /status · модель, глубина размышлений, контекст, TTFT, токены /compact · сжать историю сессии (когда она свободна) /rich · on — rich-рендер, off — HTML (для этого чата) /reasoning · on/off — присылать рассуждения модели спойлером (по умолчанию on, запоминается для чата) /stop · прервать текущий ход /mission · список задач и прогресс /new · новый диалог в текущей области и привязка /newproject [\ · Название] · добавить папку как проект (рабочую область) /archive · убрать привязанную сессию в архив /archived · список архива, кнопка «↩» возвращает сессию /history [seq] · предыдущие сообщения сессии: вопросы, ответы и рассуждения (листается «⬅ Раньше») /history tools on\ · off · показывать вызовы инструментов в истории (по умолчанию on, запоминается для чата) /retry · повторить последний отправленный запрос (после ошибки) /find · найти сессии по названию или папке и привязаться кнопкой /notify on\ · errors\ · off · какие события присылать (всё / только ошибки / ничего) /notify every\ · bound · за какими сессиями следить (всеми / только привязанной) /projects · список проектов и сессий (то же, что /sessions) /unbind · отвязать телефон (сессия на компьютере остаётся) /cancel · закрыть ответы/подтверждения в Telegram /help · помощь

Совместимость

Плагин работает с DSH 0.2.x: каталог сессий, список моделей и создание сессий читаются напрямую из хост-сервисов (sessionController.list, workspaceRegistry, sessionController.modelCatalog / selectModel / create), потому что сервис apiProxy, на который опирался оригинал 0.3.5, в 0.2 удалён. Старый путь через apiProxy сохранён и используется, если сервис доступен. Отправка изображений тоже портирована: на 0.2 вложение уходит через sessionController.prompt. Проекты и архив — через workspaceRegistry.create / archiveSession.

Начиная с 0.8.0 peer-зависимости @deepseek-ai/dsh* рассчитаны на рантайм 0.2.1-alpha.2 (^0.2.1-alpha.2), поэтому исключение allow-version не нужно. Если хост обновится до несовместимой версии, DSH откажется грузить плагин — тогда либо правятся диапазоны, либо выдаётся исключение (см. BUILD.md).