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 CHANGED
@@ -14,7 +14,7 @@
14
14
  [![npm](https://img.shields.io/npm/v/berimor?logo=npm&label=npm)](https://www.npmjs.com/package/berimor)
15
15
  [![CI](https://img.shields.io/github/actions/workflow/status/devpilgrin/berimor/ci.yml?branch=main&label=CI)](https://github.com/devpilgrin/berimor/actions/workflows/ci.yml)
16
16
  [![License](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)
17
- [![Tests](https://img.shields.io/badge/tests-850%20green-brightgreen)](#инфраструктура-проекта)
17
+ [![Tests](https://img.shields.io/badge/tests-945%20green-brightgreen)](#инфраструктура-проекта)
18
18
 
19
19
  ![Rust](https://img.shields.io/badge/Rust-stable-DEA584?logo=rust&logoColor=white)
20
20
  ![WebAssembly](https://img.shields.io/badge/sandbox-Wasmtime-654FF0?logo=webassembly&logoColor=white)
@@ -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` (850 тестов: юнит, интеграционные, e2e через настоящий бинарник, золотые фикстуры процессов и вредоносных вводов). Критические компоненты проходят обязательное независимое ревью. Полный самостоятельный аудит (`docs/audit-2026-07-31.md`) — **все находки закрыты или осознанно задокументированы**.
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). Ниже — команды для скачивания конкретной версии (замените `v0.19.0` на нужную, если вышла более новая).
193
+ Актуальные версии — на странице [релизов](https://github.com/devpilgrin/berimor/releases/latest). Ниже — команды для скачивания; версия подставляется автоматически (последний выпуск).
98
194
 
99
195
  **Linux** (x64 или arm64):
100
196
 
101
197
  ```sh
102
- VERSION=v0.19.0
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=v0.19.0
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 = "v0.19.0"
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` — исполнение процессов по расписанию; `berimor serve` — HTTP-сервис поверх run/schedule/sessions (с токеном, без анонимного доступа); `berimor sessions` — реестр живых сессий хоста; `berimor trace <инстанс>` — человекочитаемая трассировка журнала любого прогона.
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.26.1-darwin-arm64.tar.gz": "135d5b7c0f7b94053d24efe4d1cd66ccb0b96a65f96b89b6eb1f6c3657e26d72",
3
- "berimor-v0.26.1-linux-arm64.tar.gz": "c03e0f27d51d561b90a575a41ce1786a5daa7e6b8e61e05af34f38d03c4b7950",
4
- "berimor-v0.26.1-linux-x64.tar.gz": "c8747e20c408ce4a0f2b93716f00abca446addf6d01c3d7247f15f6cb10f796e",
5
- "berimor-v0.26.1-win32-x64.zip": "02dfc734469393c821a897d7c744b8eaddc21edc51a5119841116768c613f18e"
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.26.1",
3
+ "version": "0.28.0",
4
4
  "description": "Berimor — агентный CLI для LLM: интерактивный чат с инструментами (файлы, терминал, HTTP), детерминированные процессы, аудит и replay. Этот пакет — установщик платформенного бинарника.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {