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.analyze—slog.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.Agentstruct — новое полеRealtimeExtraction bool. SQLite/PostgresagentColumns/pgAgentCols,UpdateAgentпробрасывают поле. HandlerAgentHandler.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.