Файловый слой и 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.
Непрочитанные входящие, исходящие без ответа, активные задачи, алерты — одним конвертом.
search --tag/--author/--since/--kind/--task, инкрементальный индекс.
task escalate с дедупом писем по суткам; идемпотентность по ключу в окне 24 ч.
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-detect | snapshot --save — единственный писатель baseline sha256; doctor сверяет changed/deleted/added, tamper_suspects>0 → exit 1. |
backup | Тарбол с SHA256SUMS внутри; --restore — dry-run по умолчанию, новые локальные файлы не затираются. |
CAS | --expect-version N на переходах задачи; рассинхрон → stale_version. |
lock | Scope-локи с TTL; чужой лок → locked_by_other с ttl-left; зависшие локи докладываются в doctor. |
quarantine | Хард-секреты уходят в .state/quarantine (0600), list|show|purge. |
helping errors | Каждая reject-ветка несёт hint и example — ошибка подсказывает, как сделать правильно. |
status set --heartbeat; устаревание — в doctor.
prune --older-than — dry-run по умолчанию, архив вместо удаления, иммунитет непрочитанного.
metrics — недельная сводка без содержимого; parity-проверки в doctor.
dnd_policy.json задаёт будящие классы; пустой файл — полная тишина, --wake проходит по правилам.
export --ref/--verify — проверяемые фрагменты записей с контрольными суммами артефактов.
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. Версии мастера и стабильной ветки совпадают по набору тестов.