DSH-runner-rlm-tools-bsl
Плагин DeepSeek Harness: MCP-сервер rlm-tools-bsl (анализ кода 1С) запускается и останавливается вместе с DSH
- Stars
- 0
- Language
- JavaScript
- Created
- Sep 10, 2026
- Updated
- Sep 10, 2026
Introduction
dsh-rlm-tools-bsl
rlm-tools-bsl живёт ровно столько, сколько работает DeepSeek Harness.
Плагин-раннер для DSH: поднимает MCP-сервер rlm-tools-bsl (токен-эффективный анализ кодовых баз 1С) при старте DSH, гасит его вместе с DSH и показывает во вкладке настроек состояние сервера и параметры для MCP-конфига. Сервер не регистрируется как служба Windows: он запускается процессом DSH и завершается вместе с ним.
Возможности
🔁 Сервер поднимается и гаснет вместе с DSH
При старте DSH плагин запускает rlm-tools-bsl --transport streamable-http на локальном порту (по умолчанию 9330) и ждёт готовности по MCP-рукопожатию. При остановке DSH процесс гасится целым деревом (uv-трамплин → python → uvicorn), так что порт освобождается.
⚙️ Вкладка «rlm-tools-bsl» в настройках
Статус (работает процесс плагина / подхвачен внешний / остановлен / порт занят / ошибка), версия и pid, кнопка «Перезапустить», поле порта и готовый JSON для MCP-менеджера с кнопкой «Скопировать». При ошибке тут же — текст ошибки и последние строки лога. Настройка самого сервера остаётся в его собственных конфигах.
📦 Автоустановка сервера
Если rlm-tools-bsl в системе нет, плагин ставит его сам — вместе с uv, если нет и его. Отключается ключом autoInstall: false.
🔎 Подхват уже запущенного сервера и takeover
Если сервер уже отвечает на порту (остался от прошлой сессии), плагин не поднимает второй, а подхватывает существующий — и всё равно гасит его при выходе DSH (сервер на нашем порту считается своим; отключается ключом takeover: false в строке плагина). Отличает «свой» сервер от чужого по MCP-рукопожатию: /health отдаёт generic {"status":"ok"}, а имя и версию знает только initialize.
🔗 Автопрописка в менеджер MCP
Плагин сам ведёт запись rlm в хранилище установленного менеджера MCP и обновляет её при смене порта; посторонние записи не трогаются. Отключается ключом mcpAutoRegister: false.
🚧 Занятый порт
Порт занят посторонним приложением — вкладка показывает, кто именно (имя процесса и pid), со ссылкой на лог для остальных ошибок запуска.
🔌 Роуты /rlm/* для других плагинов и агентов
GET /rlm/state — состояние и параметры, GET /rlm/log?tail=N — хвост лога, POST /rlm/start|stop|restart, POST /rlm/save — порт.
Как подключить сервер к DSH (MCP)
Плагин сам ведёт запись сервера в хранилище установленного менеджера MCP — шаг «Add» вручную не нужен:
| Менеджер | Хранилище | Поле имени |
|---|---|---|
dsh-mcp-manager | $DSH_HOME/mcp-servers.json | serverName |
@wingsky-1/dsh-mcp-manager | $DSH_HOME/dsh-mcp.json | name |
Запись создаётся при первом успешном запуске сервера, обновляется при смене порта, посторонние записи в файле сохраняются; оба менеджера перечитывают свой файл на ходу, без перезапуска DSH. Результат виден во вкладке, в блоке «Подключение к DSH». После удаления плагина запись остаётся в файле — удалите её в менеджере.
Для менеджеров, которых плагин не знает, сервер добавляется вручную:
Способ 1 — через UI (рекомендуется). Settings → MCP Server Manager → Add → транспорт streamable-http, имя rlm, URL:
http://127.0.0.1:9330/mcp
Способ 2 — строкой в файл ~/.dsh/mcp-servers.json (файл горячо перечитывается, перезапуск не нужен). Добавьте объект в массив servers:
{
"serverName": "rlm",
"transport": "streamable-http",
"url": "http://127.0.0.1:9330/mcp",
"enabled": true
}
Целиком для пустого файла:
{
"version": 1,
"servers": [
{
"serverName": "rlm",
"transport": "streamable-http",
"url": "http://127.0.0.1:9330/mcp",
"enabled": true
}
]
}
Имя rlm даёт инструменты mcp__rlm__rlm_start, mcp__rlm__rlm_execute, mcp__rlm__rlm_help, mcp__rlm__rlm_projects, mcp__rlm__rlm_index, mcp__rlm__rlm_end.
Порт в URL должен совпадать с портом из вкладки (по умолчанию 9330). Формат файла и имена полей задаёт сам менеджер — при сомнениях добавляйте сервер через его UI.
Способ 3 — статическая строка профиля (если MCP-менеджер не используется) — в ~/.dsh/profiles/web/cordis.patch.yml:
- insert:
- id: mcp-rlm
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: rlm
transport: streamable-http
url: http://127.0.0.1:9330/mcp
Способ 3 не зависит от MCP-менеджера — это подключение средствами самого DSH. Способы 1 и 3 не комбинируйте: два MCP-сервера с одинаковым serverName конфликтуют.
Установка
Нужны dsh ≥ 0.1.2-rc.1 и установленный rlm-tools-bsl (ниже). Ставится тремя способами — результат один и тот же.
Из релиза (скачивать ничего не нужно):
dsh plugin --profile web add https://github.com/Mempemp/DSH-runner-rlm-tools-bsl/releases/download/v0.1.3/dsh-rlm-tools-bsl-0.1.3.tgz
Локальный архив dsh-rlm-tools-bsl-0.1.3.tgz (скачан со страницы релизов или собран самому: cd dsh-rlm-tools-bsl && npm pack):
dsh plugin --profile web add dsh-rlm-tools-bsl-0.1.0.tgz
Папка плагина (режим разработки, правки в lib/*.js подхватываются без переустановки):
dsh plugin --profile web add <путь к папке>/dsh-rlm-tools-bsl
После установки перезапустите DSH (композиция плагинов читается на старте) и обновите страницу в браузере.
Установка самого rlm-tools-bsl
Если сервера в системе нет, плагин ставит его сам при первом запуске (см. «Автоустановка»). Ручная установка нужна, когда версию и место выбираете вы:
Нужен uv — Python 3.10+ uv скачает сам, если его нет в системе:
# uv, если его ещё нет (без админ-прав)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
uv tool install rlm-tools-bsl # установка
uv tool upgrade rlm-tools-bsl # обновление уже установленного
rlm-tools-bsl --version # нужна версия ≥ 1.35
Повторный uv tool install уже установленный пакет не обновляет (rlm-tools-bsl is already installed) — для обновления нужен uv tool upgrade.
Изолированное окружение uv: исполняемый файл — %USERPROFILE%\.local\bin\rlm-tools-bsl.exe, служба не регистрируется. Плагин ищет файл сам: PATH → %USERPROFILE%\.local\bin → своя папка bin (см. «Автоустановка»). Другой путь задаётся ключом command в строке плагина (см. «Продвинутые параметры»). После обновления пакета — «Перезапустить» во вкладке.
Служба Windows (
simple-install-from-pip.ps1) не требуется. Если она установлена:rlm-tools-bsl service status— состояние,rlm-tools-bsl service stop— остановка,rlm-tools-bsl service uninstall— удаление. Остановки недостаточно: служба с типом запуска «Автоматически» поднимется при следующей загрузке Windows.
Данные и файловая песочница
rlm-tools-bsl пишет вне рабочей папки: service.json и projects.json — в %USERPROFILE%\.config\rlm-tools-bsl, лог — в %USERPROFILE%\.config\rlm-tools-bsl\logs\server.log, кэш — в %USERPROFILE%\.cache\rlm-tools-bsl. Каталог логов должен быть доступен на запись: если запись запрещена (файловая песочница DSH), сервер завершается с кодом 1 и PermissionError в хвосте лога.
Перенаправление — переменные окружения в строке плагина: RLM_CONFIG_FILE переносит конфиг, лог и кэш рядом с собой, RLM_INDEX_DIR — каталог SQLite-индексов.
- id: rlm-tools-bsl
name: 'dsh-rlm-tools-bsl'
config:
env:
RLM_CONFIG_FILE: D:\rlm-data\service.json # лог: D:\rlm-data\logs, кэш: D:\rlm-data\cache
RLM_INDEX_DIR: D:\rlm-data\index
Автоустановка
Если при запуске команда не найдена, плагин сам ставит rlm-tools-bsl в $DSH_HOME/rlm-tools-bsl:
bin— исполняемые файлы:rlm-tools-bsl.exe,rlm-bsl-index.exe, а когда uv в системе нет — ещё иuv.exe(ставится официальным скриптом, PATH не меняется);tool— окружение инструмента;python— Python, если подходящего системного не нашлось.
Установка идёт в фоне: вкладка показывает состояние «устанавливается rlm-tools-bsl…», вывод и ошибки — в хвосте лога. Ключ autoInstall: false в строке плагина выключает автоустановку — тогда при отсутствии сервера вкладка показывает ошибку с командой для ручной установки.
Если dsh не в PATH
Локальная установка и DSH Desktop не добавляют dsh в PATH — вызывайте точку входа через node. Путь к bin.js:
| Как установлен DSH | Путь к bin.js |
|---|---|
локально (npm install @deepseek-ai/dsh) | <папка установки>\node_modules\@deepseek-ai\dsh\lib\bin.js |
| DSH Desktop | %LOCALAPPDATA%\Programs\DSH Desktop\resources\app\node_modules\@deepseek-ai\dsh\lib\bin.js |
node "C:\путь\к\dsh\lib\bin.js" plugin --profile web add "C:\путь\к\dsh-rlm-tools-bsl-0.1.0.tgz"
Возможные сложности
| Симптом | Что делать |
|---|---|
ERR_PNPM_UNEXPECTED_STORE | добавить --store-dir="<путь к вашему pnpm store>" к команде установки (путь назван в тексте самой ошибки) |
EPERM при записи в …\profiles\web | нет прав на папку профиля (песочница, антивирус): закрыть DSH, разрешить запись, повторить |
Предупреждения про peer-зависимости (cordis, react, react-dom) | игнорировать: внешних зависимостей у плагина нет, react приходит из рантайма DSH |
| Путь к архиву содержит пробелы | ломается на .cmd-шиме pnpm — положите архив в путь без пробелов или поставьте папкой |
После установки в dsh.profile.bundles появились лишние пакеты | dsh plugin add перезаписывает список слоёв: плагины, которые dshmarket держал «горячими» (.dsh-market\hot-*.yml), получают постоянную активацию. Ненужные строки можно удалить из package.json профиля, на работу плагина это не влияет |
| Вкладки нет после установки | DSH не перезапущен либо страница не перезагружена жёстко (Ctrl+Shift+R) |
| Статус «порт занят» | порт держит другой процесс (например, служба rlm-tools-bsl или чужое приложение) — во вкладке видно имя и pid; остановите его или смените порт |
Сервер падает с кодом 1, в логе PermissionError на …\.config\rlm-tools-bsl\logs | каталог недоступен на запись (файловая песочница DSH): разрешите путь или задайте RLM_CONFIG_FILE и RLM_INDEX_DIR в переменных окружения плагина — см. «Данные и файловая песочница» |
| Служба rlm-tools-bsl поднимается сама после перезагрузки | служба установлена с типом запуска «Автоматически»: rlm-tools-bsl service uninstall, см. «Установка самого rlm-tools-bsl» |
Проверка, что хост-часть поднялась: curl -s http://127.0.0.1:<порт>/rlm/state — должен вернуться JSON с состоянием сервера. <порт> — порт веб-UI DSH (по умолчанию 3080, у DSH Desktop может быть другим — он виден в адресной строке браузера), а не порт MCP-сервера.
Параметры
Во вкладке настраивается одно поле — порт (port), он же попадает в URL для MCP. Значения хранятся на машину: $DSH_HOME/rlm-tools-bsl/settings.json ($DSH_HOME — переменная окружения, иначе ~/.dsh).
Порт по умолчанию — 9330; у самого rlm-tools-bsl — 9000. Порт задаётся во вкладке и попадает в URL для MCP.
Продвинутые параметры — строкой плагина
Ключи задаются только в строке плагина в cordis.patch.yml профиля (UI для них нет):
- id: rlm-tools-bsl
name: 'dsh-rlm-tools-bsl'
config:
command: D:\tools\rlm\rlm-tools-bsl.exe # свой путь к исполняемому файлу
port: 9330
env: # переменные окружения сервера, см. «Данные и файловая песочница»
RLM_LLM_MODEL: deepseek-chat # пример: любой ключ RLM_* для самого сервера
takeover: true # гасить вместе с DSH даже подхваченный процесс
autoInstall: true # ставить rlm-tools-bsl самому, если его нет
mcpAutoRegister: true # вести запись rlm в хранилище менеджера MCP
Приоритет при конфликте: значения из settings.json (порт из вкладки) → значения из строки плагина → встроенные.
Использование
- Установите плагин и добавьте MCP-сервер (см. «Как подключить сервер к DSH»).
rlm-tools-bslпри отсутствии поставится сам. - Перезапустите DSH — в Settings появится вкладка «rlm-tools-bsl», сервер поднимется автоматически.
- Проверьте статус: первый запуск может пройти через «устанавливается rlm-tools-bsl…», дальше — «работает (pid …, v1.35.1)». Ошибка — текст и хвост лога на той же вкладке.
- Закройте DSH — сервер остановлен, порт освобождён. MCP-менеджер сам переподключится при следующем старте.
Требования
- DeepSeek Harness (
dsh webили DSH Desktop) ≥ 0.1.2-rc.1 — вкладка использует слотsettings.section - Node.js ≥ 20
- rlm-tools-bsl ≥ 1.35 — при отсутствии плагин ставит его сам (см. «Автоустановка»); для ручной установки нужен uv
HTTP-роуты
| Метод и путь | Назначение |
|---|---|
GET /rlm/state | состояние сервера, действующие параметры, пути, хвост лога |
GET /rlm/log?tail=N | хвост лога процесса (по умолчанию 200 строк, максимум 500) |
POST /rlm/start | запустить сервер (или подхватить уже запущенный) |
POST /rlm/stop | остановить сервер (включая подхваченный, если включён takeover) |
POST /rlm/restart | перезапустить |
POST /rlm/save | {settings:{port}} — сохранить порт |
Структура репозитория
dsh-rlm-tools-bsl/lib/index.js— host-часть (ESM): жизненный цикл процесса, пробы готовности, роуты/rlm/*.dsh-rlm-tools-bsl/lib/client.js— клиентская часть: секцияsettings.section(«rlm-tools-bsl») со статусом, перезапуском, портом и сниппетом MCP.dsh-rlm-tools-bsl/cordis.patch.yml— строка монтирования плагина в композицию профиля.dsh-rlm-tools-bsl/tests/_http.mjs— E2E хост-части без DSH: мокctx.webServer+ реальный сервер rlm-tools-bsl (node tests/_http.mjs).dsh-rlm-tools-bsl/README.md— описание пакета (то же, что и в архиве релиза).
Внешних зависимостей нет: только node:* и React из рантайма DSH.
Безопасность
- Сервер
rlm-tools-bslслушает127.0.0.1— наружу не выходит. - Хост-роуты доступны локально без токена сессии (как и роуты других плагинов через
ctx.webServer.register) — не выставляйте DSH в сеть без токена. - Плагин не завершает чужие процессы: занятый порт — только диагностика.