Для контрибьютора

Как устроена Unica

Агент говорит с Unica по MCP. Unica отвечает предметными инструментами, а тяжёлую работу отдаёт демону: он живёт дольше вызова, делит рабочие пространства и запускает движки.

Кто приходит и по какому протоколу

О версии протокола MCP договариваются в initialize. Unica принимает три версии протокола и отвечает той, которую попросил агент.

Codex MCP 2025-06-18 Claude Code MCP 2025-11-25 MCP Inspector версия MCP выбирается вручную initialize · согласование версии ОДИН ПУБЛИЧНЫЙ СЕРВЕР unica принимает версии MCP 2026-07-28 · 2025-11-25 · 2025-06-18; имя сервера и префикс инструментов не меняются

Длительные операции: два способа вернуться за результатом

Индекс BSL строится минутами, запуск 1С тоже. Инструмент отвечает раньше, чем закончит работу: отдаёт квитанцию и продолжает.

На уровне протокола

Агент спрашивает о задаче сам протокол — инструменты для этого не нужны. Так умеют клиенты, объявившие расширение задач (SEP-2663): в MCP оно появилось недавно.

Инструментами Unica

Клиент расширение не объявил — Unica добавляет в список три обычных инструмента unica.task.*. Они делают ровно то же: узнать состояние, забрать результат, отменить.

Выбирать не нужно: Unica смотрит, что объявил клиент, и сама решает, каким путём отвечать.

NATIVE TASKS Предметные инструменты Задача живёт в протоколе. Инструмент отвечает квитанцией, дальше агент спрашивает сам протокол. tasks/get tasks/result tasks/cancel Повторный вызов не перезапускает работу: квитанция адресует ту же durable-задачу. Способ появился в протоколе недавно: SEP-2663. У Unica он написан и включится сам, когда объявят. COMPATIBILITY Предметные инструменты + 3 tasks Агент задач протокола не объявляет — те же три операции приходят обычными инструментами. unica.task.get unica.task.result unica.task.cancel Отмена идемпотентна, ожидание ограничено интервалом, полезная нагрузка — до 16 KiB. Клиент не объявил поддержку задач — сервер добавляет эти три инструмента в список.

Что происходит внутри

Процесс MCP тонкий: он переводит кадры протокола в вызовы и обратно. Состояние, длительные операции и движки принадлежат демону, который переживает отдельный вызов.

unica · процесс MCP stdin/stdout, запускает агент protocol-v5 unica · демон один на пользователя, версию протокола и идентичность ядра РАБОЧИЕ ПРОСТРАНСТВА actor · worktree A source set · configuration + extensions actor · worktree B свой кеш, свои планы, свои квитанции ДВИЖКИ, КОТОРЫЕ ЗАПУСКАЕТ ДЕМОН RLM индекс и поиск по BSL bsl-analyzer диагностика v8-runner запуск 1С ibcmd 1cv8 DESIGNER Платформу 1С дёргает только v8-runner: собирает информационную базу через ibcmd, конфигурацию — конфигуратором.
ДвижокПроектЛицензияКак попадает в поставку
RLM Dach-Coin/rlm-tools-bsl MIT Собираем в тулчейне Unica из закреплённого тега.
bsl-analyzer itrous/bsl-analyzer LGPL-3.0-or-later Собираем в тулчейне Unica из закреплённого тега.
v8-runner IngvarConsulting/v8-runner-rust — форк alkoleft/v8-runner-rust AGPL-3.0-only Собираем в форке.

Каждая версия закреплена в tools.lock.json вместе с коммитом. AGPL у v8-runner лицензией Unica не заменяется: он запускается отдельным процессом и остаётся на своих условиях.

Почему демон, а не процесс на вызов

Индекс BSL строится минутами, а вызов агента живёт секунды. Демон переживает вызов, поэтому второй запрос попадает в готовый индекс, а длительная операция отвечает состоянием вместо обрыва.

Почему актор на рабочее пространство

У каждого worktree свой кеш и сохранённые планы правок. Актор изолирует состояние, а квитанции остаются адресуемыми внутри своего пространства.

Сколько живёт демон

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

Общий ли демон у Claude Code и Codex

Нет. Каталог состояния демон берёт от агента: у Codex он свой, у Claude Code свой — и процесс у каждого получается свой. Внутри одного агента демон, наоборот, один на все worktree: их разделяют акторы.

Сеть и данные

Три вопроса службы безопасности перед тем, как пустить инструмент в контур.

Что уходит с машины

  • Исходники остаются на диске. Unica читает, проверяет и пишет файлы локально и никуда их не отправляет.
  • С моделью говорит агент, Codex или Claude Code. Что он отправляет, задаёт его политика, а не Unica.
  • В сеть ходит только поиск по документации: стандарты разработки и база знаний 1С получают текст запроса. Оба поставщика выключаются в unica.toml.
  • Общие настройки для всех проектов можно вынести в отдельный TOML-файл. Задайте абсолютный путь к нему в UNICA_DOCUMENTATION_POLICY_FILE в окружении MCP-сервера. Поверх него накладываются unica.toml и unica.local.toml: это умолчания, которые проект может перекрыть.
  • После изменения переменной перезапустите демон Unica во всех использующих её хостах. Изменения содержимого уже выбранного файла применяются при следующем обращении к документации. Отсутствующий или неверный явно заданный файл вызывает отказ.
  • Настройка endpoint поддерживается у v8std. У kb-1ci она вызывает ошибку разбора: адрес базы знаний остаётся встроенным.
# unica.toml в корне проекта
[network]
default = "deny"

[providers.v8std]
network = "allow"

Что качается при установке

  • Ядро и движки приходят из релизов на GitHub, движки при первом вызове, которому они нужны. Других адресов у загрузчика нет.
  • Каждый архив и каждый файл сверяются по SHA-256. Неполная загрузка не считается готовой и повторяется.
  • Кеш лежит в каталоге данных агента и переживает обновление плагина.
  • Движок v8-runner умеет докачивать YAxUnit, Vanessa Automation и client MCP из их релизов на GitHub. Unica в версии 0.13 такую операцию не публикует, но агент может позвать v8-runner напрямую, в обход Unica: тогда загрузка идёт по правилам самого раннера.
Ядро
IngvarConsulting/unica
Движки
unica-toolchainv8-runner-rust
Откуда
github.com, страницы релизов
Проверка
SHA-256 на архив и каждый файл
По запросу
YAxUnit, Vanessa Automation, client MCP, через v8-runner

Без сети и за прокси

  • Для образа без сети ядро и движки скачиваются заранее на машине с доступом, каталог кеша переносится вместе с образом.
  • Загрузчик, доставка движков и сетевая справка проверяют сертификаты средствами ОС. Корень корпоративного шлюза, установленный в хранилище ОС, принимается так же, как браузером. На Linux хранилище — системный набор корней или файл из SSL_CERT_FILE; отзыв сертификатов там не проверяется. Если на Linux из хранилища ОС не загружен ни один корень, например в образе без пакета ca-certificates или при нечитаемом SSL_CERT_FILE, Unica проверяет цепочку по вшитому набору корней Mozilla. Корень шлюза тогда не принимается: установите набор корней ОС с ним или укажите его в SSL_CERT_FILE.
  • Прокси берётся из https_proxy/HTTPS_PROXY, затем all_proxy/ALL_PROXY. Узлы для прямого соединения перечисляет NO_PROXY, например localhost,127.0.0.1,.corp.example. Поддерживается только HTTP-прокси; подсети (CIDR) в NO_PROXY и системные настройки прокси Windows и macOS (PAC) не учитываются.
  • Если ОС не доверяет сертификату, отказ подскажет вероятную причину: HTTPS перехватывает антивирус или шлюз. Добавьте узел в исключения проверки HTTPS, установите корень шлюза в хранилище ОС или задайте прокси. Переменные и хранилище читаются при старте процесса Unica. Фоновый процесс общий для всех сессий и завершается через 15 минут без работы, поэтому после изменения закройте все сессии агента с Unica и подождите эти 15 минут или завершите фоновый процесс unica.
unica-bootstrap prefetch --plugin-root <каталог плагина>

Набор исходников

Набор исходников — именованный каталог с выгрузкой конфигурации или расширения. Наборов в проекте может быть несколько: рядом с основной конфигурацией лежат расширения и другие её версии.

Список наборов Unica не придумывает и не хранит у себя: она читает v8project.yaml, файл проекта v8-runner в корне, который уже описывает проект для запуска 1С. Одно описание работает и на запуск, и на адресацию.

Отсюда связь между адресом и диском: main:Catalog.Валюты читается в каталоге src, тот же справочник из другого набора — в каталоге этого набора. Инструменты работают с именем набора и никогда не получают путь.

# v8project.yaml
format: DESIGNER
source-set:
  - name: main
    type: CONFIGURATION
    path: src
  - name: ext
    type: EXTENSION
    path: src-ext
ПолеЧто задаёт
formatКак выгружены исходники: DESIGNER или EDT. Можно не писать, тогда действует умолчание v8-runner.
basePathОт чего считаются пути наборов. По умолчанию каталог самого файла.
nameИмя набора, оно же стоит слева от двоеточия в адресе. По умолчанию main.
typeCONFIGURATION или EXTENSION. Синоним поля purpose.
pathКаталог, в котором лежит выгрузка этого набора.

В версии 0.13 инструменты читают, проверяют и записывают только выгрузку конфигуратора. Набор в формате EDT распознаётся при подключении проекта, но не читается и не изменяется.

Семантическая адресация

Адрес называет объект так, как о нём думает разработчик: набор исходников, вид, имя. Путь к файлу в адрес не входит.

mainнабор исходников : Catalogвид . Валютыимя . Formвид . ФормаЭлементаимя . Itemвид . ГруппаСлужебнаяимя

Виды и имена чередуются, и так до нужной глубины. Последний вид может остаться без имени — тогда адрес указывает на всю ветку. Русские названия видов приводятся к английским токенам, прикладные имена остаются как написаны.

АдресЧто это
main:ConfigurationКорень конфигурации. Configuration стоит только здесь и больше нигде.
main:Catalog.ВалютыСам справочник.
main:Catalog.Валюты.AttributeВсе реквизиты справочника: вид без имени — это ветка.
main:Catalog.Валюты.Attribute.НаценкаОдин реквизит.
main:Catalog.Валюты.TabularSection.ПредставленияТабличная часть.
main:Catalog.Валюты.TabularSection.Представления.AttributeРеквизиты этой табличной части.
main:Report.АнализВерсийОбъектов.Template.МакетОтчетаМакет отчёта.
main:Report.АнализВерсийОбъектов.Template.ОсновнаяСхемаКомпоновкиДанных.DataSet.НаборДанных1.Field.ВерсияПоле набора данных внутри схемы компоновки. Глубина не ограничена.
main:Document.Заказ.Form.ФормаДокумента.Attribute.ОбъектРеквизит формы.
main:Catalog.Валюты.Form.ФормаЭлемента.Item.ГруппаСлужебнаяЭлемент формы.
main:CommonModule.GoogleПереводчик.Method.ПеревестиТекстМетод общего модуля.
epf:ExternalDataProcessor.Импорт.Module.Object.Method.ОбработкаПроверкиЗаполненияМетод модуля объекта внешней обработки. Слева другой набор исходников.
newer:Catalog.Валюты.Form.ФормаСпискаТот же объект в другом наборе исходников.

Предметные инструменты

Эту публичную поверхность Unica публикует в MCP.

ИнструментЧто делаетПочему так удобнее агенту
unica.viewПоказывает, что есть в проекте, и открывает объект по адресу: реквизиты, формы, макеты, код.Агент смотрит на объект, а не на файлы: не нужно знать, где что лежит на диске.
unica.resolveПереводит адрес в файл и файл в адрес. Поиска по имени здесь нет, только конвертация в обе стороны.Путь агент получает лишь тогда, когда без него не обойтись, а остальные инструменты работают с адресом.
unica.searchИщет по коду: текст или объявления процедур и функций. Можно искать внутри одного объекта.Ищет по коду, а не по строкам файла, и область поиска сужается до нужной ветки.
unica.diffПоказывает, чем отличаются два объекта одного вида.Сравнение без выгрузок во временные файлы, и ничего при этом не меняется.
unica.checkБез адреса проверяет, что проект принят в работу. С адресом гоняет по объекту все проверки его вида: модуль, форму, роль, СКД.Ошибки приходят списком, поэтому агент чинит их по одной и видит, что осталось.
unica.applyГотовит правку: добавить реквизит, изменить свойство, дописать код. Возвращает план без изменения исходников и executionToken; следующий вызов с токеном исполняет этот план.Агент видит правку до записи, а для исполнения передаёт один токен: адрес и операции уже сохранены в плане.
unica.runБез аргументов отдаёт словарь из двенадцати операций запуска: подготовить рабочее пространство, создать и собрать информационную базу, выгрузить и загрузить конфигурацию или расширение, снять и восстановить полный снимок базы, собрать поставку, запустить клиент. Операции, которые меняют файлы или базу, проходят через предпросмотр и исполнение по контракту словаря.Словарь приходит из кода вместе с отметкой, какие операции уже реализованы, поэтому агент не выдумывает команду, которой нет, и не зовёт ту, которой ещё нет.
unica.docsИщет сразу по четырём источникам: справка проекта в рабочем пространстве, синтакс-помощник установленной платформы и два сетевых — база знаний 1С и стандарты разработки.Локальные источники отвечают без сети, сетевые включаются политикой проекта. Результат разложен по источникам, поэтому видно, откуда взят ответ.
unica.testПланируется в версии 0.14, пока недоступен.
unica.featureПланируется в версии 0.14, пока недоступен.
unica.logПланируется в версии 0.14, пока недоступен.

Три инструмента совместимости

Эти три Unica публикует, когда клиент не объявил поддержку задач протокола.

ИнструментЧто делаетПочему так удобнее агенту
unica.task.getПоказывает, что с задачей сейчас, и отвечает сразу.Спросить «как там» можно в любой момент: работа не начнётся заново.
unica.task.resultЖдёт результат ограниченное время и возвращает его или новую квитанцию.Ожидание всегда конечно, поэтому агент не зависает и не теряет задачу.
unica.task.cancelПросит отменить задачу.Повторная отмена безопасна — можно звать, не проверяя прошлый ответ.

План и исполнение по токену

unica.apply вызывают дважды: сначала передают адрес и операции, затем — только токен сохранённого плана.

План — apply(at, ops)

Проверяет операции без записи в исходники. Возвращает, что именно изменится, и data.executionToken. Подготовленный план сохраняется в демоне.

Исполнение — apply(executionToken)

Проверяет актуальность исходников и исполняет сохранённый план. Адрес и операции повторять не нужно. Повтор токена возвращает тот же результат без повторной записи.

Между вызовами проект не блокируется. Если исходники изменились, исполнение откажет без записи — нужен свежий план. Токен действует пять минут в той же рабочей области и том же экземпляре демона; после истечения срока или перезапуска план получают заново. У unica.run отдельный контракт предпросмотра и исполнения, который публикует его словарь операций.

На чём проверено

Раздел заполняется после приёмки версии 0.13.

Здесь появятся: размер тестовой конфигурации приёмочного корпуса, самая крупная конфигурация, на которой Unica работала в реальном проекте, время первого и повторного вызова на ней, и пределы, если они есть.