dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
DeepSeek Harness 的 Telegram 遥控器:在手机上接续正在运行的 Web 会话并回答问题,界面为俄语。hi-wenw/dsh-telegram-channel 的俄语分支(MIT)。
Русский клон hi-wenw/dsh-telegram-channel с доработками. Взята база
0.3.5(коммит7af6cef) и добавлено: полностью русский интерфейс, скрытие архивных сессий в меню выбора, наименование сессии на кнопке, чтение каталога через хост-сервисы DSH 0.2 (там, где оригинал ждал удалённыйapiProxy), и русская карточка бота. Репозиторий: https://github.com/danilinao/dsh-telegram-channel-ru. Что именно изменено и как синхронизироваться с оригиналом — в 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:.
dsh и без ручной правки YAML. Та же форма
открывается и с карточки плагина (Plugins → dsh-telegram-channel-ru).
Несколько человек в белом списке, добавление по @username и по id./sessions → рабочая область → сессия → привязка.
Дальше всё, что вы пишете в Telegram, попадает в эту же сессию; ответы и работа
инструментов видны и на компьютере./status, /compact,
уведомления и карточка бота — по-русски.session-<uuid> и <uuid>), проекционные флаги архива и
список archivedSessionIds. Области, где не осталось ничего живого, из меню
тоже исчезают.N. <наименование> ▶/▷; имя берётся из заголовка
сессии, иначе из первого сообщения, иначе рабочая область · дата.
▶ — сессия в памяти, ▷ — поднимется при привязке.txt, md,
json, yaml, csv, код (.gd, .ts, .py, …), до 128 КБ: файл
приходит в сессию текстом вместе с подписью. Бинарные файлы — через Web.A, B) и обычный текст тоже
принимаются; ответ из Web закрывает канал в TG./model, /status, /compact, /mission,
/stop, /new — из телефона./newproject <путь> (или
кнопка «➕ Новый проект») добавляет в реестр новую папку, /new создаёт диалог в
текущей области, 🗄 у сессии или /archive убирают её в архив (работа
останавливается, из меню и Web сессия исчезает).<blockquote expandable>) и разворачивается
одним тапом; /reasoning off отключает рассуждения для конкретного чата
(по умолчанию они включены)./history [seq] — тоже
вручную. В истории видны реплики пользователя, ответы ассистента и рассуждения
модели («🧠 Рассуждения» спойлером), а вызовы инструментов — спойлером «🛠 имя»
и их можно убрать: /history tools off или кнопка «🛠 Вызовы» под страницей
(запоминается для чата, по умолчанию они показаны)./archived./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; главнее плоского списка |
Всё, что раньше правили руками в cordis.patch.yml, теперь есть в GUI —
Настройки → Telegram (вкладка рядом с «Расходами» и «Plugins»): форма
регистрируется в слот settings.section под id плагина, а заголовок вкладки
берётся из локали (ru/en) и следует за активным языком. Та же самая форма
по-прежнему открывается на карточке плагина (Plugins →
dsh-telegram-channel-ru): обе стороны — один компонент и один configForms-
скоуп, поэтому настройки не могут разойтись.
.role('secret')), поэтому страница показывает лишь «сохранён» и строку
статуса «Бот подключён: @имя». Пустое поле = «оставить как есть», кнопка
«Проверить» заново спрашивает Telegram (getMe).@username (бот резолвит его через
getChat), плюс чипсы «недавно писали боту» — один клик на того, кто уже
постучался. Снятая галочка оставляет человека в списке, но бот не отвечает.html / rich.Сохранение — одна атомарная запись в профиль: страница отправляет только
изменённые поля, поэтому токен не переписывается заново при каждой правке.
Перезапуск 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).
Клон hi-wenw/dsh-telegram-channel
(MIT, база — коммит 7af6cef). История коммитов сохранена: в ней видны авторы
оригинала, сверху — наши доработки. Как синхронизироваться с оригиналом и как
публиковать — в UPSTREAM.md.
Лицензия — MIT (LICENSE); уведомление об авторских правах оригинала сохранено.
A Telegram remote for DeepSeek Harness (dsh): attach a live web session from
your phone and keep working in the same conversation — one trajectory, two
sides, in the spirit of Codex-style remote control.
The desktop session is the source of truth. The plugin runs inside the dsh web
process, never spawns a second agent and never forks the context: whatever you
send from the phone lands in the session that is already open on the computer,
and both sides see the same messages, tool calls and answers.
This is a Russian clone of hi-wenw/dsh-telegram-channel
with additions, built on the 0.3.5 base (commit 7af6cef). See
UPSTREAM.md for the exact diff against the original and for the
sync/publish workflow.
/sessions walks workspace → session → attach.
After attaching, plain text (and images) go straight into that session./status, /compact, notifications, errors — is Russian, and the bot
carries a Russian profile card (setMyDescription / setMyShortDescription).session-<uuid> and <uuid>), the per-item
archived / archivedAt flags are honoured, and archivedSessionIds from the
host is merged in. Workspaces left with nothing live disappear from the menu.N. <name> ▶/▷, where the
name comes from the session title, else the first user message
(titleInput.first.text), else workspace · date. ▶ means the session is
live in memory, ▷ means it is parked and will be resumed on attach. Cold
sessions are named through the host's projection API, cached by updatedAt.<blockquote expandable>) that open with one tap. /reasoning off silences
the reasoning for one chat.txt, md, json, yaml, csv, code (.gd, .ts,
.py, …), up to 128 KB — arrive in the session as prompt text next to the
caption. Binary files go through the web UI.A, B) and plain text
still work. An answer given in the web UI closes the Telegram channel./model, /status,
/compact, /mission, /stop, /new./newproject <path> [ | Title] (or the
"➕ Новый проект" button) registers a new folder, /new creates a session in
the current workspace, and 🗄 next to a session (or /archive) moves it to the
archive — the session is stopped and disappears from both the menu and the web
UI.<blockquote expandable>), so they stay
out of the way until tapped./history [seq] does
it manually. User prompts, assistant replies and the model's reasoning ("🧠"
spoiler) are always included; tool calls ("🛠" spoiler) can be hidden with
/history tools off or the "🛠 Calls" button under the page (per chat)./archived./notify bound narrows it to the attached session, and
/notify on | errors | off picks the event set.web profile (dsh web).api.telegram.org. If your network needs a proxy or a VPN,
set HTTP(S)_PROXY for the harness process or route it at the OS level — the
plugin itself knows nothing about tunnels and just uses an ordinary HTTPS
client (with environment proxy support).git clone https://github.com/danilinao/dsh-telegram-channel-ru /path/to/dsh-telegram-channel
dsh plugin --profile web add link:/path/to/dsh-telegram-channel
systemctl restart dsh # the plugin is mounted at startup only
Or install the published package instead of the checkout:
dsh plugin --profile web add dsh-telegram-channel-ru.
The repository ships a built lib/, so a clone runs as-is. If you edit src/,
rebuild it (npm install && npm run check) — DSH executes lib/index.js, never
the TypeScript sources. See BUILD.md.
Put an id-targeted override in ~/.dsh/profiles/web/cordis.patch.yml (the
row id is already inserted by the plugin bundle, so re-insert would create a
duplicate and the loader would reject it):
- id: dsh-telegram-channel-ru
name: dsh-telegram-channel-ru
config:
token: "<BotFather token>"
allowedUserIds: [123456789]
allowAllUsers: false
maxMessageLength: 4096
pollingTimeoutSec: 30
rendering: html
| Key | Environment variable | Meaning |
|---|---|---|
token | DSH_TELEGRAM_TOKEN | bot token; without it polling never starts |
allowedUserIds | DSH_TELEGRAM_ALLOWED_USER_IDS | numeric user ids allowed to talk to the bot; empty = nobody |
allowAllUsers | — | accept anyone; debugging only |
maxMessageLength | — | outgoing message chunk size, default 4096 |
pollingTimeoutSec | — | long-poll timeout, default 30 |
rendering | — | html (default, works in every client) or rich (Telegram native rich messages) |
users | — | list of people edited in the GUI: id, optional name, enabled; wins over the flat list |
name is required on an id-targeted row: without it the plugin manager cannot map
the row back to its loader entry and the settings form becomes read-only.
Open Plugins → dsh-telegram-channel-ru in the sidebar: the plugin card carries
the same settings as a page, so no YAML editing and no systemctl restart dsh.
.role('secret') fields from the settings
document, so the page only shows "saved" plus a live status line ("Connected as
@bot"); leaving the field empty keeps the current token. Check asks Telegram
again (getMe).@username (resolved server-side through getChat), or
click one of the "recently wrote to the bot" chips. A muted user stays listed but
is refused by the bot.html / rich.Saving is one atomic profile write that restates only the changed fields, so the
token is not rewritten on every edit. The plugin listens for
loader/volatile-update, stops the old bridge and starts a new one with the new
values — carrying the getUpdates offset over, so nothing is answered twice.
The page reads only non-secret facts from the host (getMe, names from getChat)
through two routes under /plugins/dsh-telegram-channel-ru/settings/ (info,
resolve); the token never travels through them. This needs DSH 0.2.x — 0.1.x has
no settings forms, and the section simply does not appear.
Everyone in the list shares the sessions. The bot does not separate access
between users: each allowlisted person sees every workspace and may attach to any
session, exactly as the single owner could. Add people deliberately and keep
allowAllUsers off.
| Command | What it does |
|---|---|
/start | welcome text and short usage hint |
/sessions | workspace list → session list → attach (archive and blank sessions hidden) |
/last | last question/answer of the attached session |
/model | switch the session's model (takes effect on the next turn) |
/status | model, reasoning effort, context pressure, TTFT, input/output tokens, cache hit |
/compact | compact the attached session's history (only while it is idle) |
/rich | on — rich rendering, off — HTML (this chat only, remembered) |
/reasoning | on/off — mirror the mode |