berimor 0.26.1 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -8
- package/checksums.json +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
[](https://www.npmjs.com/package/berimor)
|
|
15
15
|
[](https://github.com/devpilgrin/berimor/actions/workflows/ci.yml)
|
|
16
16
|
[](LICENSE)
|
|
17
|
-
[](#инфраструктура-проекта)
|
|
18
18
|
|
|
19
19
|

|
|
20
20
|

|
|
@@ -65,15 +65,111 @@ Deny-таблица деструктивных операций не переи
|
|
|
65
65
|
- **Скилы** (SKILL.md) — экспертные роли для чата: триггер — кодом (не моделью), потолок инструментов — фильтром диспетча.
|
|
66
66
|
- **Субагенты** (agent.yaml) — вложенный агентный цикл с собственным бюджетом и журналом; права ребёнка = пересечение с правами родителя, расшириться нельзя. Вложенное порождение — только с явным `allow_spawn: true`, глубина ограничена кодом.
|
|
67
67
|
- **Плагины** — изолированные процессы с ACL-манифестом и keyless-подписью sigstore: установка из доверенного списка с TOFU-подтверждением, как SSH.
|
|
68
|
-
- **MCP** — внешние серверы инструментов по открытому протоколу Model Context Protocol (официальный Rust SDK rmcp, ADR-0023): подключаются секцией `[[mcp_servers]]` в конфиге, встают в общий диспетчер после встроенных инструментов и плагинов и проходят тот же capability-гейт, что и любой шаг процесса. Работает и в обратную сторону: Berimor может отдавать собственные инструменты по MCP.
|
|
68
|
+
- **MCP** — внешние серверы инструментов по открытому протоколу Model Context Protocol (официальный Rust SDK rmcp, ADR-0023): подключаются секцией `[[mcp_servers]]` в конфиге, встают в общий диспетчер после встроенных инструментов и плагинов и проходят тот же capability-гейт, что и любой шаг процесса. Работает и в обратную сторону: Berimor может отдавать собственные инструменты по MCP. Курируемый список серверов с готовыми блоками конфига — [`docs/mcp-servers.md`](docs/mcp-servers.md).
|
|
69
69
|
|
|
70
70
|
Всё это устанавливается одной командой — из каталога или **любого git-репозитория**: `berimor skill install code-review-ru --from https://github.com/...`.
|
|
71
71
|
|
|
72
|
+
## Возможности
|
|
73
|
+
|
|
74
|
+
### Встроенные инструменты
|
|
75
|
+
|
|
76
|
+
Инструменты — встроенные в бинарник (не плагины), все вызовы проходят capability-гейт: **мутирующие** (помечены *) требуют подтверждения по режиму гейта, читающие исполняются без вопросов.
|
|
77
|
+
|
|
78
|
+
| Группа | Инструменты | Что делают |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| Файлы | `files.read`, `files.list`, `files.write`*, `files.edit`* | чтение/листинг; запись целиком; точечная правка по строковому якорю (old_string → new_string, контроль уникальности) |
|
|
81
|
+
| Поиск | `files.search`, `session.search` | regex по содержимому файлов (с номерами строк и контекстом) или glob по именам — `.git`/`target`/`node_modules` пропускаются; подстрока по лентам прошлых сессий с excerpt |
|
|
82
|
+
| VCS | `vcs.git` | git status/diff/log/show — только чтение: хелперы репозитория (fsmonitor, внешний diff, textconv) отключены, произвольные флаги не принимаются |
|
|
83
|
+
| Терминал | `terminal.exec`*, `terminal.start`*, `terminal.output`, `terminal.kill` | команда с таймаутом и капом вывода; фоновые процессы с опросом и остановкой (до 32 одновременно) |
|
|
84
|
+
| Сеть | `http.fetch`, `web.search` | GET с капом тела и сетевым гейтом; поисковая выдача DuckDuckGo (заголовок/ссылка/сниппет) |
|
|
85
|
+
| Память | `memory.search`, `memory.save` | поиск фактов семантической памяти; запись факта с дедупликацией — по умолчанию выключена (включается осознанно: `[memory] tool_writes = true`), секреты маскируются до записи |
|
|
86
|
+
| Организация | `todo.read`, `todo.write`, `human.ask` | список задач сессии (хранится в `.berimor/todo.json`); вопрос пользователю прямо из агентного цикла |
|
|
87
|
+
| Снапшоты | `snapshot.list`, `snapshot.restore`* | автоматически: перед каждой перезаписью файла его состояние сохраняется (ротация 50); list — метки и пути, restore — откат (сам тоже со снапшотом) |
|
|
88
|
+
| Субагенты | `agents.run` | поручение вложенному агенту с пересечением прав |
|
|
89
|
+
|
|
90
|
+
Сверх встроенных — инструменты плагинов и MCP-серверов (та же гейт-политика). Полный список в чате: стартовая строка «инструменты: …».
|
|
91
|
+
|
|
92
|
+
### Меню чата (TUI)
|
|
93
|
+
|
|
94
|
+
Наберите `/` — палитра покажет команды с описаниями на языке интерфейса и фильтрует по мере набора. Подменю работают по пробелу: `/config ` показывает продолжения.
|
|
95
|
+
|
|
96
|
+
| Команда | Что делает |
|
|
97
|
+
|---|---|
|
|
98
|
+
| `/help` | список команд |
|
|
99
|
+
| `/models` | провайдеры: список, `/models add` — мастер (пресеты → выбор → ключ/OAuth), удаление — через пикер с подтверждением |
|
|
100
|
+
| `/skills`, `/agents` | навыки и субагенты (глобальные/проектные), навык — Enter на строке |
|
|
101
|
+
| `/config` | **меню параметров**: показ эффективной конфигурации и пункт «Локаль интерфейса» (с текущим значением) → выбор языка из 8 (ru, en, de, fr, es, zh-CN, ja, ko). Сохраняется в локальный конфиг (`[ui]`), действует сразу. Шорткат: `/config locale ja` |
|
|
102
|
+
| `/mouse` | переключатель мыши: захвачена — колесо листает журнал, клик по журналу даёт фокус прокрутки; отпущена — нативное выделение/копирование терминала (при захвате выделение — через Shift) |
|
|
103
|
+
| `/copy` | последний ответ агента — в буфер обмена (wl-copy/xclip/xsel/pbcopy) |
|
|
104
|
+
| `/clear`, `/exit` | очистка журнала диалога; выход |
|
|
105
|
+
|
|
106
|
+
Остальное в интерфейсе: **модалки подтверждений** опасных действий (варианты «один раз / до конца сессии / для проекта» — выбор стрелками ←→↑↓, y/n — сразу); **вопросы агента** (`human.ask`) — модалка со свободным вводом, Enter — ответить, Esc — отказ; **многострочный ввод** — Alt+Enter переводит строку, поле растёт до трети экрана, вставка из буфера — одним событием; **мышь** — колесо и клик-фокус (см. `/mouse`).
|
|
107
|
+
|
|
108
|
+
## Процессы: графовые агенты
|
|
109
|
+
|
|
110
|
+
Основной «боевой» режим berimor — **процесс**: декларативный YAML-план, который исполняется как граф. Это тот же подход, что у «графовых агентов» (LangGraph и подобных): узлы — шаги, рёбра — переходы, состояние — разделяемый объект; отличие в том, что топология и маршрутизация у berimor детерминированы — **модель никогда не выбирает ветку**: она может предложить значение через строгий контракт, а маршрутизирует код (инвариант I1).
|
|
111
|
+
|
|
112
|
+
**Узлы графа** (типы шагов процесса):
|
|
113
|
+
|
|
114
|
+
| Узел | Назначение |
|
|
115
|
+
|---|---|
|
|
116
|
+
| `sequential` | обычный шаг — переход к следующему |
|
|
117
|
+
| `tool` | вызов инструмента (аргументы — шаблоны из состояния) |
|
|
118
|
+
| `llm_structured` | вызов модели со строгим контрактом ответа (JSON Schema — отклоняется до приёма) |
|
|
119
|
+
| `codeact` | программа модели в WASM-песочнице (QuickJS, топливо, белый список вызовов) |
|
|
120
|
+
| `agent_step` | свободный цикл «рассуждение → действие → наблюдение» как узел: `max_turns`, опционально самокритика и «предложи—выполни—проверь» |
|
|
121
|
+
| `branch` | условные рёбра: `on` — поле состояния, `cases` — ветки по значениям |
|
|
122
|
+
| `loop` | петля по условию |
|
|
123
|
+
| `parallel` | параллельные ветви с join-барьером |
|
|
124
|
+
| `human_gate` | пауза на человека: причина, таймаут, политика таймаута (fail/ветка/эскалация) |
|
|
125
|
+
| `checkpoint` | явная точка восстановления |
|
|
126
|
+
|
|
127
|
+
Журнал событий покрывает чекпоинтинг с запасом: любой прогон можно продолжить ровно с места обрыва и воспроизвести состояние на любой момент (replay).
|
|
128
|
+
|
|
129
|
+
**Честная граница подхода** (по результатам независимого полевого тестирования 0.27.0): контракт проверяет **форму, не смысл** — `branch` маршрутизирует код, но по значению, которое предложила модель; доверие не устранено, а спущено на уровень «значение, по которому вычисляется маршрут». Семантически значимые маршруты прикрывайте дополнительно: правилами политики контракта (диапазоны/перечисления), шагом верификации у сильной модели или `human_gate`. Вторая граница — слабые (локальные) модели: строгий контракт простой формы они выдерживают, а внутренний протокол свободного цикла требует модели среднего класса и выше; сценарий «полностью локально» сегодня реален для `llm_structured`-шагов, не для `agent_step`.
|
|
130
|
+
|
|
131
|
+
**Контракты из конфигурации** (0.28.0): свои контракты без форка и пересборки — секция `[[contracts]]` в конфиге с JSON Schema (inline `schema` или `schema_path`), дальше `llm_structured`/`codeact` ссылаются на неё по имени наравне с кодовыми. Вывод модели валидируется по схеме (crate `jsonschema`), ошибка валидации уходит в промпт повтора — тот же цикл медиации. Ограничения: policy-правил (ссылки на состояние) и версий схем у конфиг-контрактов нет, `publishable` — весь объект, реестр читается при старте (смена конфига — новый запуск). Пример — [`fixtures/golden/processes/config-contracts/`](fixtures/golden/processes/config-contracts/).
|
|
132
|
+
|
|
133
|
+
**Графовые идиомы как процессы.** Классические паттерны (routing, prompt chaining, parallelization, orchestrator-workers, evaluator-optimizer) выражаются без нового кода: `llm_structured` пишет решение-маршрут в состояние → `branch` маршрутизирует по валидированному значению; evaluator-optimizer — это `loop` с вердиктом; orchestrator-workers — `parallel` + join. Примеры процессов — в [`fixtures/golden/processes/`](fixtures/golden/processes/).
|
|
134
|
+
|
|
135
|
+
### Архитектура агента
|
|
136
|
+
|
|
137
|
+
```mermaid
|
|
138
|
+
flowchart TD
|
|
139
|
+
U["Пользователь / расписание / HTTP"] --> CLI["berimor CLI<br/>(chat · run · serve · daemon)"]
|
|
140
|
+
CLI --> PE["Process Engine<br/>граф процесса: branch · loop · parallel · join"]
|
|
141
|
+
CLI --> EX["Свободный цикл<br/>agent_step"]
|
|
142
|
+
PE --> MED["Mediation<br/>валидация контрактов"]
|
|
143
|
+
EX --> MED
|
|
144
|
+
MED --> GATE["Capability Gate<br/>deny-статика → jail → подтверждение"]
|
|
145
|
+
GATE --> TOOLS["Инструменты<br/>встроенные → плагины → MCP"]
|
|
146
|
+
PE --> J[("Журнал событий SQLite<br/>resume · replay · аудит")]
|
|
147
|
+
EX --> J
|
|
148
|
+
MED --> MEM[("Память: эпизодическая FTS5,<br/>семантическая, граф сущностей")]
|
|
149
|
+
PE --> POOL["Model Pool<br/>провайдеры · тиры · failover"]
|
|
150
|
+
EX --> POOL
|
|
151
|
+
POOL --> LLM["LLM: облачные и локальные"]
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Пример графа процесса (evaluator-optimizer)
|
|
155
|
+
|
|
156
|
+
```mermaid
|
|
157
|
+
flowchart LR
|
|
158
|
+
A["llm_structured:<br/>черновик"] --> B["llm_structured:<br/>оценка по контракту"]
|
|
159
|
+
B --> C{"branch on: verdict"}
|
|
160
|
+
C -->|"не годится"| A
|
|
161
|
+
C -->|"годится"| D["human_gate:<br/>публикация?"]
|
|
162
|
+
D --> E["tool: запись результата"]
|
|
163
|
+
E --> F["checkpoint"]
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Модель предлагает `verdict` — но в `cases` попадёт только значение, прошедшее контракт; выбор ветки вычисляет код.
|
|
167
|
+
|
|
72
168
|
## Инфраструктура проекта
|
|
73
169
|
|
|
74
170
|
**Rust-workspace по крейту на компонент** — Process Engine, Mediation, Executors, Memory, Capability, Model Pool, Actors, Tool Runtime, Context Engine, Eval, Storage. Гостевой WASM-модуль (`codeact-guest/`) живёт отдельным crate и закоммичен как готовый артефакт — обычная сборка не замедляется.
|
|
75
171
|
|
|
76
|
-
**Дисциплина проверок.** Каждый релиз: `cargo fmt` + `clippy -D warnings` + `cargo test --workspace` (
|
|
172
|
+
**Дисциплина проверок.** Каждый релиз: `cargo fmt` + `clippy -D warnings` + `cargo test --workspace` (945 тестов: юнит, интеграционные, e2e через настоящий бинарник, золотые фикстуры процессов и вредоносных вводов). Критические компоненты проходят обязательное независимое ревью. Полный самостоятельный аудит (`docs/audit-2026-07-31.md`) — **все находки закрыты или осознанно задокументированы**.
|
|
77
173
|
|
|
78
174
|
**Supply chain как у взрослых.** Кросс-платформенные релизы (Linux x64/arm64, macOS arm64, Windows x64) с keyless-подписью cosign/sigstore — приватного ключа не существует нигде. Проверка: `berimor verify <архив>`. npm-публикация с provenance, SBOM (CycloneDX) в пайплайне, самообновление (`berimor self-update`) реализовано на примитивах Process Engine — тот же журнал и восстановление после сбоя, что у обычных процессов, а не ad hoc скрипт.
|
|
79
175
|
|
|
@@ -94,12 +190,12 @@ berimor --version
|
|
|
94
190
|
|
|
95
191
|
### Способ 2: готовый бинарник с GitHub
|
|
96
192
|
|
|
97
|
-
Актуальные версии — на странице [релизов](https://github.com/devpilgrin/berimor/releases/latest). Ниже — команды для
|
|
193
|
+
Актуальные версии — на странице [релизов](https://github.com/devpilgrin/berimor/releases/latest). Ниже — команды для скачивания; версия подставляется автоматически (последний выпуск).
|
|
98
194
|
|
|
99
195
|
**Linux** (x64 или arm64):
|
|
100
196
|
|
|
101
197
|
```sh
|
|
102
|
-
VERSION
|
|
198
|
+
VERSION=$(curl -s https://api.github.com/repos/devpilgrin/berimor/releases/latest | grep '"tag_name"' | cut -d '"' -f 4)
|
|
103
199
|
ARCH=x64 # или arm64
|
|
104
200
|
curl -LO "https://github.com/devpilgrin/berimor/releases/download/${VERSION}/berimor-${VERSION}-linux-${ARCH}.tar.gz"
|
|
105
201
|
tar -xzf "berimor-${VERSION}-linux-${ARCH}.tar.gz"
|
|
@@ -111,7 +207,7 @@ berimor --version
|
|
|
111
207
|
**macOS** (только Apple Silicon — M1/M2/M3 и новее; сборки под Intel пока не публикуются, для Intel-Mac — способ 3 ниже):
|
|
112
208
|
|
|
113
209
|
```sh
|
|
114
|
-
VERSION
|
|
210
|
+
VERSION=$(curl -s https://api.github.com/repos/devpilgrin/berimor/releases/latest | grep '"tag_name"' | cut -d '"' -f 4)
|
|
115
211
|
curl -LO "https://github.com/devpilgrin/berimor/releases/download/${VERSION}/berimor-${VERSION}-darwin-arm64.tar.gz"
|
|
116
212
|
tar -xzf "berimor-${VERSION}-darwin-arm64.tar.gz"
|
|
117
213
|
xattr -d com.apple.quarantine berimor # бинарник пока не подписан Apple — иначе Gatekeeper откажется его запускать
|
|
@@ -123,7 +219,7 @@ berimor --version
|
|
|
123
219
|
**Windows** (x64), PowerShell:
|
|
124
220
|
|
|
125
221
|
```powershell
|
|
126
|
-
$Version = "
|
|
222
|
+
$Version = (Invoke-RestMethod "https://api.github.com/repos/devpilgrin/berimor/releases/latest").tag_name
|
|
127
223
|
Invoke-WebRequest -Uri "https://github.com/devpilgrin/berimor/releases/download/$Version/berimor-$Version-win32-x64.zip" -OutFile berimor.zip
|
|
128
224
|
Expand-Archive -Path berimor.zip -DestinationPath .
|
|
129
225
|
.\berimor.exe --version
|
|
@@ -158,7 +254,7 @@ berimor # = berimor chat: интерактивный диалог с а
|
|
|
158
254
|
|
|
159
255
|
Детерминированные процессы (декларативный YAML-план со строгими контрактами — основной «боевой» режим): `berimor run <process.yaml>`. Примеры процессов и конфигураций — в [`fixtures/golden/processes/`](fixtures/golden/processes/) и [`CONTRIBUTING.md`](CONTRIBUTING.md).
|
|
160
256
|
|
|
161
|
-
Автоматизация поверх процессов: `berimor schedule add` + `berimor daemon` — исполнение процессов по
|
|
257
|
+
Автоматизация поверх процессов: `berimor schedule add` + `berimor daemon` — исполнение процессов по расписанию (у демона и HTTP-сервиса нет терминала: запрос подтверждения трактуется как отказ с диагностикой — для автоматизации мутирующих шагов используйте точечное автоподтверждение в `.berimor/allow` либо флаг `berimor run --non-interactive` / `BERIMOR_NON_INTERACTIVE=1` в своих скриптах); `berimor serve` — HTTP-сервис поверх run/schedule/sessions (с токеном, без анонимного доступа); `berimor sessions` — реестр живых сессий хоста; `berimor trace <инстанс>` — человекочитаемая трассировка журнала любого прогона.
|
|
162
258
|
|
|
163
259
|
Расширения одной командой:
|
|
164
260
|
|
package/checksums.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"berimor-v0.
|
|
3
|
-
"berimor-v0.
|
|
4
|
-
"berimor-v0.
|
|
5
|
-
"berimor-v0.
|
|
2
|
+
"berimor-v0.28.0-darwin-arm64.tar.gz": "1c731623255c711d268bfc4566a22632612205b1b03c60b9970af8bc2d114217",
|
|
3
|
+
"berimor-v0.28.0-linux-arm64.tar.gz": "f8716e74760dd8e1ea33bcb70ed79ddb9e8ac35651f5ca1b863836f9ea7e7233",
|
|
4
|
+
"berimor-v0.28.0-linux-x64.tar.gz": "2b4973b9b97d179448530991ab1545229a179e70e10409b6ce12bccf4c057958",
|
|
5
|
+
"berimor-v0.28.0-win32-x64.zip": "80958f040adaab526db24db38913030d43c20a0a8d67a1ff87efd8461e7afbe1"
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "berimor",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.28.0",
|
|
4
4
|
"description": "Berimor — агентный CLI для LLM: интерактивный чат с инструментами (файлы, терминал, HTTP), детерминированные процессы, аудит и replay. Этот пакет — установщик платформенного бинарника.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|