Back to home@Mempemp

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
GitHub repo

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.jsonserverName
@wingsky-1/dsh-mcp-manager$DSH_HOME/dsh-mcp.jsonname

Запись создаётся при первом успешном запуске сервера, обновляется при смене порта, посторонние записи в файле сохраняются; оба менеджера перечитывают свой файл на ходу, без перезапуска DSH. Результат виден во вкладке, в блоке «Подключение к DSH». После удаления плагина запись остаётся в файле — удалите её в менеджере.

Для менеджеров, которых плагин не знает, сервер добавляется вручную:

Способ 1 — через UI (рекомендуется). Settings → MCP Server ManagerAdd → транспорт 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 (порт из вкладки) → значения из строки плагина → встроенные.

Использование

  1. Установите плагин и добавьте MCP-сервер (см. «Как подключить сервер к DSH»). rlm-tools-bsl при отсутствии поставится сам.
  2. Перезапустите DSH — в Settings появится вкладка «rlm-tools-bsl», сервер поднимется автоматически.
  3. Проверьте статус: первый запуск может пройти через «устанавливается rlm-tools-bsl…», дальше — «работает (pid …, v1.35.1)». Ошибка — текст и хвост лога на той же вкладке.
  4. Закройте 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 в сеть без токена.
  • Плагин не завершает чужие процессы: занятый порт — только диагностика.