@oeronteros-1/opencode-orchestra 1.0.28 → 1.0.30

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.
Files changed (43) hide show
  1. package/README.md +79 -1
  2. package/dashboard-dist/assets/index-Bl2J2mOP.js +132 -0
  3. package/dashboard-dist/assets/index-CX2uv1EJ.css +1 -0
  4. package/dashboard-dist/index.html +2 -2
  5. package/dist/agents/integrator.js +1 -1
  6. package/dist/agents/integrator.js.map +1 -1
  7. package/dist/agents/lead.js +2 -13
  8. package/dist/agents/lead.js.map +1 -1
  9. package/dist/config/load.d.ts +5 -0
  10. package/dist/config/load.js +20 -5
  11. package/dist/config/load.js.map +1 -1
  12. package/dist/dashboard/server.js +38 -17
  13. package/dist/dashboard/server.js.map +1 -1
  14. package/dist/diagnostics/doctor.js +194 -0
  15. package/dist/diagnostics/doctor.js.map +1 -1
  16. package/dist/diagnostics/update.js +8 -7
  17. package/dist/diagnostics/update.js.map +1 -1
  18. package/dist/index.js +21 -3
  19. package/dist/index.js.map +1 -1
  20. package/dist/orchestration/ownership.d.ts +19 -0
  21. package/dist/orchestration/ownership.js +26 -0
  22. package/dist/orchestration/ownership.js.map +1 -1
  23. package/dist/routing/classifier.js +20 -2
  24. package/dist/routing/classifier.js.map +1 -1
  25. package/dist/routing/fallback.d.ts +19 -10
  26. package/dist/routing/fallback.js +89 -18
  27. package/dist/routing/fallback.js.map +1 -1
  28. package/dist/routing/model-resolver.d.ts +47 -0
  29. package/dist/routing/model-resolver.js +110 -2
  30. package/dist/routing/model-resolver.js.map +1 -1
  31. package/dist/spawn.d.ts +14 -1
  32. package/dist/spawn.js +67 -4
  33. package/dist/spawn.js.map +1 -1
  34. package/dist/telemetry/ledger.d.ts +49 -0
  35. package/dist/telemetry/ledger.js +157 -0
  36. package/dist/telemetry/ledger.js.map +1 -1
  37. package/dist/telemetry/live.js +1 -1
  38. package/dist/telemetry/live.js.map +1 -1
  39. package/dist/tools.js +71 -3
  40. package/dist/tools.js.map +1 -1
  41. package/package.json +4 -4
  42. package/dashboard-dist/assets/index-BTleCKc7.js +0 -124
  43. package/dashboard-dist/assets/index-igZBUoKO.css +0 -2
package/README.md CHANGED
@@ -14,12 +14,21 @@
14
14
  - диагностика `doctor`, проверка обновлений и shell completion;
15
15
  - идемпотентная установка без удаления пользовательской OpenCode/MCP-конфигурации.
16
16
 
17
- Версия плагина — **1.0.25**. Полный контракт конфигурации описан в [schema/opencode-orchestra.schema.json](schema/opencode-orchestra.schema.json), рабочий пример — в [examples/.opencode/orchestra.jsonc](examples/.opencode/orchestra.jsonc).
17
+ Версия плагина — **1.0.27**. Полный контракт конфигурации описан в [schema/opencode-orchestra.schema.json](schema/opencode-orchestra.schema.json), рабочий пример — в [examples/.opencode/orchestra.jsonc](examples/.opencode/orchestra.jsonc).
18
18
 
19
19
  ## Что нового в 1.0.9–1.0.25
20
20
 
21
21
  Полноценные разделы с примерами для пользователей.
22
22
 
23
+ ### 1.0.29 — надёжность и прозрачная маршрутизация (next/unreleased)
24
+
25
+ - **Graceful degradation при невалидном `orchestra.jsonc`**: если глобальный или проектный конфиг не парсится либо не проходит валидацию схемы, плагин продолжает запуск на безопасных default-значениях, пишет один warning с путём к конфигу и sanitized-причиной и **не перезаписывает** файл. Обнаружение моделей, регистрация проектов, телеметрия и создание агентов/инструментов продолжаются как обычно.
26
+ - **Структурированная причина маршрутизации**: `orchestra_route` возвращает `routing.lead.model` вместе с машиночитаемым `routing.lead.reason` (`code`, `text`, `matchedCapabilities`, `score`, `budget`) и `routing.source` (`exact_override`, `manual_pool`, `auto_discovered`, `budget_exclusion`, `no_candidate`). `code` — стабильный идентификатор решения; `text` — диагностическая строка без секретов и промптов.
27
+ - **Политика ошибок и capability-aware fallback**: retryable-ошибки (rate-limit/429, timeout/408, provider 5xx/overloaded) переключают на следующий совместимый кандидат; terminal-ошибки (auth/401/403, invalid-request/400/404, неизвестная) останавливают цепочку. Альтернативы фильтруются по capability и бюджету и ранжируются детерминированно: compatibility → priority → tier → бюджетный класс стоимости → id. Плагин **не перехватывает** provider retry: цепочка `fallback.chains` передаётся только для dispatch-failover через `orch-lead`.
28
+ - **События надёжности (reliability events)**: ledger записывает sanitized-события `failed`/`retried` только из реально наблюдаемых попыток (модель, класс ошибки, следующая модель, номер попытки, исход). Сырой текст ошибки не сохраняется; список ограничен последними 100 событиями.
29
+ - **Routing-проверки `doctor`**: неразрушающие проверки для lead/judge/workers, точных overrides, дубликатов и неизвестных цен (предупреждение, никогда не `free`). Валидный частичный конфиг не считается ошибкой.
30
+ - **Карта конфликтов и сохранённые worktrees**: `orch-integrator` строит детерминированную cross-editor карту конфликтов (`editors`, `conflictingPaths`, `ownershipViolations`, `order`, `clean`), работает fail-closed при любом нарушении ownership/ancestry/git-конфликте и сохраняет worktrees для диагностики.
31
+
23
32
  ### 1.0.24–1.0.25 — параллельные редакторы и Windows-совместимость
24
33
 
25
34
  - **Параллельные редакторы**: `orchestration.parallelEditors` включает безопасный fan-out/fan-in для правок: каждый `orch-editor` работает в отдельном experimental Git worktree, а `orch-integrator` проверяет фактический diff и интегрирует коммиты в детерминированном порядке. При конфликте worktrees сохраняются для диагностики; `0` (по умолчанию) отключает режим.
@@ -254,6 +263,75 @@ bunx @oeronteros-1/opencode-orchestra@latest completion zsh > ~/.zsh/completions
254
263
 
255
264
  Resolver формирует упорядоченный список fallback-кандидатов из доступных пользователю моделей, предпочитая схожую стоимость и совместимые capabilities. Цепочка передаётся lead в поле `fallback`; execution-слой может переключиться на следующий кандидат при ошибке провайдера. Если текущая версия OpenCode не предоставляет provider-interception, сам плагин не перехватывает вызов и не обещает автоматический retry. Прогноз стоимости — информативное поле: выполнение не блокируется, а предупреждение помогает подтвердить расходы заранее.
256
265
 
266
+ ### Структурированная причина маршрутизации
267
+
268
+ `orchestra_route` возвращает `routing` с выбранной моделью lead и машиночитаемой причиной вместо необходимости разбирать прозу:
269
+
270
+ ```jsonc
271
+ {
272
+ "routing": {
273
+ "lead": {
274
+ "model": "anthropic/claude-sonnet-4-5",
275
+ "reason": {
276
+ "code": "capability_match",
277
+ "text": "id=anthropic/claude-sonnet-4-5 cost=subscription capability=explicit score=100",
278
+ "matchedCapabilities": ["reasoning"],
279
+ "score": 100,
280
+ "budget": "balanced"
281
+ }
282
+ },
283
+ "source": "manual_pool",
284
+ "budget": "balanced"
285
+ }
286
+ }
287
+ ```
288
+
289
+ - `code` — стабильный идентификатор решения: `frontier`, `preferred_tier`, `preferred_cost`, `capability_match`, `price`, `priority`, `exact_override`. Это машиночитаемый контракт; `text` — диагностическая строка, не являющаяся контрактом совместимости.
290
+ - `matchedCapabilities` — capability, по которым модель подошла (пусто для `exact_override`); `score` — итоговый скоринг победителя; `budget` — режим бюджета.
291
+ - `text` не содержит секретов, промптов, токенов и содержимого файлов.
292
+
293
+ `source` показывает происхождение выбора: `exact_override` (точное `models.agents["orch-lead"]`), `manual_pool` (ручной пул при `strategy: "manual"`), `auto_discovered` (автособранный пул подключённых моделей), `budget_exclusion` (пул заблокирован бюджетом/лимитом платных вызовов) и `no_candidate` (пул пуст — используется текущая модель OpenCode).
294
+
295
+ ### Политика ошибок
296
+
297
+ Ошибки классифицируются по policy-классам, а не по сырому тексту:
298
+
299
+ | Класс | Политика |
300
+ | --- | --- |
301
+ | Rate limit / 429 | переключиться на следующий совместимый кандидат |
302
+ | Timeout / 408 | переключиться на следующий совместимый кандидат |
303
+ | Provider 5xx / overloaded | переключиться на следующий совместимый кандидат |
304
+ | Auth / 401 / 403 | остановиться — ошибка конфигурации |
305
+ | Invalid request / 400 / 404 / unsupported capability | остановиться — ошибка маршрутизации или запроса |
306
+ | Неизвестная ошибка | остановиться, если явно не классифицирована как retryable |
307
+
308
+ Каждая последовательность ограничена максимальным числом попыток, не повторяет одну и ту же модель и сохраняет исходную ошибку. Лимиты платных вызовов остаются авторитетными.
309
+
310
+ ### Capability-aware fallback
311
+
312
+ Fallback-цепочка строится только из worker-пулов (`code`, `reasoning`, `research`, `vision`, `image`). Кандидаты фильтруются по budget-eligibility (платные исключаются при исчерпании лимита), а явно несовместимые с требуемой capability отсеиваются до выбора победителя. Неизвестные по capability модели остаются в цепочке, но ранжируются ниже. Альтернативы упорядочиваются детерминированно: compatibility → priority → tier → бюджетный класс стоимости → id. `fallback.chains` в ответе `orchestra_route` содержит `enabled`, `maxRetries` и усечённую до `maxRetries + 1` цепочку на каждую capability. Плагин не перехватывает вызовы провайдера: цепочка предназначена для безопасного dispatch-failover через `orch-lead`.
313
+
314
+ ### События надёжности
315
+
316
+ Там, где Orchestra может наблюдать выполнение, ledger записывает событие надёжности только из реально наблюдаемых попыток: `attempt`, `model`, `errorKind` (policy-класс, не сырой текст), `outcome` (`failed`/`retried`/`succeeded`), `nextModel` и `at`. Переход `retried` фиксируется только при последующей наблюдаемой попытке после retryable-ошибки; события ограничены последними 100, строки обрезаются, а неопознанные записи отбрасываются. Креды, промпты и тела ответов провайдера никогда не сохраняются. Если вызовы провайдера перехватить нельзя, эквивалентные policy-метаданные возвращаются в `orch-lead`, но фейковое событие выполнения не записывается.
317
+
318
+ ### Routing-проверки `doctor`
319
+
320
+ `doctor` добавляет неразрушающие routing-проверки с стабильными идентификаторами и severity:
321
+
322
+ - пустой пул роли — `info` («текущая модель OpenCode»);
323
+ - недоступный точный agent override или невалидный формат `provider/model` — `warning`;
324
+ - роль без совместимого кандидата или заблокированная бюджетом — `warning`;
325
+ - дубликаты кандидатов — `warning`;
326
+ - неизвестная цена победителя — `warning` (никогда не трактуется как `free`);
327
+ - валидный частичный конфиг (пустые пулы, отсутствующие секции) не считается ошибкой и не блокирует запуск.
328
+
329
+ Проверки не изменяют файлы конфигурации.
330
+
331
+ ### Карта конфликтов и сохранённые worktrees
332
+
333
+ Перед интеграцией `orch-integrator` выводит фактические изменённые пути из git и строит cross-editor карту конфликтов: `editors` (id, commit, изменённые пути, ownership-нарушения), `conflictingPaths` (пути, затронутые более чем одним редактором), `ownershipViolations`, детерминированный `order` интеграции и флаг `clean`. Любое нарушение ownership, провал ancestry-проверки или git-конфликт останавливает автоматическую интеграцию — интегратор интегрирует всё или ничего и **сохраняет worktrees** для диагностики. Чистый текстовый merge не считается доказательством семантической корректности.
334
+
257
335
  ## Агенты и команды
258
336
 
259
337
  Плагин добавляет один публичный primary-агент `orch-lead`, скрытых workers, скрытый reduce-агент `orch-merge` и скрытый `orch-judge`. Workers не могут редактировать файлы или делегировать работу дальше; lead может вызывать только агентов Orchestra, после чего сам реализует изменения и проверяет результат.