1.0.7
Fixed (#369)
- Live-хронология диалога больше не ломается во время хода (#369): tool-блоки (
todo_writeи др.) отображались в конце диалога и дублировались, пока страница не перезагружена. Причина — записи, создаваемые WS-событиями без server id, рендерились оптимистичным хвостом (после всех серверных строк), а merge наturn_endне мог сматчитьtool_iteration(клиентскийJSON.stringify≠ серверныйjson.Marshalпо порядку ключей и escaping). Исправлено полным эхом server id: (1)tool_batch_endпубликуется строго ПОСЛЕ персистенции строки и несётmessage_id— клиент создаёт блок сразу с серверным id (merged-батчи докатываются в запись с тем же id); (2) все assistant-строки (промежуточный carrier «текст+tool_calls» в runner, финальный ответ —persistFinalAssistantтеперь возвращает id, таймаут-текст) эхолятся расширенным событиемmessage_persisted(role="assistant",message_id, контент) — клиент свапает id оптимистичного бабла по content-матчу ещё доturn_end; эхо фильтруется по каналуwebsocket(email/webhook его не получают); (3)ask_user-веткаSend()больше не проглатывает сопутствующий_turn_end(хелперbroadcastTurnEnd) — клиент делает reconcile-merge и сброс busy после ask_user-остановки, при этомturn_endна клиенте больше не сбрасывает живую форму вопроса (pendingAsk); (4)tool_iteration_update(async-сабагенты) заработал по-настоящему — live-запись имеет совпадающий server id. РасширениеAgentHookметодомOnAssistantPersisted(NopHook/CompositeHook/ToolAuditHook/SkillRunStepsHook обновлены), метыMetaKeyPersistedMsgRole+ полеWSOutboundEvent.Role. Деградации сознательны: при провале персиста строки эхо не приходит (запись остаётся оптимистичной до merge/reload), эхо до создания бабла — no-op (корреляцию закрывает merge). Тесты: Go — трансформация событий (tool_batch_end± id, assistant/user-эхо, ask_user→turn_end), порядок persist→publish и merged-батчи вAfterIteration, эхо carrier-строки из runner, эхо финала доturn_end; TS — server-id записи, merged-батчи без дублей, legacy-путь,tool_iteration_updateна live-записи, свап бабла по эху, интеграционный многоитерационный ход с пошаговой хронологией, репродукция бага (4 хода todo_write), ask_user+turn_end с выживающей формой. Смежные находки аудита отложены: #370 (ask-ответ исчезает после reload), #371 (error-тексты не персистятся).