# Изменения CapyAgent

## v1.2.3 - кавычки в settings.env, панель видит модель из мастера, установщик сам кладёт capyagent в PATH, мастер без петель, VPN+ быстро меняет мёртвый узел

Дата выпуска: при выкладке. Выпуск только ядра.

- значение с `^`, `#`, `?`, пробелом, `"`, `\`, `$` или обратной кавычкой
  мастер, файл ответов и панель записывают в settings.env в двойных кавычках,
  а команды doctor, chat, model и config get раньше читали файл вместе с
  кавычками: прокси с таким паролем давал «адрес прокси не разобран», а ключ
  API с `#` или `^` уходил к провайдеру в кавычках. Теперь все читатели снимают
  кавычки так же, как systemd EnvironmentFile и оболочка, а все писатели
  кладут значение одним способом, который эти читатели понимают одинаково.
  Файл окружения юнита команды читают ровно по правилам systemd (обратная
  косая вне кавычек, склейка кусков `"a"b`, заметки с `;`), то есть видят то
  же значение, что служба. Голое значение в settings.env каталога данных, как
  и раньше, читается как написано (путь `C:\Users\...` на Windows цел).

- панель (`capyagent app`, `capyagent serve`) после мастера говорила «Модели
  пока нет», /api/status отдавал модель_настроена=false, а чат отвечал
  «понимаю только команды», хотя `capyagent chat` и doctor модель видели:
  serve брал каталог данных только из CAPYAGENT_DATA_DIR, которой у
  поставившего одной строкой нет. Теперь serve и app ищут каталог так же, как
  chat (переменная, каталог службы, домашняя папка) и читают его settings.env;
  ключ доступа к панели лежит в каталоге данных, а не в /tmp. Где
  CAPYAGENT_DATA_DIR задан явно (службы, приложение для компьютера, Docker,
  macOS), ничего не переезжает: и с профилем (`-p`) settings.env панели и ключ
  панели, как и раньше, берутся из самого каталога. Расширение в
  `~/.capyagent/plugins` больше не находится дважды, когда каталог данных и
  есть `~/.capyagent`: раньше из-за этого с отказом «установлено дважды» не
  поднималось приложение для компьютера на Linux и macOS, если в нём стояло
  хоть одно расширение.
- установщик сам дописывает каталог с программой в PATH (в ~/.profile и в файл
  своей оболочки, один раз; для fish - строкой fish в
  `~/.config/fish/conf.d/capyagent.fish`) и говорит об этом одной строкой; а пока
  capyagent не в PATH текущего окна, последний экран мастера называет команды
  полным путём, чтобы подсказка «capyagent chat» работала сразу.
- мастер после неудачной живой пробы модели откатывает значения, которые
  ставил в окружение процесса: раньше на повторе он «находил на этой машине»
  собственную неудачную попытку. Повтор спрашивает только ключ того же
  поставщика (или «другая» - выбрать другую модель) и не печатает меню заново.
  Отказ по стране, неверный ключ и таймаут объяснены словами со следующим
  шагом, а не сырыми «HTTP 403: Access denied by security policy» и JSON.
- пустой Enter в меню модели больше не крутит «Не понял» без выхода: в вопросе
  стоит «Ctrl+C - выйти», поставщиков можно назвать словом (chatgpt,
  openrouter, claude, deepseek, gigachat, yandexgpt...), конец ввода завершает
  мастер.
- VPN+: отказ запроса через узел (ошибка соединения или срок) сразу запускает
  проверку узла, а не ждёт пятиминутного шага: на стенде смена мёртвого узла
  занимала 327 секунд, первый запрос после неё ждал около 40. Проверки по
  отказу идут с растущей паузой и не крутятся; срок соединения через узел
  сокращён с 15 до 6 секунд, чтобы мёртвый узел отказывал быстро.

## v1.2.2 - мелочи после v1.2.1 и VPN+ внутри агента по ссылке подписки

Дата выпуска: при выкладке. Выпуск только ядра.

- витрина подписки «Capy AI (подписка)» (в разработке) стоит последней в
  списке моделей: в мастере, на экране модели в панели и в /model номера всех
  остальных моделей снова те же, что в v1.2.0 (MiMo - 1), а витрина получает
  следующий номер после последней. Выбрать её по-прежнему нельзя.
- HTTP- и HTTPS-прокси принимают пароль с `^`, `#`, `?`, `/`, `%` и пробелом
  в сыром виде, как SOCKS5: раньше такой адрес отвергался словами «адрес
  прокси не разобран». Набор и проверка (мастер, файл ответов, doctor) читают
  адрес одним разбором; закодированный пароль (`%40`) работает по-прежнему.

VPN+ внутри агента (слово владельца: «просто купить и вставить ссылку»):

- ссылка подписки VPN+ (бот @noobhostbot, пробные дни есть) вставляется в
  `CAPYAGENT_VPNPLUS_SUB`, и Telegram с моделью идут через наш VPN. Агент сам
  забирает подписку, поднимает клиента дочерней программой службы, выбирает
  рабочий узел проверкой `api.telegram.org` и адреса модели через каждый,
  при отказе узла берёт следующий и раз в сутки обновляет подписку;
- клиент - закреплённая сборка `sing-box` (VLESS Reality и Hysteria2; GPL-3.0
  или новее, отдельная программа) с канала `capyagent.ru/dl/tools` через
  пакет закреплений, как whisper и telegram-bot-api: размер и sha256 сверяются
  до запуска. Сборка 1.14.2 для linux amd64 и arm64 выложена на канале и в
  зеркале; это официальный бинарник, динамически связанный с glibc, поэтому на
  Alpine и других системах с musl (в том числе в образе Docker) он не
  запустится: агент говорит об этом словами и ходит напрямую (своя программа
  `sing-box` из PATH подойдёт). Клиент слушает SOCKS5 только на `127.0.0.1`,
  с логином и паролем на этот запуск, без прав root и без изменения маршрутов
  машины (никакого TUN);
- `CAPYAGENT_SOCKS_PROXY` и `CAPYAGENT_MODEL_PROXY` службы указывают на
  постоянный местный адрес агента: узел и порт клиента меняются, а каналы и
  клиент модели, запомнившие адрес при запуске, продолжают работать. Свой
  прокси человека важнее: заданная переменная не затирается, а когда заданы
  обе, VPN+ не нужен;
- подписка кончилась или ключи отозваны: агент не падает, возвращается к
  прямому выходу и один раз пишет владельцу в чат. Сбой сети при обновлении
  подписки концом подписки не считается: рабочий узел остаётся;
- `capyagent vpn status|set <ссылка>|off`: `set` проверяет ссылку живьём,
  записывает и перезапускает службу (`-` читает ссылку из stdin, чтобы она не
  легла в историю оболочки). Мастер `capyagent setup`, когда Telegram или
  модель не открываются с сервера, первым вариантом предлагает «Подключить наш
  VPN+» (проверяет узел тем же запросом, что не открывался), вторым свой
  прокси; в файле ответов раздел `"vpnplus": "<ссылка>"`;
- `capyagent doctor` называет VPN+ словами: подключён ли, какой узел, отвечают
  ли через него Telegram и модель, кончилась ли подписка. Команда `/vpn` в
  чате и экран настроек панели говорят, что VPN+ уже подключён и какой узел
  работает;
- в настройках панели плашка VPN+ с кнопкой «Подключить к агенту» и ссылкой на
  бота: текст, пробные дни и ссылка берутся из той же витрины, что `/vpn`.
  Плашку можно скрыть крестиком (запоминается в панели); у подключённого VPN+
  вместо рекламы строка «VPN+ подключён, узел ...»;
- ссылка подписки - секрет: не печатается ни в выводе, ни в журналах, ни в
  файле состояния службы, ни в ответах панели; в каталоге настроек она
  скрыта, как адреса прокси, а из журнала и вывода команд агента вырезается
  так же, как токены.

## v1.2.1 - прокси для Telegram и модели одним адресом, витрина подписки Capy AI

Дата выпуска: при выкладке. Выпуск только ядра.

Сервер в России: `api.telegram.org` режет DPI, а OpenAI отказывает по стране.
Теперь и Telegram, и модель принимают и SOCKS5, и HTTP(S)-прокси:

- `CAPYAGENT_SOCKS_PROXY` (Telegram) и `CAPYAGENT_MODEL_PROXY` (модель)
  понимают `socks5://`, `socks5h://`, голый `host:port` (это SOCKS5), а также
  `http://` и `https://` (туннель CONNECT): логин и пароль берутся из адреса.
  Незнакомая схема - ошибка словами, а не молчаливый ход напрямую. Адрес
  SOCKS5 читается тем же разбором, что и раньше (пароль с `^`, `#`, `?` и
  другими знаками работает, как работал), а цель с адресом IP уходит
  SOCKS5-прокси адресом, а не строкой имени;
- через прокси модели идут вход в подписку ChatGPT кодом устройства,
  проверочные запросы мастера, облачные распознаватели речи
  (Whisper-совместимые облака) и облачная озвучка: до этого вход с
  российского сервера не проходил даже при заданном прокси;
- мастер `capyagent setup` живьём проверяет модель и бота: сетевой отказ
  (таймаут, сброс, 403 «unsupported_country») - и мастер говорит словами,
  что сайт не открывается с этого сервера, предлагает ввести адрес прокси,
  проверяет его и записывает. Один адрес применяется к обоим маршрутам одной
  кнопкой, но уже заданный прокси Telegram адрес, проверенный только для
  модели, не заменяет. Отказ по адресу этой машины (лежащая своя модель)
  прокси не лечит, и мастер его не предлагает; бота, выведенного на свой
  сервер Bot API, мастер в облаке не проверяет: запрос к облаку тем же
  токеном вернул бы бота туда;
- файл ответов вопросов не задаёт: в нём раздел `proxy` - строка для обоих
  маршрутов или `{"telegram": "...", "model": "..."}`, а сетевой отказ модели
  при проверке после записи назван словами вместе с этим разделом. Подсказка
  из образца в разделе - отказ до записи, и он говорит, что раздел можно
  убрать, если прокси не нужен;
- `capyagent doctor` называет маршрут всегда: «Telegram: напрямую» или
  «Telegram: через прокси X» (с `--живьём` - и «отвечает за N мс»),
  «модель: напрямую» или «модель: через прокси». Отказ - причина словами и
  что делать;
- свой сервер Bot API (файлы больше 20 МБ) ходит к серверам Telegram сам,
  мимо прокси: шаг мастера и `capyagent telegram local-api` говорят об этом
  одной честной строкой;
- логин и пароль прокси не попадают ни в вывод, ни в журнал службы: адрес
  всегда печатается без них, а в настройках (панель, API, ответ на `/set`)
  настройки прокси - секреты, видно только «задано»; так же теперь и свои
  прокси каналов `DISCORD_PROXY` и `MATRIX_PROXY`. Учёткой человека прокси
  при этом не считается: один прокси в файлах ответов разных людей - не
  общий ключ, а копия профиля на той же машине переносит его, как и раньше;
- адреса этой машины и её сети (петля, localhost, 10.x, 172.16-31.x,
  192.168.x, 100.64.x, имя без точки - соседний контейнер, имена `.local`,
  `.internal`, `.home.arpa`) идут мимо прокси: своя модель, свой Whisper и
  свой сервер Bot API не ищут петлю на чужом конце;
- рукопожатие с прокси, который принял соединение и молчит, отпускается по
  сроку запроса, по его отмене и без них через 30 секунд, а не висит; отмена
  в миг конца рукопожатия не оставляет на соединении срока;
- как и раньше, это НЕ глобальный `HTTPS_PROXY`: коннекторы площадок закупок
  ходят напрямую и сохраняют российский адрес.

Витрина подписки Capy AI:

- в каталоге моделей появился пункт `Capy AI (подписка)` со статусом
  «в разработке»: это витрина будущей подписки - много моделей по одной
  подписке, без своих ключей и VPN; когда она заработает, появятся и наши
  модели Ameli и Мигом. Пункт виден в мастере настройки и в панели, но
  выбрать его нельзя ни там, ни командой `/model`: мастер говорит словами и
  переспрашивает номер, файл ответов и настройка отказывают до записи,
  а значок пункта означает ровно то, что написано - он ещё в разработке.

Исправлено:

- `capyagent doctor` и знакомство в чате не объявляют «память живёт в
  оперативке» на установке одной строкой, где `CAPYAGENT_DATA_DIR` не задан,
  а каталог данных ядро нашло само; выключенный намеренно каталог
  (`CAPYAGENT_DATA_DIR=-`) по-прежнему даёт эту строку.

## v1.2.0 - записи звонков расшифровываются из коробки, свой сервер Bot API без Docker и сам возвращает бота в облако, разговоры можно продолжать и переносить из других агентов

Дата выпуска: при выкладке. Выпуск только ядра.

Расшифровка на этой машине, без ключа и без Python:

- новый распознаватель `CAPYAGENT_STT_FALLBACK_PROVIDER=whisper`: whisper.cpp
  на этой машине. Программа `whisper-cli` (1.9.4), модель, модель
  определения речи и (если в системе нет своего) ffmpeg скачиваются с канала
  CapyAgent (`capyagent.ru/dl/tools`, зеркало `capyagent.com/dl/tools`) при
  первой записи и ложатся в каталог данных (`instrumenty/<имя>/<версия>/`).
  Каждый файл сверяется с размером и sha256, закреплёнными в бинарнике ядра,
  до того как стать исполняемым; не совпал - не ставится. Две закачки одного
  файла (служба и команда) не идут рядом: второй ждёт замка файла. Звук
  никуда не уходит;
- сборка программы по процессору: на linux/amd64 быстрая сборка с AVX2 -
  только если в `/proc/cpuinfo` у каждого ядра есть `avx2`, `fma`, `f16c` и
  `bmi2`, иначе обычная сборка без AVX (она не падает с SIGILL, но примерно
  в 7 раз медленнее); на linux/arm64 своя сборка;
- модель: `CAPYAGENT_STT_WHISPER_MODEL` (`small` или `large-v3-turbo`) сильнее
  всего, а без неё `large-v3-turbo` - только на быстрой машине (amd64 с
  набором AVX2 или arm64), с не меньше 4 ядрами и не меньше 3 ГБ памяти;
  иначе `small`. Память не узнать (не Linux) - `small`;
- VAD всегда: модель определения речи (Silero, меньше мегабайта) пропускает
  тишину, запись звонка разбирается в 1.6-2.3 раза быстрее, текст не хуже. Не
  скачалась - расшифровка идёт без неё, а не падает;
- любой формат через ffmpeg: запись перекодируется в WAV 16 кГц моно во
  временном каталоге с правами 0700 и удаляется после. Системный ffmpeg
  берётся первым; его нет - с канала скачивается `ffmpeg-audio` (только
  звук, LGPL, рядом на канале лежит его исходник): голосовые Telegram
  (OggOpus) и записи m4a расшифровываются без root и без apt. wav, mp3 и
  flac whisper-cli читает сам, ради них ffmpeg не скачивается. Не скачался и
  системного нет - агент честно отвечает, какой пакет поставить;
- whisper-cli выходит с кодом 0, даже когда запись не прочиталась: пустой
  текст и строка об ошибке в его stderr теперь отказ словами («не смог
  прочитать запись, она повреждена или это не звук»), а не тишина. Битый
  файл при перекодировании - тоже одна строка причины;
- предела 30 секунд нет: часовая запись звонка расшифровывается целиком.
  Срок - около трёх длин записи, но не меньше 10 минут и не меньше двух
  оценок времени, чтобы медленная машина не обрывалась на честной работе
  (`CAPYAGENT_STT_WHISPER_TIMEOUT_FACTOR`, от 1 до 20, заданный сильнее).
  Язык - `CAPYAGENT_STT_LANG`, без него whisper узнаёт его сам;
- одна расшифровка за раз на процесс, через `nice` и не больше 8 потоков:
  машина под агентом не встаёт колом, вторая запись ждёт в очереди, и
  человеку это сказано. Программе не уходит ни один ключ службы;
- длинная запись (больше минуты): до расшифровки в тот же чат уходит строка
  «Получил запись 12 мин, расшифровываю, это займёт около 4 мин» (оценка по
  замерам для модели, сборки, VAD и числа потоков), при первой записи -
  строка о закачке модели. Отдельным сообщением через отправителя
  службы; без него (терминал, HTTP-чат) и в почте - живым статусом. Облачные
  распознаватели и Яндекс на длинную запись говорят то же без оценки
  времени. Сама расшифровка уходит модели, как раньше.

Из коробки:

- мастер настройки сразу после Telegram спрашивает «Расшифровывать
  голосовые и записи звонков на этой машине? Enter - да» и называет размер
  модели. «Да» пишет `CAPYAGENT_STT=1` и `CAPYAGENT_STT_FALLBACK_PROVIDER=whisper`;
  если уже задан ключ SpeechKit, свой адрес или другой поставщик - только
  `CAPYAGENT_STT=1`, выбор владельца не перекрывается. Распознавание уже
  решено (включено или выключено) - вопроса нет. ffmpeg ставить не нужно:
  агент скачает свой с канала при первой записи, root не нужен. Пакетный
  менеджер системы (apt-get, dnf, yum, pacman, zypper, apk; никогда не
  `curl | sh`) остаётся запасным путём для машины, которой с канала взять
  нечего: от root мастер ставит ffmpeg, не от root - печатает команду
  администратору;
- раздел «голос» (`capyagent setup voice`): «да» на голосовые без ключа -
  тот же whisper и тот же шаг ffmpeg;
- файл ответов: новый раздел `"stt"` (true или false). Нет раздела -
  включено, если файл заводит бота Telegram. Значения входят в план и
  проверяются вместе со всем файлом до первой записи; непонятное слово -
  отказ всего файла;
- `capyagent doctor`: какая модель и почему, какая сборка программы
  (avx2, обычная или arm64) и сколько потоков, скачаны ли программа, модель
  и VAD, откуда ffmpeg (система или канал; красная строка с командой - только
  когда его взять неоткуда), и новый раздел «Инструменты»: что скачано с
  канала и сколько занимают прежние версии.

Свой сервер Bot API без Docker:

- включение своего сервера без названного способа (`capyagent telegram
  local-api enable`, шаг мастера, панель) берёт закреплённую сборку
  `telegram-bot-api` с канала CapyAgent, если она есть для этой машины:
  Docker не ставится и не нужен. Сборка ложится в каталог данных службы, и
  служба поднимает именно её (путь не пишется в настройки: их правят из
  панели). Не скачана при старте службы (новая версия после обновления
  ядра) - служба докачает её сама, повтор раз в минуту;
- Docker остаётся запасным путём: сборки для этой машины нет или она не
  скачалась - всё как в v1.1.1, и человеку сказано почему;
- `--binary`: своя программа `telegram-bot-api` из PATH у прежних
  установок остаётся их программой, сборка с канала берётся, только если
  своей нет;
- `status` и `doctor` называют, чем поднят сервер: сборкой с канала или
  своей программой.

Свой сервер Telegram сам возвращает бота в облако:

- свой сервер Bot API больше не молчит до прихода человека: служба сама
  замечает, что опрос своего сервера не отвечает, пробует поднять сервер
  (`docker start` контейнера, а если контейнера нет - завести заново), а если
  не вышло - возвращает бота в облако Telegram тем же откатом, что
  `capyagent telegram local-api disable`, и пишет владельцу причину. Пороги -
  настройки `CAPYAGENT_TELEGRAM_LOCAL_RESTART_AFTER` (по умолчанию 3m) и
  `CAPYAGENT_TELEGRAM_LOCAL_FALLBACK_AFTER` (по умолчанию 10m, `0` - не
  возвращать в облако самому). Отдельных проверок раз в минуту нет: сигнал -
  тот же опрос getUpdates, который канал и так ведёт непрерывно;
- сроки возврата бота в облако после `logOut` исправлены на правду: обычно
  10-15 минут, бывает дольше (живой случай 01.10: облако пустило бота обратно
  примерно через 14 минут). Прежние тексты «через 10 минут облако заберёт
  бота само» убраны: для возврата нужен откат, а не одно ожидание;
- системная служба (`User=capyagent`, так ставит мастер от root) перезапустить
  себя сама не может, и возврат идёт без перезапуска: настройки своего
  сервера снимаются и в файле, и в работающем процессе, бот уходит в облако,
  письмо владельцу ставится сразу, а не при следующем запуске службы.

Telegram для всех:

- части текста одного автора в одном чате и теме, пришедшие подряд с паузой
  меньше 0.3 с (длинное сообщение Telegram режет на части, мысль часто пишут
  несколькими сообщениями), склеиваются в один ход: один ответ вместо
  нескольких. Пауза - `CAPYAGENT_TELEGRAM_TEXT_BATCH_DELAY_SECONDS` (до 60 с,
  `0` - не склеивать), действует со следующего сообщения без перезапуска.
  Команда, файл, альбом, нажатие кнопки и реакция сначала отдают накопленный
  текст, потом идут сами;
- «стоп» обрывает идущий ход и снимает всё, что в этом чате (теме) ещё ждало
  очереди: ожидающие части текста отменяются, и в ответе сказано, сколько их
  было (их текст модели не уходит и в историю не пишется); стоявшие в
  очереди до «стоп» файлы и команды тоже снимаются, без ответа;
- файл, который не удалось забрать, объясняется по-русски, с причиной и
  следующим шагом, а не английским текстом Bot API: больше 20 МБ в облаке
  Telegram (и как включить свой сервер), больше предела агента
  (`CAPYAGENT_TELEGRAM_FILE_LIMIT_MB`), Telegram временно не отдаёт файл,
  скачивание не успело. Подробности остаются в журнале службы.

Разговоры: продолжить, перенести, найти:

- `/new` начинает новый разговор со своей историей, прежний остаётся целым и
  виден в `/sessions`. До v1.2.0 `/new` прятал прошлое в том же разговоре;
  так теперь делает `/reset`. Разрешения «в сессии» и удержанный навык
  снимаются, как раньше;
- `/sessions` - последние разговоры этого канала, `/resume <номер|название|id>`
  продолжает выбранный: следующее сообщение пишется в его историю, выбор
  переживает перезапуск службы. В терминале (`capyagent chat`, экран) видны и
  разговоры из других окон терминала. Закладки `/save` по-прежнему
  открываются `/resume <имя>`, `/rollback <имя>` возвращает к закладке. Кто
  обновился и ничего не переключал, продолжает тот же разговор, что и до
  обновления;
- импорт разговоров других агентов: экран «Сессии» в панели (кнопка
  «Импортировать разговоры») и `POST /api/sessions/import` с ключом панели
  принимают JSON (один разговор, массив, `{"sessions": [...]}`) и JSONL. Весь
  файл проверяется до записи и ложится одним действием; повтор того же файла
  ничего не задваивает, уже импортированные id пропускаются, существующие
  разговоры не трогаются. Пределы: 25 МиБ на файл, 500 разговоров, 10 000
  сообщений в разговоре и 50 000 в файле, 5 МиБ на один разговор. Исходный
  объект каждого разговора хранится как есть и открывается кнопкой «Полный
  оригинал» (всё показано текстом, ссылки не открываются, ресурсы не
  грузятся). Импортированный разговор продолжается из панели кнопкой
  «Возобновить в чате»;
- экран «Разговоры» стал «Сессиями» и показывает разговоры всех каналов
  владельца: превью первой реплики человека, число сообщений, архив и
  возврат из архива, «Возобновить в чате», сводку (всего, активны,
  сообщений, источники) и отбор по источнику;
- у разговоров, начатых через `/new` или продолженных через `/resume` (в том
  числе импортированных), служба запоминает модель и поставщика, которые
  ответили на самом деле (а не выбранных в настройках), рабочую папку,
  отправителя и чат: они видны в `GET /api/sessions/owner` и служат отбором
  предпросмотра очистки;
- поиск по разговорам ищет и в импортированных и умеет отбор по роли
  сообщения: `role_filter` в `/api/sessions/search` (`user`, `assistant`,
  `system`, `developer`, `tool`, `function`, `reasoning`), в панели - поле
  «Роль сообщений»;
- предпросмотр очистки: `POST /api/sessions/prune` с `"dry_run": true`
  показывает, какие разговоры подошли бы под отбор (возраст, источник,
  название, модель, поставщик, папка, число сообщений и вызовов
  инструментов, архив), и ничего не удаляет;
- `capyagent chat --jsonl <текст>`: ответ потоком событий JSON по строке
  (`system`/`init` с моделью и id разговора, `text` кусками, `tool_use`,
  `tool_result`, итоговый `result` с кодом выхода) для скриптов и других
  агентов; неверные аргументы - код 2, прерывание - 130.

Навыки:

- `/reload-skills` (`/reload_skills`) в чате и `capyagent skills reload` в
  терминале перечитывают каталоги навыков у работающей службы без
  перезапуска и говорят, сколько навыков добавилось, ушло и поменялось и
  какие файлы каталог не взял (с причиной). Терминал идёт к службе по её
  адресу и ключу (`POST /api/skills/reload`, ключ панели);
- навыки поставки из терминала, как у беты: `capyagent skills
  list-modified` - какие заводские навыки вы правили (обновление их не
  тронет), `skills diff <навык>` - что именно поменяно, `skills
  opt-out|opt-in <навык>` - выключить и включить без удаления файла (тот же
  список выключенных, что у панели и экрана);
- навыки из источников: `capyagent skills trust|untrust <навык>` - решение о
  доверии, которое переживает переустановку и обновление навыка (`trust`
  ставит подозрительное без `--сила`, как у официального источника,
  `untrust` не ставит осторожное и с официального; опасное не ставится
  никогда); `capyagent skills audit [навык]` без сети сверяет лежащее на
  диске с замком и заново проверяет файлы на угрозы.

Память из терминала, как у беты:

- `capyagent memory status [--json] [--check]` - что за память, где лежит,
  сколько в ней записей и какой внешний поставщик; `--check` заодно
  проверяет его коннектор (значения настроек и ключи в ответ не входят);
- `capyagent memory setup [поставщик]` - мастер внешней памяти для любого из
  восьми поставщиков беты: спрашивает недостающие настройки (секреты -
  скрытым вводом), пишет их в настройки службы, проверяет коннектор и
  включает поставщика только после удачной проверки; служба подхватывает
  его после перезапуска. `capyagent memory off` выключает поставщика,
  оставляя его ключи и данные;
- `capyagent memory reset` стирает всю встроенную память (разговоры,
  заметки, сводки, портрет): без `--да` только показывает, что уйдёт, и
  перед стиранием снимает точку отката, как кнопка сброса в панели.
  `capyagent memory reset --target memory|user|all` сбрасывает только
  заметки, только портрет или оба, тоже с точкой отката; история
  разговоров остаётся; подтверждение спрашивается, `--yes` даёт его заранее.

Ещё:

- задания по расписанию: обычное «да» на вопрос из фонового прогона (при
  `CAPYAGENT_APPROVAL_SCHED=ask`) разрешает только этот запуск, а
  `/approve-job` - эту же операцию в будущих запусках этого задания
  (привязано к заданию, области аккаунта, инструменту и всем аргументам).
  Любая правка задания разрешение отзывает, пауза и возобновление
  сохраняют; «выполни задание сейчас» спрашивает как обычно;
- проекты: несколько папок у проекта (`capyagent project add-folder`,
  `remove-folder`, `set-primary`, `create <имя> [папки...] --primary`),
  доска задач проекта (`bind-board`), активный проект профиля
  (`project use <имя>`); рабочая папка разговора (последний `cd`) помнится
  между перезапусками. Проекты v1.1.1 читаются как есть: их папка
  становится основной;
- модели: поставщик просит подождать (Retry-After) дольше, чем агент ждёт в
  разговоре, а запасная модель настроена - ход сразу уходит запасной, а не
  стоит;
- панель открывается на экране «Сессии» (раньше - «Знакомство»), колонка
  идёт порядком беты: Чат, Сессии, журнал, задания, навыки, расширения, MCP,
  каналы, доступ, профили, настройки, состояние, документы; разделы,
  которых в бете нет (аналитика и другие), - в группе «Дополнительно».

### Ограничения v1.2.0

- закрепления заполнены по файлам, выложенным на канал (whisper-cli 1.9.4,
  ffmpeg-audio 8.1.3, telegram-bot-api 10.3, модели `small` и
  `large-v3-turbo`, VAD); сверены по sha256 через HTTPS. Модели `base` и
  `medium` на канале нет, `CAPYAGENT_STT_WHISPER_MODEL` принимает только две;
- готовые сборки whisper.cpp, ffmpeg-audio и telegram-bot-api - только
  linux/amd64 и linux/arm64. На macOS whisper берётся из PATH
  (`brew install whisper-cpp`), на Windows своего распознавателя пока нет;
- проверено живьём на старом ноутбуке (WSL, 16 ядер, AVX2, Telegram оттуда
  недоступен): скачивание с канала по закреплению с проверкой суммы,
  расшифровка русской речи (голосовое OggOpus, m4a, wav до 10 минут),
  отказ на битых файлах, запуск скачанного telegram-bot-api режимом binary
  (отвечает по HTTP на петле, останавливается). Работу с настоящим Telegram
  (приём голосового и файла больше 20 МБ ботом) не проверял никто: ноутбук
  его не видит;
- на arm64 живьём не запускалось (только под QEMU при сборке), скорость там
  не мерилась: оценка «займёт около» взята как для amd64 с AVX2;
- оценка «займёт около» - по замерам ноутбука с запасом в 1.5 раза на
  машину слабее (доля длины записи на четырёх потоках: `small` 0.26,
  `large-v3-turbo` 0.68 с VAD; обычная сборка без AVX примерно в 6 раз
  дольше), а не обещание. На загруженной машине фактическое время может
  выйти больше: при замерах на ноутбуке с занятыми ядрами `small` без AVX
  разобрал запись за 2.1-2.4 её длины. Заданный множитель срока сильнее
  расчёта;
- уже установленные не меняются при обновлении: `setup --quick` с
  заданным Telegram вопрос о расшифровке не задаёт, записанный способ
  своего сервера (docker) повтор включения не меняет. Включить: `capyagent
  setup voice`;
- сторож своего сервера поднимает контейнер (`docker start`) только если
  пользователь службы может говорить с Docker. У системной службы
  (`User=capyagent`) этого права обычно нет: контейнер поднимается своим
  `--restart unless-stopped`, а сторож через 10 минут молчания возвращает
  бота в облако. Если свой сервер мёртв совсем, выйти с него (`logOut`)
  нельзя, и облако может пускать бота обратно дольше обычных 10-15 минут;
- очистка разговоров по-новому - только предпросмотр через HTTP
  (`"dry_run": true`): удаления по нему нет (запрос без `dry_run` получает
  отказ 501), кнопки в панели нет. Прежняя `capyagent sessions prune` не
  менялась;
- из импортированного разговора агенту в историю уходят только текстовые
  пары «человек - ассистент». Вызовы инструментов, рассуждения, системные
  сообщения и нетекстовые блоки остаются в оригинале (их число показано у
  разговора и в итоге импорта). Упаковка файла (массив, JSONL,
  форматирование) не сохраняется, только объекты разговоров;
- модель, поставщик и рабочая папка запоминаются только у разговоров из
  каталога сессий (начатых `/new` или продолженных `/resume`); у прежних
  разговоров, которых не переключали, они неизвестны, а не пусты;
- `capyagent memory setup` - мастер для терминала: без терминала он не
  пройдёт. Настройки поставщика можно задать заранее `capyagent config set`,
  а включить его - `CAPYAGENT_MEMORY_PROVIDER`;
- `capyagent skills list-modified` и `skills diff` сверяют с эталоном
  `skills-postavka` рядом с программой, а его кладёт только установщик из
  исходников (`deploy/install.sh`). Установка одной строкой с capyagent.ru и
  `capyagent update` ставят только программу: там эти две команды честно
  отвечают, что эталона нет (путь к нему можно задать
  `CAPYAGENT_SKILLS_POSTAVKA_DIR`).

## v1.1.1 - Telegram принимает файлы больше 20 МБ сразу после установки

Дата выпуска: при выкладке. Выпуск только ядра.

- записи звонков, диктофона и другие файлы больше 20 МБ доходят до агента
  без ручной настройки: сборка выпуска несёт ключи приложения Telegram для
  своего сервера Bot API, человеку их вводить не нужно. Свои ключи
  (`CAPYAGENT_TELEGRAM_LOCAL_API_ID`, `CAPYAGENT_TELEGRAM_LOCAL_API_HASH_KEY`)
  по-прежнему важнее встроенных;
- установка одной строкой от root: свой сервер Bot API включается после
  установки службы (каталог данных службы заводит она), а не кончается
  «каталога данных службы ещё нет»;
- расширение браузера ставится из Chrome Web Store.

### Ограничения v1.1.1

- свой сервер ходит к серверам Telegram напрямую: если с машины они не
  открываются (у части провайдеров в России), бот остаётся в облаке с
  файлами до 20 МБ, и мастер говорит об этом словами;
- нужен Docker (или программа `telegram-bot-api` в PATH): от root мастер
  ставит Docker сам;
- уже установленные v1.1.0 переходят на свой сервер командой
  `capyagent telegram local-api enable` или повторным `capyagent setup`.

## v1.1.0 - Telegram принимает файлы больше 20 МБ, установка одной строкой и вход в подписку ChatGPT

Дата выпуска: при выкладке (в собранном выпуске она стоит полем `released`
в `manifest.json`). Выпуск только ядра: настольное приложение в нём не
обновлялось и выйдет отдельно.

Бот отвечает сразу после установки:

- настроен бот Telegram (или другой канал, которому нужен постоянно
  работающий агент) - мастер настройки последним шагом запускает агента
  службой, Enter - «да»: от root на systemd - системная служба
  (`capyagent`, `/etc/capyagent.env`, `/var/lib/capyagent`), без root -
  пользовательская с `loginctl enable-linger` (нет прав - строка с командой
  для администратора, и подъём после перезагрузки не обещается), без
  systemd - одна строка с точной командой запуска.
  То же по файлу ответов: раздел `"service"`, по умолчанию «да» при
  настроенном канале; `--без-запуска` (`--no-start`) - не запускать;
- служба читает ровно то, что записал мастер: при службе мастер пишет её
  файл окружения, прежние настройки, которых служба не видела, переносит
  один раз; повторный `capyagent setup` меняет то, что читает служба, и
  перезапускает её; проверенное живьём значение модели и заново введённый
  токен бота встают на место прежних, а не рядом;
- служба с моделью, которая не поднимется, не запускается: подписка ChatGPT
  без входа - сначала вход кодом устройства, у системной службы прямо в её
  каталог данных (`/var/lib/capyagent/codex/auth.json`); без терминала -
  отказ словами; падающий по кругу юнит мастер не оставляет;
- «Готово» - только после проверки делом: юнит активен и не
  перезапускался за время проверки, ядро отвечает, бот проходит `getMe`
  через адрес Bot API службы, канал Telegram есть в самой службе и на
  связи; иначе причина из журнала и команда `journalctl`. Дверь ядра уже
  занята другим агентом (запущенным руками) - службу мастер не запускает
  и говорит, как его найти;
- мастер возвращает службе каталог данных и файл настроек (файлы root,
  оставленные ручным запуском; ссылки наружу и жёсткие ссылки на чужие
  файлы не трогает), а старшую копию бинарника службы обновляет
  до своей версии; ядро от root на данных системной службы больше не
  поднимается и говорит, как запустить службу;
- бот отвечает владельцу: мастер в терминале записывал ответ на вопрос
  «Ваш числовой id в Telegram» голым числом в `CAPYAGENT_OWNER_CHAT` и не
  заносил его в `TELEGRAM_ALLOWED_USER_IDS`, и бот отвечал самому владельцу
  «Доступ к боту не настроен» под «Готово ... он ответит» (так же писал
  мастер v1.0.13). Теперь владелец ложится адресом `telegram:ID` и
  добавляется в список разрешённых (список дополняется, а не заменяется),
  непонятный ответ переспрашивается; повторный `capyagent setup` (и
  `--quick`) чинит записанное прежним мастером. Без списка «он ответит»
  не обещается, а `doctor` больше не пишет «боту сможет писать кто
  угодно»: без списка бот не отвечает никому;
- `capyagent doctor`: «Telegram настроен, но агент не запущен» и «служба
  упала: <причина>» красной строкой с починкой; без каналов тревоги нет;
  служба стоит, а на двери ядра отвечает другой процесс (агент, запущенный
  руками, или агент Windows рядом с WSL) - красная строка с поиском, а не
  «агент запущен и отвечает»;
- путь обновления с v1.0.13, где служба на подписке ChatGPT лежала в
  `failed`: `CAPYAGENT_UPDATE=1 capyagent update`, затем
  `capyagent setup --quick` ([обновление](docs/obnovlenieIRezerv.md#с-v1013-служба-упала-бот-молчит)).

Установка, вход и обновление:

- установка одной строкой: мастер настройки без службы пишет настройки в
  файл, который читает программа (`capyagent config path`, обычно
  `~/.capyagent/settings.env`), а не в `/etc/capyagent.env`; обычный
  пользователь больше не получает permission denied, а модель видна сразу
  после живой проверки; совет про `systemctl` дают только там, где служба
  установлена;
- OpenRouter, DeepSeek, Groq, Mistral, Together, Gemini и другие пункты
  меню мастера на общем OpenAI-входе поднимаются ключом: адрес и модель
  предлагаются из каталога (Enter), а выбор такого пункта больше не
  кончается «неизвестный CAPYAGENT_PROVIDER» после введённого ключа; пункт
  «Gemini (нативный)» тоже узнаётся;
- подписка ChatGPT подключается прямо в мастере: вход кодом устройства
  (`capyagent login`), ключ API не нужен; ключи и токены вводятся без эха;
- `capyagent update` у клиентов v1.0.11-v1.0.13 снова работает: рядом с
  `bin/` в каталоге выпуска лежат плоские имена бинарников;
- обновление не понижает версию молча: ставится только более новая,
  понизить можно флагом `--разрешить-понижение` (`--allow-downgrade`);
  после установки одной строкой update заводит каталог данных сам;
- `capyagent doctor` на установке одной строкой не красный без ключа
  выпуска и без Python, если коннекторов нет.

Каналы, модели и инструменты:

- фото и альбомы Telegram идут через свой сервер Bot API, а не мимо него;
- голосовые MAX распознаются своей командой (`MAX_STT_COMMAND`,
  `MAX_STT_TIMEOUT`, по умолчанию 240 с);
- зрение видит картинки из подключённых навыков и без работы с файлами;
- ранняя обрезка старых выводов инструментов и порог сжатия в токенах
  (`CAPYAGENT_PRUNE_TOOL_OUTPUT_AT`, `CAPYAGENT_PRUNE_TOOL_OUTPUT_MIN_CHARS`,
  `CAPYAGENT_COMPRESS_AT_TOKENS`): мастер включает их только новой
  установке;
- `CAPYAGENT_IMPORT_HOST_CREDENTIALS` (auto, on, off): установка со своим
  каталогом данных не по умолчанию не берёт входы других программ из дома
  хозяина машины;
- запись встреч capy-meet-mcp 1.1.0: своя команда расшифровки
  (`CAPY_MEET_STT_COMMAND`).

Telegram и файлы больше 20 МБ:

- бот Telegram из коробки принимает в чате файлы больше 20 МБ (до 2 ГБ, одним
  файлом по умолчанию до 200 МБ): агент поднимает на этой же машине свой
  сервер Telegram Bot API (контейнер Docker или программа `telegram-bot-api`),
  переводит на него бота и читает присланное прямо с диска; раньше облако
  Telegram не отдавало боту файлы тяжелее 20 МБ, и часовая запись встречи до
  агента не доходила;
- включается само: мастер настройки сразу после токена бота (Enter - «да»,
  файл ответов - `"telegram_local_api": false`, чтобы не включать), панель и
  настольное приложение после сохранения токена; ход перевода виден на экране
  «Каналы», перезапуск агента, пока перевод идёт, не даётся; вручную -
  `capyagent telegram local-api enable | disable | status`, раздел в
  `capyagent doctor`;
- перевод бережёт от потери сообщений: бот уходит из облака только тогда,
  когда свой сервер уже отвечает и серверы Telegram с машины открываются
  напрямую, настройки пишутся только когда свой сервер узнал бота; пока
  служба переходит на новые настройки, отказ облака её не роняет;
- нет Docker - мастер предлагает поставить его пакетным менеджером системы;
  машине, пересылающей IPv6 (маршрутизатор, VPN), Docker сам не ставится:
  Docker 27 при запуске оборвал бы эту пересылку; на RHEL и родственных вместо
  podman-docker ищется Docker Engine; при SELinux каталог сервера монтируется
  с нужной меткой;
- сервер слушает только 127.0.0.1: на Linux контейнер живёт в сети машины, и
  порт не открыт другим контейнерам; программе сервера не отдаётся окружение
  службы с токеном бота и ключами моделей;
- переезд с беты: если бета уже держит этого бота на своём сервере Bot API
  этой машины, ядро берёт тот же сервер, второй не поднимает; `capyagent
  pereezd` называет такой сервер;
- откат (`disable`, снятие службы) возвращает бота в облако; если контейнер
  снять не удалось, откат кончается ошибкой с командой, а не словом «готово»;
- скачанные сервером файлы старше 3 дней служба удаляет сама
  (`CAPYAGENT_TELEGRAM_FILES_KEEP_DAYS`); каталог сервера (в нём сессия бота)
  не попадает в резервные копии и снимки перед обновлением.

### Ограничения v1.1.0

- настольное приложение остаётся 1.0.13: в этом выпуске обновлено только
  ядро;
- в сборке выпуска нет ключей приложения Telegram: свой сервер Bot API
  (файлы больше 20 МБ) включается после ключей с my.telegram.org
  (`CAPYAGENT_TELEGRAM_LOCAL_API_ID`, `CAPYAGENT_TELEGRAM_LOCAL_API_HASH_KEY`),
  мастер говорит об этом словами; до тех пор бот работает через облако
  Telegram с файлами до 20 МБ;
- установка одной строкой от root: шаг своего сервера Bot API идёт до
  установки службы и откладывается, включать после неё -
  `capyagent telegram local-api enable`;
- путь ядра проверен тестами на подставных серверах, живьём на настоящем боте
  ещё не проверялся;
- любая сторонняя программа, которая шлёт этим ботом прямо в
  api.telegram.org, возвращает бота в облако: такие скрипты нужно перевести на
  адрес своего сервера;
- из панели Docker не ставится: нужна команда в терминале;
- Windows и macOS: Docker Desktop ставится вручную.

## v1.0.13 - подключение подписки Codex держится

Дата выпуска: 10.09.2026. Исправительный выпуск по дефектам, найденным на
боевых установках.

- обновлённый ключ обновления Codex записывается обратно в `auth.json`:
  поставщик меняет его при каждом обновлении, и после перезапуска агент
  предъявлял отработанный ключ, подписка отзывалась с ошибкой 401; запись
  атомарная, права 0600, чужие поля файла целы, два процесса над одним файлом
  не мешают друг другу; если файл не пишется, агент работает в памяти и один
  раз предупреждает в журнале;
- `/connect` доступен владельцу и людям из белого списка канала, отказ называет
  адрес владельца; раньше при заданном владельце клиент, чья подписка и
  подключается, получал отказ;
- ответ хозяина машины на `/connect` опознаётся по времени файла, а не по
  изменению содержимого: повторное подключение поверх лежащего ключа работает;
  по таймауту различаются «хозяин не ответил» и «лежит прежний ответ от даты»;
  на установке без хозяина повторный `/connect` отвечает тем же честным
  «принять некому»;
- слежка за входом сверяет метку запроса и гасится при отмене; отмена и быстрый
  повторный `/connect` не затирают друг друга; запрос ложится на диск целиком;
- длинная генерация больше не обрывается на трёх минутах: общий потолок HTTP-запроса
  к модели снят у всех поставщиков, живость держат ожидание заголовков, ожидание
  следующего куска потока (десять минут, рассуждающая модель может молчать) и срок от
  вызывающего либо настройка `CAPYAGENT_MODEL_REQUEST_MIN` (умолчание 30 минут); обрыв по истёкшему сроку не
  повторяется трижды; раньше «Глубокий анализ» закупки падал через девять минут
  тремя одинаковыми обрывами;
- если поставщик замолчал, агент уходит к запасному вместо того, чтобы ждать
  впустую: раньше зависший поставщик держал ход около получаса и заканчивался
  отказом, теперь ответ приходит от запасного, а отказ основного виден в
  кабинете и в `doctor`; к молчащему стучимся один раз, а не трижды; истёкший
  срок запроса к запасному не уводит, у него времени столько же;
- ответ поставщика, который думает над ним дольше минуты, больше не
  обрывается: ожидание первого признака ответа у непотоковых поставщиков
  поднято до десяти минут, а сообщение об обрыве называет тот срок, который
  стоит у этого поставщика;
- нажатая человеком кнопка у карточки темы (например «Пропустить») исполняется
  агентом сразу, без обращения к модели и без повторного подтверждения; запреты
  и выключенные инструменты в силе; удаление темы по инициативе самой модели
  по-прежнему требует подтверждения.

### Ограничения v1.0.13

- эффект кнопок появляется с новыми карточками (модель помечает кнопку
  действием) и только в Telegram;
- отработанный ключ прежних установок не воскресает: нужен новый вход, дальше
  файл держится свежим;
- `codex` руками против каталога агента запускать нельзя: ключ ротируется, и
  сторонний запуск сожжёт сессию;
- остальное как в v1.0.12: относительные даты и тексты усердия на английском
  виде остаются русскими, терминал печатает цветной вывод команд буквами,
  установщики не подписаны и не notarized, коннекторам нужен уже установленный
  совместимый Python.

## v1.0.12 - панель причёсана: чат как главный экран

Дата выпуска: 09.09.2026.

- чат стал главным экраном: разговор открывается сразу, а разделы панели
  переехали в шапку и в выдвижной ящик;
- знакомство проходит прямо в чате, шаг за шагом, и его ответы помнит агент, а
  не браузер: начали на компьютере, продолжили с телефона;
- файлы прикладываются скрепкой в поле ввода: приложенный файл виден фишкой до
  отправки, остаётся в переписке после неё и называется тем именем, которым его
  назвали вы;
- список файлов относится к текущей беседе, а не ко всему агенту;
- беседы собраны в колонку слева, с группами по дням и поиском; в списке видно
  название и когда был последний ответ;
- карточки систем стали компактными: имя, состояние и действие в одной строке,
  отказ системы говорит человеческой фразой вместо технического следа;
- слово состояния у поставщика модели больше не обещает лишнего: «готова»
  стоит только там, где модель можно выбрать одним нажатием;
- английский вид панели стал английским по-настоящему: имена и описания
  встроенных систем, каталога MCP и наборов инструментов переведены;
  расширения остаются на языке их авторов;
- отказ Telegram при сохранении токена уложен в одну понятную фразу;
- терминал открывается отдельным полноэкранным видом с кнопкой возврата в чат.

### Ограничения v1.0.12

- относительные даты, ответы ассистента и тексты усердия на английском виде
  остаются русскими;
- терминал показывает цветной вывод команд (например `ls`) с управляющими
  последовательностями буквами; терминал по умолчанию выключен;
- коннекторам по-прежнему нужен уже установленный совместимый Python;
- установщики не подписаны сертификатом и не notarized: Gatekeeper и
  SmartScreen могут показать предупреждение.

## v1.0.11 - установка на macOS, честный фон и закрытые ходы

Дата выпуска: при выкладке (в собранном выпуске она стоит полем `released`
в `manifest.json`).

- macOS-сборка подписывается при сборке ad-hoc, без сертификата: скачанное
  приложение больше не объявляется повреждённым, система показывает обычное
  окно «незаверено», и запуск проходит через «Все равно открыть»;
- страница установки описывает первый запуск на macOS по шагам, мышью;
- задание по расписанию не оставляет висящий вопрос: опасное действие в
  фоновом прогоне получает отказ, а отказ записывается в журнал задания, в его
  последнюю ошибку и в журнал службы;
- окружение установленной службы читают только команды, которые её
  обслуживают; свой второй экземпляр поднимается рядом ключом
  `--без-окружения-службы`;
- один каталог данных занимает один процесс: второй получает отказ с внятной
  причиной, а не тихо делит с первым бота и данные;
- ожидающее подтверждения действие сохраняется на диск до публикации,
  загружается строго и не остаётся только в памяти после ошибки записи;
- список ожидающих подтверждений отличает здоровый пустой список от
  недоступного хранилища и во втором случае отвечает HTTP 503;
- ошибка загрузки профиля команды или её правил закрывает доступ, а правила
  проверяются повторно перед завершением хода;
- каталог профилей команды публикует только целую ревизию, защищается от
  устаревшего писателя и сохраняет последнюю корректную версию при ошибке;
- HTTP-вызов передаёт сторожу и коннектору отдельные неизменяемые снимки
  точных аргументов, отклоняет неоднозначный JSON и закрывается до эффекта;
- дочерний исполнитель получает свежий снимок прав и общий родительский счёт,
  но не получает родительские правила, разговор и хранилища памяти;
- привилегированный мост desktop принимается только от ожидаемого главного
  окна и доверенного локального документа; вторичные окна его не получают;
- явно выбранный файл учётных данных Codex остаётся единственным источником:
  при его отсутствии адаптер не переключается молча на другой аккаунт;
- открытый навык удерживается в контексте между ходами: тело подаётся заново
  в каждом ходу, с пределами в двенадцать ходов, полчаса и два навыка на
  разговор, а имя и остаток ходов видны в `/статус` и `/навыки`;
- модели и ключи собраны в разделе «Настройки»;
- кеш запроса к модели включён по умолчанию там, где он даёт выгоду.

### Ограничения v1.0.11

- коннекторам по-прежнему нужен уже установленный совместимый Python;
  свой Python в комплекте и настольный набор коннекторов ещё впереди;
- установщики не подписаны сертификатом и не notarized: Gatekeeper и
  SmartScreen могут показать предупреждение.

## v1.0.10 - desktop без лишних кругов

- настроенный пользователь при запуске приложения попадает сразу в чат, а
  первый запуск без модели остаётся в безопасном мастере;
- встроенный чат больше не дублирует боковую панель, не просит уже переданный
  токен и показывает понятное состояние загрузки;
- поправлены размеры интерактивных элементов, клавиатурный фокус,
  переполнение вкладок и режим уменьшенного движения;
- найденный домашний путь показывается через `~`, но при выборе сверяется с
  заново найденным источником;
- выбранный preview памяти корректно добавляется и в уже заполненный черновик,
  после чего пользователь проверяет и сохраняет текст сам;
- нативная release-матрица теперь запускает распакованное desktop-приложение
  и проверяет его ядро авторизованным запросом;
- инструкции установки переведены на реальные файлы GitHub Release, исправлены
  имена macOS-артефактов и порядок проверки серверного архива.

## v1.0.9 - подготовка публичного выпуска

- добавлен безопасный экран первого запуска: характеристики устройства,
  найденные локальные способы отвечать и известные источники памяти;
- найденный вход ChatGPT через Codex можно выбрать отдельной кнопкой;
  токены не показываются, а применение явно сообщает о необходимости
  перезапуска;
- превью правил и заметок можно добавить только в редактируемый черновик
  портрета. Исходные файлы не меняются и ничего не импортируется молча;
- desktop-приложение получило минимальный защищённый мост для перезапуска
  после выбора провайдера;
- релизные проверки отделяют публичные материалы от внутренних документов.

## v1.0.8

- улучшены локальная панель, диагностика, память, коннекторы и обновление;
- установочные архивы содержат контрольные суммы, манифест и SBOM;
- добавлены проверки комплектности desktop-артефактов.

## Ограничения выпуска

Поддерживаемые платформы и фактически приложенные установщики перечисляются
в манифесте конкретного выпуска. Непроверенный артефакт не считается готовым.
