@7n/llm-lib 3.1.1 → 3.2.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.2.1] - 2026-08-10
4
+
5
+ ### Changed
6
+
7
+ - chore(release): синк пінів платформних napi-пакетів @7n/llm-lib
8
+
9
+ ## [3.2.0] - 2026-08-10
10
+
11
+ ### Added
12
+
13
+ - ACP-only зріз 1: `goose` як четвертий `AcpAgentKind` (`goose acp`) — тір-пресет резолвиться з наявного `N_*_MODEL`-контракту в `GOOSE_PROVIDER`/`GOOSE_MODEL` (+ `OPENAI_HOST`/`OPENAI_API_KEY` для локального endpoint-а), без нових env-ключів; новий `acp::pool` — адаптивний пул one-shot ACP-сесій (ramp-up за успіхами, backoff на rate-limit, кеп одночасності, збереження порядку результатів) як двигун майбутньої batch-емуляції
14
+ - ACP-only зріз 2: batch-фасад отримав шлях ACP-емуляції — batch виконується пулом one-shot ACP-сесій (`acp::pool`) замість прямих HTTP-completions, вибір бекенда через новий `N_BATCH_BACKEND=native|acp` (невалідне значення — fail-fast, без тихого фолбеку). Конфіг шляху — `AcpBatchConfig` (kind/tier/cwd/кеп) одним параметром `dispatch`; per-kind дефолтні кепи конкурентності: 2 для підписочних CLI (спільна квота акаунта), 6 для goose. `system` склеюється у промпт, як у `runOneShot`, бо в ACP немає окремого system-каналу. Дефолт лишається нативним — napi-міст передає `acp_config: None`, поведінка наявних JS-споживачів не змінюється
15
+ - ACP-only зріз 3 (клас 3, контур `fix`): два Rust-примітиви власного циклу, незалежні від двигуна. `anchored_edit` — анкерний протокол правок: 3-символьний base36-якір від хешу ВМІСТУ рядка, валідація всього набору перед застосуванням і атомарна відмова (жодного fuzzy-match), застосування знизу вгору; відмови віддаються структуровано плюс окрема серіалізація в текст для моделі. `write_guard` — межа запису: блок поза git-root, під `.git/` і по `git check-ignore`, realpath-нормалізація проти symlink-розбіжності, pre-image на перший дотик із sentinel для новостворених файлів, повний editLog для дистиляційного корпусу і rollback. Fail-closed у Rust забезпечено конструктивно: `Decision` — `#[must_use]`, а зняття pre-image приватне й неподільне з видачею дозволу
16
+ - ACP-only зріз 4 (клас 3): власний агентний цикл контуру `fix` на `rig-agent` 0.41 — модуль `fix` під прапорцем `fix-agent` (входить у дефолтний `agents`). `fix::tools` — рівно дозволений набір інструментів (`read`, `grep`, `find`, `ls`, `edit`, `write`, `ast_facts`, `self_check`), де anchored-профіль ЗАМІНЮЄ `read`/`edit` на анкерні варіанти, а bash/shell відсутній як тип; `ast_facts` працює лише з інʼєкції й чесно каже «недоступний» без неї. `fix::runner` — складання агента: write-guard veto в `on_tool_call` (тіло інструмента не виконується, editLog пише лише застосовані записи), verify-петля через `retry_with_feedback` у ту саму сесію з власним обліком бюджету (інфраструктурна помилка перевірки не палить ітерацію, менш ніж 5 секунд до дедлайну — чесна зупинка), chain-заголовки через власний `HttpClientExt` і per-turn `max_tokens`, синтез `StopReason` (rig причини скасування не повідомляє). Поля-замикання `WriteGuard` отримали bounds `Send + Sync` — це прибрало потребу в `unsafe impl` на обгортці
17
+ - ACP-only зріз 5: детермінований harness навколо циклу `fix` — три модулі оркестрації поза LLM. `fix::ladder` — драбина спроб: чотири рунги фіксованого порядку з окремими таймаутами (локальні 45с, cloud-min 120с, cloud-avg 180с як останній шанс), відсів рунга без резолвленої моделі, класифікація помилок на systemic/transport/quality із дією «обірвати / пропустити модель / рухатись далі», кеп cloud-avg на весь прогін, звуження драбини під concern. `fix::snapshot` — S1 знімається один раз на весь ladder concern-а (після детермінованого T0, тож його правки не відкочуються), кожен провальний рунг відкочується до S1; відкат гарантований через `Drop`-guard, бо явний виклик у гілці помилки легко забути, а `?` виходить без проміжного коду; durable-записи (самодостатній кінцевий стан worker-а) не відкочуються й не входять у collateral. `fix::collateral` — veto, що відхиляє рунг навіть коли лінт зелений: cross-file (правка наявного файлу поза target-set) і hunk-window ±20 рядків навколо порушення, з грубим common-prefix/suffix діапазоном замість Myers-diff. Нормалізацію шляхів зведено до єдиної реалізації у `write_guard` — дві копії давали б розбіжні ключі на symlink-шляхах
18
+ - ACP-only зріз 6: петля оркестрації `fix::pipeline` — зшиває драбину, snapshot і collateral-veto у робочий конвеєр `detect → T0 → detect → S1 → спроби [restore → attempt → re-detect → veto] → відкат`. Успіх спроби — конʼюнкція трьох умов (детектор чистий, немає помилки, немає veto); фідбек наступній спробі формує harness із конкретними шляхами й діапазонами рядків; concern, який не фіксується кодом, у драбину не заходить; кеп найдорожчого тиру приходить ззовні як спільний на весь прогін. Драбина і виконавець спроби — інʼєкції, тож петля детерміновано тестовна без мережі й моделі. `AttemptContext::capture` — обовʼязковий сигнал «зараз торкнуся файлу» ДО запису: без нього pre-image знімався б із уже зміненого вмісту і collateral-veto ставав сліпим. Плюс `fix::test_gate` — сестринський тест як частина верифікації, який складається з наявною інʼєкцією `verify` на боці споживача (fail-open на відсутній тест чи раннер, відхилення лише коли тест реально впав)
19
+ - Контракт циклу `fix` отримав дві точки, без яких приєднання до lint-конвеєра було б half-blind. `FixDeps::on_capture` — хук «перший дотик до файлу», який цикл підключає до свого `WriteGuard`: саме через нього ladder-рівневий snapshot дізнається про файли ПОЗА цільовим набором, а без нього cross-file collateral-veto сліпий (pre-image знімався б уже з правленого вмісту). `FixRequest::model` — явна модель спроби: коли задана, цикл бере саме її і не резолвить каскад наново, інакше хмарна сходинка драбини могла б піти на локальну модель, бо каскад `Tier` завжди починає з local. Обидва поля опційні, стара поведінка збережена
20
+
3
21
  ## [3.1.1] - 2026-08-09
4
22
 
5
23
  ### Changed
package/lib/acp.mjs CHANGED
@@ -1,6 +1,9 @@
1
1
  /**
2
- * ACP (Agent Client Protocol, Zed) — доступ до `cursor`/`codex`/`pi` через
3
- * особисту підписку (вже залогінений локально CLI), не API-ключ.
2
+ * ACP (Agent Client Protocol, Zed) — доступ до `cursor`/`codex`/`pi`/`goose`
3
+ * через особисту підписку (вже залогінений локально CLI), не API-ключ
4
+ * (виняток — `goose` на локальному/API-ключовому провайдері: сам ключ бере
5
+ * з `crate::local_cloud`, а не з окремого JS-джерела, див. Rust-коментар
6
+ * `AcpAgentKind::Goose`/`presets::goose_env`).
4
7
  *
5
8
  * Тонкий JS-клієнт до Rust-крейта `llm_lib::acp` через napi FFI
6
9
  * in-process (`llm-lib/crates/llm-lib-napi`) — жодного власного
@@ -9,7 +12,7 @@
9
12
  * тір→env/args/post-session-config резолвінг) живе в Rust, разом з
10
13
  * watchdog-поведінкою на мертвий/незапущений дочірній процес.
11
14
  *
12
- * `claude` тут немає — Rust-крейт моделює лише `cursor`/`codex`/`pi`
15
+ * `claude` тут немає — Rust-крейт моделює лише `cursor`/`codex`/`pi`/`goose`
13
16
  * (`AcpAgentKind`); `claude` тут навмисно не підтримується.
14
17
  */
15
18
  import { loadNative } from './internal/native.mjs'
@@ -20,7 +23,7 @@ import { loadNative } from './internal/native.mjs'
20
23
  * Rust сам резолвить tier→env/args/post-session-config з пресету агента
21
24
  * (`one_shot_acp_with_tier`) — жодного JS-хелпера "пресет→env" тут немає.
22
25
  * Без `tier` виклик заборонений, крім явного `mode:'interactive'` для персонального CLI-конфіга.
23
- * @param {'cursor' | 'codex' | 'pi'} kind провайдер
26
+ * @param {'cursor' | 'codex' | 'pi' | 'goose'} kind провайдер
24
27
  * @param {string} prompt промпт
25
28
  * @param {string} cwd робочий каталог сесії агента (каталог проєкту-викликача)
26
29
  * @param {{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/llm-lib",
3
- "version": "3.1.1",
3
+ "version": "3.2.1",
4
4
  "description": "Тонкий шар роботи з LLM (локальні omlx + хмарні провайдери) поверх pi: model tiers, one-shot, agentic-раннери, write-guard, trace, telemetry, prompt-budget",
5
5
  "keywords": [
6
6
  "nitra",
@@ -56,8 +56,8 @@
56
56
  "access": "public"
57
57
  },
58
58
  "optionalDependencies": {
59
- "@7n/llm-lib-darwin-arm64": "3.0.3",
60
- "@7n/llm-lib-linux-x64": "3.0.3"
59
+ "@7n/llm-lib-darwin-arm64": "3.2.1",
60
+ "@7n/llm-lib-linux-x64": "3.2.1"
61
61
  },
62
62
  "peerDependencies": {
63
63
  "@earendil-works/pi-ai": "~0.80.10",