0.20.0

Итерация 16 плана аудита: память — real-time extraction и порядок consolidate→compact.

Added

  • Consolidator.ConsolidateSession(ctx, sessionID) — извлечение фактов из одной сессии по ID (internal/memory/consolidator.go). Используется AutoCompact перед компакцией.
  • Consolidator.ExtractRealtime(ctx, sess, lastUser, lastAssistant) — two-stage real-time извлечение: бесплатный gate (длина + список shortcut-слов) → дешёвый yes/no LLM-вопрос → полное извлечение. Запускается в фоновой горутине из actor.maybeRealtimeExtract после turnEnded = true с 30-секундным timeout.
  • Per-agent флаг realtime_extraction (миграция 022_realtime_extraction, sqlite + pg, up/down). Default false. UI-чекбокс «Извлечение фактов в реальном времени» в модалке редактирования агента.
  • internal/memory/json_parse.go — robust парсер JSON-ответов LLM: stripMarkdownFence, extractJSONArray/extractJSONObject (балансер скобок с учётом строковых литералов), parseJSONArrayInto (одиночный объект оборачивается в массив).
  • Retry с уточнением промпта при первой parse-ошибке в consolidator.callExtraction и dream.analyzeslog.Warn (было Debug) + повторный вызов с «respond with strictly valid JSON, no markdown fences».
  • Few-shot примеры в extractFactsPrompt (4 кейса: имя+роль, preference, greeting → [], team decision). Поле subject (user|agent|world) — обязательное, основа user-isolation. Явное правило «не перефразируй реплики».
  • applyDefaultConfidence — правила confidence по категории при отсутствии значения от LLM: explicit user statement (1.0), inference (0.6), single mention (0.4).
  • Dream.listAllActiveFacts — обход активных фактов агента батчами по 200 с offset, до 10000 фактов. Раньше Dream видел только первые 200.
  • AgentLoop.SetRealtimeConsolidator(c) + интерфейс RealtimeConsolidator в internal/agent/loop.go — узкая зависимость для real-time hook без import cycle.
  • Helpers: AutoCompact.SetTTLMinutes/SetKeepLast, Consolidator.persistFacts/buildConversation (выделены для переиспользования и тестирования).
  • 23 unit/integration теста: json_parse_test.go (12), consolidator_test.go (6 групп с подкейсами), iter16_integration_test.go (4 — полный flow с SQLite-store: ConsolidateSession, anti-leak для anonymous, AutoCompact-runs-Consolidator-before, RealtimeExtraction round-trip).

Changed

  • AutoCompact.compactSession — перед сборкой архива вызывает Consolidator.ConsolidateSession. Ошибка консолидации логируется, но не блокирует компакцию (лучше потерять часть фактов, чем оставить раздутую сессию). Переключение через AutoCompact.SetConsolidator(c) в cmd/taigaclaw/main.go.
  • Agent struct — новое поле RealtimeExtraction bool. SQLite/Postgres agentColumns/pgAgentCols, UpdateAgent пробрасывают поле. Handler AgentHandler.Update принимает realtime_extraction через JSON.
  • extractFactsPrompt переписан: добавлены subject, confidence, few-shot, явные правила. Категории user_fact/preference помечены как «explicit user statement».

Removed

  • Старая функция indexOfJSON(s) (поиск первого [) удалена — заменена на полноценный парсер с учётом строк и markdown.
  • import "encoding/json" в dream.go — теперь парсинг централизован в json_parse.go.