berimor 0.27.0 → 0.29.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-946%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,113 @@ 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`/`agent_step` ссылаются на неё по имени наравне с кодовыми. Вывод модели валидируется по схеме (crate `jsonschema`), ошибка валидации уходит в промпт повтора — тот же цикл медиации. Ограничения: policy-правил (ссылки на состояние) и версий схем у конфиг-контрактов нет, `publishable` — весь объект, реестр читается при старте (смена конфига — новый запуск). Пример — [`fixtures/golden/processes/config-contracts/`](fixtures/golden/processes/config-contracts/).
132
+
133
+ **Нормализатор формы хода** (0.29.0): слабые модели часто пишут «почти протокольный» ответ — плоскую форму `{"thought", "tool", "args"}`, `"action": "tool"` строкой, верхнеуровневый `reply` или оборванный на лимите токенов JSON. Известные формы достраиваются детерминированно до протокола ДО медиации (ремонт журналируется событием `agent_turn_normalized`; смысл по-прежнему решают валидация и гейт). Промпт хода дополнен парой few-shot примеров.
134
+
135
+ **Графовые идиомы как процессы.** Классические паттерны (routing, prompt chaining, parallelization, orchestrator-workers, evaluator-optimizer) выражаются без нового кода: `llm_structured` пишет решение-маршрут в состояние → `branch` маршрутизирует по валидированному значению; evaluator-optimizer — это `loop` с вердиктом; orchestrator-workers — `parallel` + join. Примеры процессов — в [`fixtures/golden/processes/`](fixtures/golden/processes/).
136
+
137
+ ### Архитектура агента
138
+
139
+ ```mermaid
140
+ flowchart TD
141
+ U["Пользователь / расписание / HTTP"] --> CLI["berimor CLI<br/>(chat · run · serve · daemon)"]
142
+ CLI --> PE["Process Engine<br/>граф процесса: branch · loop · parallel · join"]
143
+ CLI --> EX["Свободный цикл<br/>agent_step"]
144
+ PE --> MED["Mediation<br/>валидация контрактов"]
145
+ EX --> MED
146
+ MED --> GATE["Capability Gate<br/>deny-статика → jail → подтверждение"]
147
+ GATE --> TOOLS["Инструменты<br/>встроенные → плагины → MCP"]
148
+ PE --> J[("Журнал событий SQLite<br/>resume · replay · аудит")]
149
+ EX --> J
150
+ MED --> MEM[("Память: эпизодическая FTS5,<br/>семантическая, граф сущностей")]
151
+ PE --> POOL["Model Pool<br/>провайдеры · тиры · failover"]
152
+ EX --> POOL
153
+ POOL --> LLM["LLM: облачные и локальные"]
154
+ ```
155
+
156
+ ### Пример графа процесса (evaluator-optimizer)
157
+
158
+ ```mermaid
159
+ flowchart LR
160
+ A["llm_structured:<br/>черновик"] --> B["llm_structured:<br/>оценка по контракту"]
161
+ B --> C{"branch on: verdict"}
162
+ C -->|"не годится"| A
163
+ C -->|"годится"| D["human_gate:<br/>публикация?"]
164
+ D --> E["tool: запись результата"]
165
+ E --> F["checkpoint"]
166
+ ```
167
+
168
+ Модель предлагает `verdict` — но в `cases` попадёт только значение, прошедшее контракт; выбор ветки вычисляет код.
169
+
72
170
  ## Инфраструктура проекта
73
171
 
74
172
  **Rust-workspace по крейту на компонент** — Process Engine, Mediation, Executors, Memory, Capability, Model Pool, Actors, Tool Runtime, Context Engine, Eval, Storage. Гостевой WASM-модуль (`codeact-guest/`) живёт отдельным crate и закоммичен как готовый артефакт — обычная сборка не замедляется.
75
173
 
76
- **Дисциплина проверок.** Каждый релиз: `cargo fmt` + `clippy -D warnings` + `cargo test --workspace` (850 тестов: юнит, интеграционные, e2e через настоящий бинарник, золотые фикстуры процессов и вредоносных вводов). Критические компоненты проходят обязательное независимое ревью. Полный самостоятельный аудит (`docs/audit-2026-07-31.md`) — **все находки закрыты или осознанно задокументированы**.
174
+ **Дисциплина проверок.** Каждый релиз: `cargo fmt` + `clippy -D warnings` + `cargo test --workspace` (946 тестов: юнит, интеграционные, e2e через настоящий бинарник, золотые фикстуры процессов и вредоносных вводов). Критические компоненты проходят обязательное независимое ревью. Полный самостоятельный аудит (`docs/audit-2026-07-31.md`) — **все находки закрыты или осознанно задокументированы**.
77
175
 
78
176
  **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
177
 
@@ -94,12 +192,12 @@ berimor --version
94
192
 
95
193
  ### Способ 2: готовый бинарник с GitHub
96
194
 
97
- Актуальные версии — на странице [релизов](https://github.com/devpilgrin/berimor/releases/latest). Ниже — команды для скачивания конкретной версии (замените `v0.19.0` на нужную, если вышла более новая).
195
+ Актуальные версии — на странице [релизов](https://github.com/devpilgrin/berimor/releases/latest). Ниже — команды для скачивания; версия подставляется автоматически (последний выпуск).
98
196
 
99
197
  **Linux** (x64 или arm64):
100
198
 
101
199
  ```sh
102
- VERSION=v0.19.0
200
+ VERSION=$(curl -s https://api.github.com/repos/devpilgrin/berimor/releases/latest | grep '"tag_name"' | cut -d '"' -f 4)
103
201
  ARCH=x64 # или arm64
104
202
  curl -LO "https://github.com/devpilgrin/berimor/releases/download/${VERSION}/berimor-${VERSION}-linux-${ARCH}.tar.gz"
105
203
  tar -xzf "berimor-${VERSION}-linux-${ARCH}.tar.gz"
@@ -111,7 +209,7 @@ berimor --version
111
209
  **macOS** (только Apple Silicon — M1/M2/M3 и новее; сборки под Intel пока не публикуются, для Intel-Mac — способ 3 ниже):
112
210
 
113
211
  ```sh
114
- VERSION=v0.19.0
212
+ VERSION=$(curl -s https://api.github.com/repos/devpilgrin/berimor/releases/latest | grep '"tag_name"' | cut -d '"' -f 4)
115
213
  curl -LO "https://github.com/devpilgrin/berimor/releases/download/${VERSION}/berimor-${VERSION}-darwin-arm64.tar.gz"
116
214
  tar -xzf "berimor-${VERSION}-darwin-arm64.tar.gz"
117
215
  xattr -d com.apple.quarantine berimor # бинарник пока не подписан Apple — иначе Gatekeeper откажется его запускать
@@ -123,7 +221,7 @@ berimor --version
123
221
  **Windows** (x64), PowerShell:
124
222
 
125
223
  ```powershell
126
- $Version = "v0.19.0"
224
+ $Version = (Invoke-RestMethod "https://api.github.com/repos/devpilgrin/berimor/releases/latest").tag_name
127
225
  Invoke-WebRequest -Uri "https://github.com/devpilgrin/berimor/releases/download/$Version/berimor-$Version-win32-x64.zip" -OutFile berimor.zip
128
226
  Expand-Archive -Path berimor.zip -DestinationPath .
129
227
  .\berimor.exe --version
@@ -158,7 +256,7 @@ berimor # = berimor chat: интерактивный диалог с а
158
256
 
159
257
  Детерминированные процессы (декларативный YAML-план со строгими контрактами — основной «боевой» режим): `berimor run <process.yaml>`. Примеры процессов и конфигураций — в [`fixtures/golden/processes/`](fixtures/golden/processes/) и [`CONTRIBUTING.md`](CONTRIBUTING.md).
160
258
 
161
- Автоматизация поверх процессов: `berimor schedule add` + `berimor daemon` — исполнение процессов по расписанию; `berimor serve` — HTTP-сервис поверх run/schedule/sessions (с токеном, без анонимного доступа); `berimor sessions` — реестр живых сессий хоста; `berimor trace <инстанс>` — человекочитаемая трассировка журнала любого прогона.
259
+ Автоматизация поверх процессов: `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
260
 
163
261
  Расширения одной командой:
164
262
 
package/checksums.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "berimor-v0.27.0-darwin-arm64.tar.gz": "b9fed6c4ae2cdbb96da9bdf9143d2be07fd5aa6a0a0aa2dbf8d56b78a0693447",
3
- "berimor-v0.27.0-linux-arm64.tar.gz": "64c99128d943f40f40c9eda307abfd2cce410ed3eb81c0ed420e3194658dbdae",
4
- "berimor-v0.27.0-linux-x64.tar.gz": "a9a3ed07522507efe3b2e394ddec5bb76f4f6d494bb9b452084121627301cfcb",
5
- "berimor-v0.27.0-win32-x64.zip": "392f678714be0c3bb1ca92dee497eae1588740feaaec2eeb9b3a85fc248973e8"
2
+ "berimor-v0.29.0-darwin-arm64.tar.gz": "97be78f7b0aa90fb50bbbf923a8faad5383b4579f1feffc021984d6450c0eebe",
3
+ "berimor-v0.29.0-linux-arm64.tar.gz": "ac4d968df040caf0b9b86095e6f566289be7035c881cdbdb9ee369b525da2b3d",
4
+ "berimor-v0.29.0-linux-x64.tar.gz": "c5241ed293a81bf07ddeba06dbeaf8dd1ad3399768601dd4c675cbc8d81279b0",
5
+ "berimor-v0.29.0-win32-x64.zip": "df1cace7cf9d56dcc9141ca7c48cbde152aae8ac6186e53e6a73408e54f5490b"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "berimor",
3
- "version": "0.27.0",
3
+ "version": "0.29.0",
4
4
  "description": "Berimor — агентный CLI для LLM: интерактивный чат с инструментами (файлы, терминал, HTTP), детерминированные процессы, аудит и replay. Этот пакет — установщик платформенного бинарника.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {