0.167.16
Changed
- Компакция теперь производит структурированный инженерный handoff-документ вместо аннотации «2-5 предложений» ( — P1). Оба промпта компакции (
agent.resolveSummary— «Ответь кратким содержанием ключевых тем… 2-5 предложений» иAutoCompact.generateSummary— «Summarize this conversation in concise bullet points») запрашивали общую прозу, после которой агент терял практически всю рабочую информацию: какие файлы правил, какие команды запускал, какие ошибки получил, что решил и что осталось. Хуже того, входAutoCompactвыбрасывалrole="tool"целиком и не рендерилToolCallsвовсе, а каждое сообщение обрезалось до 500 байт байтовым срезом, рвущим UTF-8 посередине. Фикс: (1) новый единыйmemory.CompactionHandoffPromptс обязательными markdown-секциями — исходная задача, все сообщения пользователя, файлы (пути+фрагменты), команды (успех/ошибка/коды), ошибки и исправления, решения и отвергнутые варианты, незавершённое и следующий шаг — применён в обоих местах (temperature 0.3→0.1 для фактологичности); (2) построение входа вынесено вarchiveToConversation:role=toolрендерится («[результат exec]: exit code 1…»),ToolCallsассистента парсятся и рендерятся с аргументами, служебные роли (tool_call_history/tool_iteration/summary) и старый маркер[Resumed Session]на вход не попадают (сводка больше не сжимает предыдущую сводку); (3) обрезка rune-safe (truncateRunes): сообщения/tool-результаты до 2000 рун, аргументы до 1000 — вместо 500 байт; (4)SummaryRatio25→10 (clamp 1024..8192 сохранён): структурированный документ с секциями требует больше места, чем аннотация; (5)messagesToTextв compressor — синхронно: аргументы 200→1000 рун, результаты 500→2000 рун, обрезка rune-safe, аргументы tool-вызовов маршализуются без HTML-экранирования (&&больше не превращается в\u0026\u0026и не портит команды в сводке); (6) оценка входаlen(conversation)/4заменена наtokens.Count(консистентно с rune-метрикой #282). Маркеры[Resumed Session]/[Сжатый контекст]и их потребители (MarkdownRenderer, chat_history, compactionSummary.ts) не изменены. Тесты: tool/ToolCalls/команды/коды ошибок присутствуют в тексте для LLM; обрезка длинных сообщенийutf8.ValidStringв memory и agent;[Resumed Session]не протекает на вход; служебный/пустой архив → пустой вход (LLM не вызывается);TestDynamicSummaryMaxTokensперекалиброван под 1/10.