1.0.10
Fixed (#370)
- Ответ пользователя на
ask_userбольше не исчезает из диалога после перезагрузки (#370, найдено при аудите #369): ответ персистилсяrole='tool'-строкой (LLM-семантика: tool-результат в паре с tool_call), которуюuiRoleFilterисключал из API истории — после F5 бабл ответа пропадал, а в live-режиме оптимистичная запись висела неподтверждённой (эхоmessage_persistedдля этого персист-сайта не публиковалось,answerAskUserне слалclient_temp_id). Строка осознанно остаётся единственнойrole='tool'(двойная персистенция дала бы три копии ответа в контексте возобновлённого хода, новая роль потребовала бы миграций в обе СУБД и сломала быfindPendingAskUser/GetPendingAsk/PatchToolCallsMessages); изменена видимость и подтверждение: (1)uiRoleFilter/pgUIRoleFilterвозвращаютrole='tool' AND tool_name='ask_user'(прочие tool-строки скрыты как раньше, ретроактивно в истории всплывают и старые ask-ответы); (2) хендлер истории маппит такие строки вrole='user'на границе API (tool_name='ask_user'сохраняется как маркер, content/media/user_id/client_temp_id уже на строке); (3) ask-ветка actor’а проставляетClientTempIDна строке и публикуетmessage_persisted-эхо user-лейна ({client_temp_id, persisted_msg_id}, какpersistUserMessageOnReceive; без temp id — неинтерактивные каналы — эхо не шлётся); (4)answerAskUserгенерирует и шлётclient_temp_id, штампует его на оптимистичной записи — свап server id по эху работает действующим user-бранчем клиента. Тесты: store — видимость ask-ответа вGetRecentUIMessages/GetUIMessagesBeforeпри скрытых обычных tool-строках и пустых carrier’ах; handler — маппинг вrole='user'с сохранением маркера; actor — персист tool-строки сClientTempID+ ровно одно эхо с id строки, отсутствие эха без temp id; TS —client_temp_idв WS-фрейме и на оптимистичной записи, подтверждение бабла по эху.