Протокол языкового сервера (LSP)

Hermes запускает полноценные языковые серверы — пирайт, гоплс, ржавчин-анализатор, typescript-language-server, clangd и ещё ~20 — как фоновые подпроцессы и передаёт их семантическую коррекцию в пост-записную проверку lint, Используем write_file и patch. Когда агент редактирует файл, он видит именно те ошибки, которые принес этот редактор — не только синтаксические ошибки, но и ошибки типа, неопределенные имена, отсутствующие импорты и семантические проблемы на уровне всего проекта, которые обнаруживают языковой сервер.

В этой же архитектуре используются лучшие кодирующие агенты. Гермес делает это самодостаточно: не требуется хост-редактор, не нужно хранить штепсельные вилки, не нужно управлять тяжелым демоном.

Когда запускается LSP

LSP включается при обнаружении git-рабочего пространства. Когда каталог агента (или редактируемый файл) находится внутри git-репозитория, LSP работает с этим необходимым пространством. Когда ни то, ни другое не находится в git-репозитории, LSP остается неактивным — полезно для шлюза обмена сообщениями, где текущая рабочая директория — это домашняя директория пользователя и нет проекта для диагностики.

Проверка многоуровневая: сначала внутрипроцессная синтаксическая проверка (микросекунды), затем диагностика LSP, когда синтаксис чист. Неисправный или отсутствующий никогда языковой сервер не может сломать запись — каждый путь отклоняет LSP бесшумно возвращается к результату только синтаксической проверки.

Конкретно, при каждом успешном write_file или patch:

  1. Гермес захватывает базовый уровень текущего сигнала для файла.
  2. Выполняет запись.
  3. Повторно опрашивает языковой сервер, отфильтровывает обследование, которое уже было на базовом уровне, и показывает только новые.

Агент видит вывод, ведущий это:

{
  "bytes_written": 42,
  "dirs_created": false,
  "lint": {"status": "ok", "output": ""},
  "lsp_diagnostics": "LSP diagnostics introduced by this edit:\n<diagnostics file=\"/path/to/foo.py\">\nERROR [42:5] Cannot find name 'foo' [reportUndefinedVariable] (Pyright)\nERROR [50:1] Argument of type \"str\" is not assignable to \"int\" [reportArgumentType] (Pyright)\n</diagnostics>"
}

Поле lint несёт результат синтаксической проверки (микросекундный внутрипроцессный разбор через ast.parse, json.loads и т.д.); поле lsp_diagnostics несёт семантическую оценку от реальной языкового сервера. Два канала, независимые сигналы — агент видит синтаксически чистый файл с семантическими проблемами как lint: ok плюс заполненный lsp_diagnostics.

Поддерживаемые языки

Язык Сервер Автоустановка
Питон pyright-langserver НПМ
TypeScript/JavaScript/JSX/TSX сервер-языка машинописного текста НПМ
Вуэ @vue/language-server НПМ
Стройная svelte-language-server НПМ
Астро @astrojs/language-server НПМ
Перейти гоплс иди установи
Ржавчина анализатор ржавчины вручную (ржавчина)
Си/С++ клангд вручную (LLVM)
Баш/Зш bash-язык-сервер НПМ
ЯМЛ yaml-язык-сервер НПМ
Луа lua-язык-сервер вручную (выпуски GitHub)
PHP интелефенс НПМ
OCaml ocaml-lsp вручную (опам)
Докерфайл dockerfile-language-server-nodejs НПМ
Терраформировать терраформ-лс вручную
Дарт dart языковой сервер вручную (dart SDK)
Хаскелл язык-хаскелл-сервер вручную (ghcup)
Юлия Джулия + LanguageServer.jl вручную
Кложур clojure-lsp вручную
Никс никсд вручную
Зиг злс вручную
Блеск блеск лсп вручную (блеск установить)
Эликсир эликсир-ls вручную
Призма языковой сервер Prisma вручную
Котлин котлин-язык-сервер вручную
Ява jdtls вручную

Для «вручной» записи установите сервер через соответствующий менеджер инструментов для этого языка (rustup, ghcup, opam, Brew, …). Hermes автоматически обнаруживает бинарник в PATH или в <HERMES_HOME>/lsp/bin/.

Некоторые серверы поддерживаются вместе с зависимостью, которую npm не вытягивает автоматически. Текущий случай — typescript-language-server, который требует, чтобы SDK typescript был импортируемым из того же самого дерево node_modules — Hermes устанавливает оба пакета вместе, когда вы Запустите «hermes lsp install typescript» или автоустановку при первом использовании.

интерфейс командной строки

hermes lsp status          # состояние сервиса + статус установки для каждого сервера
hermes lsp list            # реестр, опционально --installed-only
hermes lsp install <id>    # немедленно установить один сервер
hermes lsp install-all     # попробовать каждый сервер с известным рецептом
hermes lsp restart         # завершить работающие клиенты
hermes lsp which <id>      # вывести разрешённый путь к бинарнику

hermes lsp status — лучшая отправная точка — он показывает, какие языки будут получать семантическую оценку сегодня, а для каких необходимо установить бинарник.

Конфигурация

Настройки по умолчанию работают для типичных конфигураций; ничего задавать не нужно, если бинарники находятся в PATH.

# config.yaml
lsp:
  # Главный переключатель. Отключение пропускает всю подсистему — никакие серверы
  # не запускаются, фоновый цикл событий не работает.
  enabled: true

  # Как долго ждать диагностики после каждой записи.
  wait_mode: document      # "document" или "full"
  wait_timeout: 5.0

  # Как обрабатывать отсутствующие бинарники серверов.
  #   auto    — установить через npm/pip/go install в <HERMES_HOME>/lsp/bin
  #   manual  — использовать только бинарники, уже находящиеся в PATH
  install_strategy: auto

  # Переопределения для каждого сервера (все опциональны).
  servers:
    pyright:
      disabled: false
      command: ["/abs/path/to/pyright-langserver", "--stdio"]
      env: { PYRIGHT_LOG_LEVEL: "info" }
      initialization_options:
        python:
          analysis:
            typeCheckingMode: "strict"
    typescript:
      disabled: true       # пропускать TS, даже если его расширения совпадают

Ключи для каждого сервера

Места установки

Когда install_strategy: auto, Hermes устанавливает бинарники в <HERMES_HOME>/lsp/bin/. NPM-пакеты рассматриваются в <HERMES_HOME>/lsp/node_modules/ с симлинками в бинарниках на один уровень выше. Го-бинарники ведут из go install с GOBIN, указывающим на промежуточный каталог.

Ничего никогда не настраивается в /usr/local/, ~/.local/ или любом другом общее место — промежуточный каталог полностью принадлежит Hermes и удаляется при сбросе профиля.

Характеристики производительности

Серверы LSP лениво происходят при первом использовании. Редактирование Python-файла в проекте, который никогда не видел трафика .py, запускает пирайт; запуск занимает 1-3 секунды для большинства серверов (анализатор ржавчины может занимать 10+ холодно нам проект). Последующие правки в том же рабочем пространстве снова использовать рабочий сервер.

Слой LSP добавляет несколько миллисекунд к чистым записям, когда диагностика не выполняется. выдаётся. Когда диагностика выдается, бюджет ожидания составляет wait_timeout секунд — обычно сервер отвечает за десять миллисекунд дляpyright/tsserver и за несколько секунд для ржавчина-анализатор во время индексации.

Серверы используются в течение всего времени существования процесса Гермеса. Нет сборщик по таймауту бездействия — стоимость перезапуска индекса сервера в каждой записи было бы намного выше, чем удержание демона.

Отключение

Установите lsp.enabled: false в config.yaml, чтобы отключить все подсистему. Постзаписная проверка возвращается к внутрипроцессной синтаксической сторону (ast.parse для Python, json.loads для JSON и т.д.), которая увеличение без изменений из-за более осторожного подхода.

Чтобы отключить один язык без отключения всего слоя:

lsp:
  servers:
    rust-analyzer:
      disabled: true

Устранение неполадок

hermes lsp status показывает сервер как "отсутствующий"

Бинарник отсутствует в PATH и не находится в <HERMES_HOME>/lsp/bin/. Запустите hermes lsp install <server_id>, чтобы граждане выполнили автоустановку или установили бинарник вручную через обычный инструментарий языка.

Раздел Backend alerts в hermes lsp status

Некоторые серверы называются тонкими обёртками вокруг внешнего CLI для фактической Диагностика — они проявляют чистоту и принимают указания, но никогда не выдают ошибка, когда вспомогательный бинарник отсутствует. Самый распространённый случай — это bash-language-server, который делегирует проверку shellcheck. Когда hermes lsp status покажет раздел Backend alerts, установите именованный инструмент через пакет менеджера вашей ОС:

apt install shellcheck      # Debian / Ubuntu
brew install shellcheck     # macOS
scoop install shellcheck    # Windows

То же предупреждение регистрируется один раз при запуске сервера в ~/.hermes/logs/agent.log.

Сервер запускается, но никогда не сохраняет результаты

Проверить ~/.hermes/logs/agent.log на наличие записей [agent.lsp.client] — Использование stderr от языкового сервера, а также ошибок протокола. Некоторые серверы (особенно анализатор ржавчины) должны обрабатывать индексацию всего проекта, прежде чем они выполнят проверку для каждого файла; первое изменение после запуска сервера может образоваться без диагностики, а другая правки ее подхватят.

Сервер упал

Упавший сервер включается в набор сломанных и не будет повторно запущен до конца сессия. Запустите hermes lsp restart, чтобы сохранить набор; следующее изменение перезапустить его.

Редактирование файла вне любой git-репозитории

По дизайну LSP работает только внутри git-репозитория. Если проект ещё не Разработано, запустите git init, чтобы включить проверку LSP. В противном случае применять внутрипроцессный запасной вариант только с синтаксической проверкой.