Пакет, manifest и grants
Идентичность BTP, запрошенные возможности и точные пути данных.
Состав BTP
BTP - архив tar.zst с manifest, одним готовым Linux executable и схемами. Архив исходников .tar.gz нельзя загружать вместо BTP. Для каждой платформы собирайте отдельный пакет.
plugin.toml
bin/plugin
schemas/config.schema.json
schemas/ui.schema.jsonПолный manifest стартера
[plugin]
id = "io.example.community-starter"
version = "0.1.0"
name = "Community Starter"
description = "Subscribe to a numeric leaf and publish processed telemetry"
publisher = "Community example (not BlueTraktor authorization)"
singleton = false
[api]
min_major = 1
min_minor = 2
max_major = 1
max_minor = 2
[[targets]]
platform = "linux-aarch64-debian"
entrypoint = "bin/plugin"
[[capabilities]]
name = "usepi.subscribe:config:/sourceServerId:/sourcePath"
reason = "Receive changes to only the chosen test numeric leaf"
required = true
[[capabilities]]
name = "mqtt.publish:config:/destinationServerId:/destinationTopic"
reason = "Publish test telemetry, not device commands"
required = true
[schemas]
config = "schemas/config.schema.json"
ui = "schemas/ui.schema.json"Идентичность и версия
Используйте стабильный lowercase reverse-domain ID своего пространства имен. ID совпадает с PLUGIN_ID в src/main.rs, версия manifest - с Cargo.toml. Идентичность установленного пакета включает SHA-256. Любое изменение binary, manifest или схем после выпуска требует новой SemVer-версии. Другая сборка с прежними ID и версией может получить конфликт digest.
singleton = false допускает несколько экземпляров. Каждый настраивается и получает доступ отдельно. Поле publisher описывает издателя, но само по себе не дает доверия или системных полномочий.
Соответствие config и scope
| Config | Связь с capability |
|---|---|
| sourceServerId | ID сразу после usepi.subscribe: |
| sourcePath | Оставшиеся сегменты USEPI scope, разделенные / |
| destinationServerId | ID сразу после mqtt.publish: |
| destinationTopic | Оставшаяся часть MQTT scope; регистр значим |
Явные grants
В API 1.2 специальная форма config:/serverField:/pathField ссылается на поля настроек через JSON Pointer. Менеджер раскрывает ее в точный scope, например usepi.subscribe:demo-source/device/temperature/value. Это не произвольная подстановка и не wildcard. required = true блокирует запуск без разрешения, но не выдает разрешение автоматически.
Для каждого экземпляра администратор проверяет и подтверждает конкретные пути. Изменение привязки снимает прежнее подтверждение и требует нового, но не пересборки BTP. session.start.grants содержит раскрытые точные права. Стартер проверяет их и отклоняет несовпадение с EXACT_GRANT_REQUIRED. Один пакет можно использовать с разными серверами.
sourcePath в этом стартере - массив сегментов. Идентификаторы серверов: 1..96 ASCII букв, цифр, дефисов или _. Полный раскрытый capability - не более 256 UTF-8 байт. Стартер допускает до 16 сегментов по 64 символа, запрещает первый root, начало $, .., пустые сегменты, пробелы, /, :, *, + и #. Указатель config не должен содержать escaped-ключи или prototype-поля.
Не добавляйте неподдерживаемые поля
Обычный стартер не объявляет contributions и resources. Второй executable, неизвестные поля manifest и неподтвержденные contributions отклоняются при inspection. Не включайте scripts, node_modules, .env, исходники или произвольный frontend в дерево готового BTP.