0.9.3 11 мая 2026 г.

Переработка мобильного/компактного интерфейса, пресет Manifest, исправление проблем с переполнением результатов инструментов, автоматическое переподключение Telegram

Возможности Мобильный компактный режим первого уровня — Рендерер переработан так, чтобы одно и то же дерево Electron React адаптировалось чисто к узким viewport. В первую очередь ориентировано на…

Возможности

  • Мобильный компактный режим первого уровня — Рендерер переработан так, чтобы одно и то же дерево Electron React адаптировалось чисто к узким viewport. В первую очередь ориентировано на WebUI, но также автоматически активируется в десктопном приложении при изменении размера окна ниже 768px. Особенности: (a) isAutoCompact выводится из ширины @container/shell — однопанельный iOS-подобный переход между навигатором (список сессий / источники / и т.д.) и панелью фокусированного контента; боковая панель и правый столбец скрываются автоматически; макет прижимается к краям viewport. (b) Мобильное первого уровня AppMenu с полноэкранной навигационной стопкой (MobileAppMenu), выделенной из существующего компонента; настольная ветка (DesktopAppMenu) сохраняет предыдущее поведение без изменений. (c) Выборщики с первого уровня касания — переключатель workspace, выбор источника, селектор режима прав и фильтр списка сессий все меняются с Radix popovers на vaul Drawer нижние листы в компактном режиме (Radix порталы выходят за контейнер запроса панели, поэтому popovers обрезались на узких viewport). (d) Верхняя панель перераспределена — таблетка workspace слева, чипсы действий сворачиваются, FAB + new chat закреплен к нижней части viewport (порталится из трансформации навигатора, чтобы position: fixed разрешался относительно viewport, а не трансформированного предка). Существующий CSS использует container queries во всём, поэтому настольный макет (≥768px shell) структурно не изменён. PR . (83cc0cca, 3a63cbe1, 1640b181, 90e75c7b, e6e3247a, e24d4062, 7f2627ab)

Улучшения

  • Репо-широкая линтеризация строк i18n — Новый скрипт lint:i18n:strings сканирует весь репозиторий на наличие захардкоженных английских строк, которые должны проходить через i18n; lint-i18n-staged.sh был сокращён в том же коммите, так как сканирование по файлам теперь подсасывается репо-широким. Помогает предотвратить пропуск будущих строк из конвейера i18n. (013674e0)

  • Очистка иконок настроек для согласованностиSettingsIcons.tsx сокращён примерно на 180 строк для совместного использования одного стиля иконок в разделах настроек; небольшое улучшение models-pi.ts вместе с этим. Внесено Балінтом Оросом. (da685016)

  • Маршрутизация каналов доступа к сообщениям — 9 каналов контроля доступа к сообщениям (messaging:access:{getOwners,setOwners,getMode,setMode,getPending,dismissPending,allowPending,setBindingAccess} + messaging:pendingChanged) добавлены в REMOTE_ELIGIBLE_CHANNELS. Они были объявлены в channels.ts во время недавней работы над кнопками разрешений Telegram / контролем доступа, но не зарегистрированы в routing.ts — тест на исчерпывающее покрытие завершился ошибкой на этой ветке. (9b694d8d)

Исправления

  • Отравление сессии из-за переполнения результатов инструментов — Одиночный Read файла с тяжёлым base64 мог вытолкнуть сессию за пределы контекстного окна модели, после чего каждая повторная попытка возвращала invalid_request, и единственное "решение" было abandonment сессии. Исправлено два компонующих бага: (a) Оценщик токенов chars/4 недооценивает плотный base64 примерно на 25%, поэтому существующий порог пролива 15K срабатывал слишком поздно; новая функция estimateTokensDensityAware переключается на chars/1.5, когда ≥70% результата инструмента ≥20KB находится в непрерывных последовательностях base64-символов (≥100 символов), и TOKEN_LIMIT снижается до 12000 для дополнительного запаса. (b) UX invalid_request активно вводил в заблуждение пользователей — жёстко закодированная рекомендация ("Попробуйте удалить вложения / проверьте, находятся ли изображения в поддерживаемом формате") срабатывала независимо от того, что было отправлено или что сказал API, потому что оба источника реальных ошибок мертвы на пути Claude SDK (parseApiErrorFromDebugLog читает файл, который SDK больше не пишет; сетевой перехватчик работает только для Pi). Теперь: разделена перегруженная ONE_M_CONTEXT_HINTS на специфичные для 1M-уровня (context-1m/tier) и общие переполнения контекста (context window/prompt is too long/…); общие переполнения маршрутизируются на новую ошибку "Context Window Exceeded" с советами /compact + новая сессия; подсказки "удалить вложения" срабатывают только если сообщение API действительно упоминает image/attachment/media/format или только что отправленный пользовательский ход включал вложения (новое поле userTurnHadAttachments, переданное через ClaudeSdkErrorContext); если ни один источник ошибки не предоставляет деталей, добавляется указатель на ~/Library/Logs/@craft-agent/electron/main.log. PR . (636b0b67, fad9cbb3)

  • Автоматическое переподключение опроса Telegram после сбоя — Когда опрос Telegram останавливался (чаще всего 409 Conflict из-за двух экземпляров приложения с одним и тем же токеном бота), connected оставался false навсегда, и каждое последующее событие сессии через автоматизации telegramTopic молча отбрасывалось — связи создавались, сессии запускались, ответы генерировались, но ничего не достигало Telegram. TelegramAdapter теперь вызывает scheduleReconnect при любом сбое опроса с экспоненциальной задержкой: 30s базовая для 409 (даёт конкурирующему процессу время выйти), 5s для других ошибок, ограничено 5 мин. destroy отменяет любой ожидающий таймер, чтобы намеренные завершения не возвращались в цикл. MessagingGateway.onSessionEvent также теперь логирует warn (adapter_not_connected) вместо молчаливого продолжения, чтобы будущие отключения немедленно отображались в messaging-gateway.log. PR . (28f1082d)

  • Голосовые сообщения / аудиовложения WhatsApp теперь доставляются — Рабочий процесс WhatsApp молча отбрасывал аудиовложения вместо пересылки их в сессии. Рабочий процесс теперь корректно отправляет аудио/медиа-вложения. Закрывает . (84d6d0fd)

  • source_test пересылает OAuth/bearer токены в MCP-зоны — Зона подключения сообщала invalid_token для OAuth-источников MCP, чьи живые запуски работали с тем же источником — source_test не передавал токен доступа в зону. Исправлено: токен доступа теперь пересылается, чтобы зона соответствовала аутентификации живого запуска. Закрывает . (0dd6eeef)

  • Кнопки разрешений Telegram идемпотентны + очистка клавиатуры при разрешении — Кнопки разрешений могли дважды срабатывать при быстром нажатии; inline-клавиатура также сохранялась после разрешения. Кнопки теперь идемпотентны, а клавиатура очищается после предоставления/отклонения разрешения. Закрывает . (9340b2b5)

  • Выбор модели отображает переключатель подключения на пустой сессии для одиночной модели pi_compat по умолчанию — Когда рабочее пространство по умолчанию имело pi_compat-подключение с одной моделью, выбор модели скрывал переключатель подключения полностью, делая невозможным переключение провайдеров с пустой сессии. Выбор модели теперь отображает переключатель подключения даже в этом случае. Закрывает . (7faf9fc4)

  • Сборка Windows: режим cone sparse-checkout + переименование файлов с недопустимыми символами — Два проблемы, блокирующие CI Windows: (a) sparse-checkout использовал не-cone режим, который не применяется на Windows; переключено на cone режим. (b) Hermes - Anna: thinking.pdf из архива проекта-эволюции содержал :, недопустимый на Windows; переименован. PDF-файлы проекта-эволюции также исключены из Windows-чекаута полностью. (5cc83b86, bf187448, 28741005)

  • Полировка компактного режима (многокоммитный) — Серия мелких исправлений, обнаруженных во время запуска компактного режима: React #300 (Maximum update depth) при переключении isCompact при изменении размера (227f3486); FAB new-chat закреплен к нижней части viewport через портал, чтобы position: fixed разрешался корректно, и скрыт, когда чат открыт (406ece09, 3ce4ffb3); заголовок PanelHeader центрирован по всей ширине панели (7d81e6a7); полировка переключателей + размеров верхней панели для узких viewport (060ae0d1); полировка элементов управления мобильного заголовка в компактном режиме (74c52244).

  • AppMenu: удаление моста истории + строка Keyboard Shortcuts в компактном режиме — Меню имело мост истории, который откатывал навигации меню при нажатии кнопки назад; удалён (390d4eeb). Строка Keyboard Shortcuts также удалена из мобильного меню, так как она неактуальна на сенсорных устройствах (b38b1c05).

  • Документация: исправлен путь к настройке Mid-stream sends — Документация ссылалась на устаревший путь. Исправлено. (97f58dec)

Примечания

  • Внешние контрибьюторы в этом выпуске:

  • Мобильный/компактный режим: активируется автоматически, когда ширина shell падает ниже 768px, независимо от того, вы в десктопном приложении или WebUI. Сужайте десктопное окно, чтобы попробовать.

  • Изменение оценщика токенов: новый порог пролива с учётом плотности должен предотвратить большинство крашей из-за переполнения контекста. Если вы ранее видели invalid_request: remove attachments после Read файла с тяжёлым бинарным содержимым без реального вложения, эта ошибка исчезла — переполнения контекста теперь маршрутизируются на отдельную ошибку "Context Window Exceeded" с указанием на /compact.

← Все версии