Mempemp/DSH-runner-rlm-tools-bsl

DSH-runner-rlm-tools-bsl

Плагин DeepSeek Harness: MCP-сервер rlm-tools-bsl (анализ кода 1С) запускается и останавливается вместе с DSH

未分類1cbsldeepseek-harness

dsh-rlm-tools-bsl

!!Данный плагин переехал целиком в https://github.com/Mempemp/DSH-1CProjectProperties!!

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» вручную не нужен:

Менеджер · Хранилище · Поле имени @wingsky-1/dsh-mcp-manager 0.2.5 и новее · $DSH_HOME/@wingsky-1/dsh-mcp-manager/mcp.json · name @wingsky-1/dsh-mcp-manager до 0.2.5 · $DSH_HOME/dsh-mcp.json · name dsh-mcp-manager · $DSH_HOME/mcp-servers.json · serverName

Раскладку плагин определяет сам: по папке менеджера, по оставшемуся файлу-предшественнику или по версии установленного пакета. С 0.2.5 менеджер держит список в своей папке, файл в корне $DSH_HOME он переносит туда сам и убирает — запись, сделанная в него сейчас, до панели не дошла бы.

Запись создаётся при первом успешном запуске сервера, обновляется при смене порта, посторонние записи в файле сохраняются; оба менеджера перечитывают свой файл на ходу, без перезапуска 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.4/dsh-rlm-tools-bsl-0.1.4.tgz

Локальный архив dsh-rlm-tools-bsl-0.1.4.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; проверено на 1.46.0

Повторный uv tool install уже установленный пакет не обновляет (rlm-tools-bsl is already installed) — для обновления нужен uv tool upgrade.

Обновление до 1.42.0 пересобирает индексы. Схема индекса выросла до v17, поэтому сборка
прежней версией уходит в полную пересборку при первом обращении к проекту, а сессию,
открытую до неё, нужно переоткрыть. Пересборка идёт один раз на каждый проиндексированный
каталог и стала примерно вдвое быстрее. До неё сервер работает: rlm_start предупреждает и
перечисляет, чего в индексе нет, — граф вызовов не видит запусков процедур по имени и
вызовов через коллекцию менеджера, аудит find_unresolved_calls недоступен.
Раньше то же самое делало обновление 1.37 → 1.38 (схема 15 → 16): сборка прежней версии
уходит в пересборку целиком.
С 1.43 пересборка не нужна. Пакеты 1.43–1.46 схему индекса (v17) и формат данных не
трогали, поэтому обновляться на них можно без пересборки. Меняется поведение двух
инструментов: count_matches с 1.43 по умолчанию не учитывает регистр (ignore_case=True, язык
1С регистронезависим), а его source на смешанном наборе файлов принимает значение
index+live. Обе правки — в пользу корректности ответа, вызовы плагина они не меняют.

Изолированное окружение 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="" к команде установки (путь назван в тексте самой ошибки) 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-сервера.