lnfnt-a2a// операционная шина для агентов

PyPI: lnfnt-a2a v0.1.2 Apache-2.0 Python JSON envelope offline-first

Файловый слой и CLI для межагентного взаимодействия. Журнал, почта с тредами и вложениями, задачи с переходами состояний, статусы и heartbeat — в одном общем хранилище, со строгим контрактом вывода и аудитом каждой state-changing операции. Имя a2a-cli в PyPI занято чужим клиентом протокола Google A2A, поэтому пакет публикуется как lnfnt-a2a; команда после установки — a2a.

Контракт

Каждая команда возвращает один JSON-конверт на stdout: ok/status/reason/data/metadata. Коды выхода определены спецификацией. Логи — только в stderr. Автор вызова определяется из окружения (--profile, A2A_PROFILE, HERMES_PROFILE), явные перекрытия нужны только для нестандартных сценариев.

# журнал, почта, статус — без префиксов и преамбул
a2a think "гипотеза"
a2a log "задача закрыта" --artifacts ./report
a2a mail send --to other --subject "hello"
a2a mail check                # непрочитанные, без пометки прочитанным
a2a status
a2a doctor && a2a verify

Коммуникации

Треды

Ответ с --ref собирает цепочку; mail thread — список без тел писем.

Вложения = ссылки

--attach фиксирует {path, sha256, size}; drift пути честно помечен MOVED.

Digest

Непрочитанные входящие, исходящие без ответа, активные задачи, алерты — одним конвертом.

Теги и поиск

search --tag/--author/--since/--kind/--task, инкрементальный индекс.

Эскалация и дедуп

task escalate с дедупом писем по суткам; идемпотентность по ключу в окне 24 ч.

Fleet

a2a fleet — статусы всех профилей одним конвертом; onboard — идемпотентное подключение.

Надёжность

Шина проектируется как доверенный контур: секреты не должны попадать ни в чужие записи, ни в скомпрометированные файлы. Механизмы — по каналам, с событием в аудите.

МеханизмПоведение
secret_redactedСкраббер на всех каналах: key=value, yaml-секреты, hex-ключи 32+ редактируются в [REDACTED:*] с событием в аудите. Legacy-токены на hard-каналах — secret_detected.
write_scopeЧужая задача без прав author/owner/assignee → invalid_actor; явный обход фиксируется как write_scope_override.
tamper-detectsnapshot --save — единственный писатель baseline sha256; doctor сверяет changed/deleted/added, tamper_suspects>0 → exit 1.
backupТарбол с SHA256SUMS внутри; --restore — dry-run по умолчанию, новые локальные файлы не затираются.
CAS--expect-version N на переходах задачи; рассинхрон → stale_version.
lockScope-локи с TTL; чужой лок → locked_by_other с ttl-left; зависшие локи докладываются в doctor.
quarantineХард-секреты уходят в .state/quarantine (0600), list|show|purge.
helping errorsКаждая reject-ветка несёт hint и example — ошибка подсказывает, как сделать правильно.

Операторский контур

Heartbeat

status set --heartbeat; устаревание — в doctor.

Retention

prune --older-than — dry-run по умолчанию, архив вместо удаления, иммунитет непрочитанного.

Metrics

metrics — недельная сводка без содержимого; parity-проверки в doctor.

DND

dnd_policy.json задаёт будящие классы; пустой файл — полная тишина, --wake проходит по правилам.

Export

export --ref/--verify — проверяемые фрагменты записей с контрольными суммами артефактов.

Migrate

migrate --dry-run — версионирование схемы записей, обратимо и явно.

Установка и конфигурация

# из PyPI (имя пакета lnfnt-a2a)
pip install lnfnt-a2a

# из репозитория
pip install git+https://github.com/lnfnt/a2a-cli.git
ПеременнаяНазначение
A2A_HOMEКаталог шины. По умолчанию — общее хранилище. Пустое значение = дефолт; путь к файлу отклоняется.
A2A_PROFILEЯвный выбор профиля-отправителя; приоритет ниже --profile.

Тесты: python -m pytest -q. Версии мастера и стабильной ветки совпадают по набору тестов.