0.17.0

Итерация 13 плана аудита: LLM-провайдеры — stream/retry/error-flow.

Changed

  • OpenAI stream idle-timeout: переписан на context.WithCancel + time.NewTimer вместо блокирующего stream.Next() — теперь таймаут реально срабатывает при молчании сервера
  • Anthropic stream: добавлена обработка input_json_delta для корректного накопления tool_use arguments
  • errorFromOpenAI/errorFromAnthropic заменены на wrapOpenAIError/wrapAnthropicError — возвращают (nil, *ProviderError) вместо фейкового LLMResponse{FinishReason:"error"}
  • ChatWithRetry обновлён для работы с ProviderError — retry на основе ShouldRetry, delay через RetryAfter
  • factory.go: HasPrefix("localhost") заменён на url.Parse + net.ParseIP.IsLoopback(); default provider → FindByName("openai") вместо &PROVIDERS[0]
  • DREAM/AutoCompact/Consolidator: динамический provider resolver через SetResolveProvider() вместо захвата при init
  • Heartbeat LLM вызовы (decide, shouldNotify) обёрнуты в ChatWithRetry (standard mode)

Fixed

  • Provider testCache: TTL 5 минут + cleanup при List/Delete; устаревшие записи автоматически удаляются
  • Удаление default провайдера: возвращает 409 Conflict вместо тихой потери дефолта

Added

  • Тип ProviderError с StatusCode, Type, Code, Kind, ShouldRetry — структурная обработка ошибок провайдеров
  • Функции IsProviderError, AsProviderError для type-safe извлечения ошибки
  • 22 unit-теста в internal/providers/iter13_test.go (retry logic, factory resolution, transient errors)