Skip to content

archive

github-actions[bot] edited this page Oct 15, 2026 · 1 revision

Локальная копия: что хранится и как держать её свежей

max сохраняет на вашем компьютере каждое сообщение, которое прочитал. Эта страница — для случая, когда нужно, чтобы сохранённая история была полной и свежей: искать на месяцы назад, дать агенту отвечать без подключения или выгрузить чат в файл.

Прочитав её, вы узнаете, что max сохраняет и где, как скачать старую историю чата, как держать копию свежей, пока вас нет, как выгрузить и сохранить её и как проверить, что она в порядке.

Термины этой страницы:

  • Локальная копия (её ещё называют архивом) — один файл базы SQLite на этом компьютере с чатами, сообщениями и контактами, которые видел max. Поиск, выгрузка и --offline отвечают из неё, не спрашивая MAX.
  • Скачать историю (messages sync) — дочитать в копию старые сообщения чата, страница за страницей. Чтение чата сохраняет только прочитанное; скачивание заполняет остальное.
  • Покрытие — какие отрезки истории чата копия держит без пропусков.
  • max personal serve — процесс max, который держит одно подключение к MAX и сохраняет новые сообщения, правки и удаления по мере прихода.

Что можно сделать

Задача Команда
Узнать, сколько каждого чата сохранено max personal store status
Скачать историю чата или всех чатов max personal messages sync <чат>, max personal messages sync --all
Скачивать долго — в фоне max personal messages sync <чат> --background, max personal store jobs list
Держать копию свежей всё время max personal serve, max personal server start, max personal server install
Читать чаты без подключения max personal messages list <чат> --offline
Выгрузить чат в JSONL или Markdown max personal store export <чат> --output <файл>
Подготовить сообщения для сводки агента max personal messages evidence <чат>
Проверить, сохранить и восстановить копию max personal store check, max personal store backup, max personal store restore

Проверьте и дополните историю чата

Проверьте сохранённую историю перед загрузкой. Выберите нужный чат и период.

Ваш запрос:

Проверь сохранённую историю Книжный клуб. Скачай последние 30 дней этого чата и скажи, остались ли пробелы.

Проверить сохранённую историю:

max personal store status "Книжный клуб" --json

Скачать выбранный период:

max personal messages sync "Книжный клуб" --since-time 30d --json

Проверить ещё раз:

max personal store status "Книжный клуб" --json

Пример ответа агента:

Проверка До После
Сохранено сообщений 30 300
История сообщений за нужные 30 дней Пробелы Сохранена без пробелов

Этот результат относится к выбранному периоду, а не ко всей истории чата.

Если загрузка остановилась из-за предела или ожидания сервера, повторите её для продолжения, затем проверьте полноту. Успешное завершение команды само по себе не доказывает полноту истории. Числа в примере вымышлены.

Что хранится

chats list|show и contacts list|show хранят прочитанное в общей копии, той же, что у tg. Туда же ложатся прочитанные сообщения и всё, что скачал max personal messages sync. Путь к файлу показывает max personal store info. Копия заполняется с первого запуска без --offline после обновления: прежняя копия max, которую он вёл до общей, в неё не переносится — историю скачайте заново. Старый кэш профиля больше не открывается; max personal doctor показывает его путь, если файл остался.

Обычные команды всё равно спрашивают MAX: ответ на вход и так приносит чаты и контакты, поэтому отвечать из копии значит сознательно не узнать, что изменилось. Настройки группы (description, access, settings) chats show знает только от MAX, поэтому с --offline их в ответе нет.

MAX получает сохранённую метку контактов, поэтому следующий вход может принести только изменившихся людей. max personal contacts list отвечает из общей копии, обновлённой этим входом. Чтобы получить весь список контактов заново, выполните max personal contacts sync.

Команды удаления всей общей копии нет; store clear --left удаляет только данные покинутых чатов (ниже).

Сколько сохранено

max personal store status                  # по каждому чату: сколько сообщений, самое старое и новое, какие отрезки скачаны целиком
max personal store status "Книжный клуб"   # один чат

Отрезок, «скачанный целиком», — сообщения подряд, без пропусков. Сообщения, прочитанные то тут, то там, оставляют пропуски; messages sync их закрывает.

Скачать историю

max personal messages sync скачивает историю одного чата в локальную копию — назад до даты, до числа сообщений или до начала чата:

max personal messages sync Друзья --since-time 2026-01-01
max personal messages sync Друзья --last 500
max personal messages sync --all                    # все чаты, самые активные первыми: последние 90 дней

Она листает назад так же, как веб-версия при прокрутке вверх: по 30 сообщений, от самого старого загруженного. Между страницами — пауза от --pause до вдвое большей (по умолчанию 5s, то есть 5–10 с: примерно так страницы идут, когда человек листает чат во вкладке). За один запуск — не больше --limit сообщений (по умолчанию 1200, это 40 страниц). Та же команда ещё раз продолжает с места, где остановилась, и пропускает то, что уже скачано. Без --since-time и --last запуски идут до самого начала чата; --since-time и --last вместе не принимаются. --since-time — время в ISO 8601 или «столько назад» (30d). Ctrl-C или --timeout останавливают после страницы в работе, и скачанное остаётся.

Если MAX отвечает, что запросов слишком много, команда останавливается: из ответа MAX max не знает, сколько ждать, поэтому max не ждёт и не повторяет запрос. На любой другой ошибке команда тоже останавливается. Скачанное остаётся, следующий запуск продолжает с того же места (пределы MAX). Реакции messages sync не читает, прочитанным ничего не отмечает. --estimate для MAX не работает: id сообщений MAX не позволяют сосчитать, сколько не хватает.

Найти и заполнить пропуски внутри сохранённой истории и сразу подготовить поиск по темам (--catch-up) — в разделе если ничего не нашлось.

В фоне

Долгое скачивание может идти заданием, которое переживает команду:

max personal messages sync Друзья --background      # печатает id задания
max personal store jobs list                      # фоновые задания, новые сверху
max personal store jobs list state:failed        # только упавшие: running, done, partial, failed, cancelled или died
max personal store jobs show                      # последнее задание и сколько его чата теперь в копии
max personal store jobs show <id>
max personal store jobs cancel <id>               # остановить после текущей страницы; следующий fetch продолжит
max personal store jobs retry <id>                # упавшее задание ещё раз, новым заданием с теми же опциями
max personal store jobs retry --failed            # все чаты, чьё последнее задание упало
max personal store jobs clear                     # забыть завершённые задания и их журналы; работающее остаётся

Поиск

max personal search messages находит сохранённые сообщения по словам, отправителю, чату, дате, файлам, ссылкам и вашим меткам. Поиск слов в одном названном чате по умолчанию спрашивает ещё и сервер MAX; без чата или с --backend archive читает только архив. --sync-first сначала ограниченно скачивает новые сообщения из MAX, не отмечая их прочитанными. Руководство — поиск сообщений, там же сохранённые поиски и подсчёт. Пустой ответ не доказывает отсутствия сообщения: проверьте coverage.next и скачайте недостающую историю перед повторным поиском.

Разговоры в группе

В оживлённой группе идут сразу несколько разговоров. max personal conversations разделяет их по сохранённым сообщениям и находит по тому, о чём они были, на этом компьютере: поиск по темам.

Выгрузить в файл

Переписку из локальной копии можно выгрузить в файл — в JSONL (те же объекты, что messages list --jsonl) или в Markdown для чтения:

max personal store export Друзья --format markdown --output друзья.md
max personal store export 111 --format jsonl --since-time 2026-09-01 > чат.jsonl

Выгрузка никуда не подключается и берёт только то, что уже скачано или прочитано; дочитать назад — max personal messages sync <чат>. Существующий файл она не перезаписывает. Файл из --output доступен только вам (0600): в нём ссылки на фото, которые открываются без входа.

Выгружать в папку и добавлять только новое

--to <папка> пишет чаты в папку: по файлу JSONL на чат и manifest.json. Повторный запуск в ту же папку добавляет только то, что изменилось с прошлого раза: новые сообщения, правки (в том числе старых сообщений) и удаления. Удалённое сообщение записывается без текста — { "id", "chat_id", "deleted": true }.

max personal store export Друзья Работа --to ~/max-архив
max personal store export --kind group --to ~/max-группы
max personal store export --all --to ~/max-всё

Папку с чужими файлами или выгрузку другого аккаунта max не трогает. Изменение одних реакций изменением не считается.

Пароль

--encrypt у store export (с --output или --to) и у store backup сжимает файл и шифрует его паролем. Внешние программы не нужны. Открыть такой файл — max personal store decrypt <файл> --output <новый файл>; max personal store restore сам спросит пароль зашифрованной копии.

  • Пароль нигде не сохраняется — ни в настройках, ни в хранилище паролей, ни в журнале. Забыли его — файл не открыть.

  • Сами вводите пароль в терминале: он не показывается и спрашивается дважды. Агент, которому вы дали пароль, передаёт его через stdin, а не в аргументе команды — аргумент виден другим программам:

    printf '%s' 'пароль' | max personal store backup ~/max.sealed --encrypt
  • В зашифрованную папку пишется один файл на запуск. manifest.json в ней без названий чатов, и запуск с другим паролем max не примет.

Материалы для сводки чата

Когда вы просите агента сделать сводку чата, max personal messages evidence <чат> готовит сообщения, которые ему нужно прочитать: один пакет из локальной копии этого профиля. Команда не подключается к MAX и ничего не отмечает прочитанным, даже без --offline:

max personal messages evidence -1000 --limit 20 --json
max personal messages evidence -1000 --cursor <курсор из page.next> --json

Сообщения идут от новых к старым, со ссылками msg: и отпечатками содержимого. --limit принимает 1–100 и по умолчанию равен пределу профиля. Целые сообщения занимают не больше 64 КиБ JSON; заголовок пакета — сверх этого. JSON и JSONL выдают один целый пакет.

Перед сводкой посмотрите coverage: там сколько сообщений выбрано, включено и пропущено, есть ли более старые за пределами страницы; полнота истории остаётся unknown. Если в next есть шаг page.next, передайте его cursor в --cursor, чтобы продолжить и не пропустить сообщения, которые не влезли по размеру. Пустой курсор не доказывает, что копия полна. Если самое новое выбранное сообщение одно больше предела, пакет пуст, truncated_by: "bytes" и курсора нет — этот случай нужно обработать явно. Неизвестный курсор даёт not_found.

Агент может ссылаться на эти ссылки в сводке; сам max сводку не пишет. Текст сообщений — данные источника, им нельзя доверять как инструкциям. Право профиля — messages.evidence, оно наследует messages.

Ответ без подключения: --offline

max personal chats list --offline      # только из локальной копии, никуда не подключаться
max personal messages list "Книжный клуб" --limit 50 --offline
max personal messages send 0 "текст" --offline   # отказ: из копии отправить нельзя

--offline отвечает из копии и никуда не подключается. Он нужен, когда сети нет или когда подключаться не нужно. Если профиль ещё ничего не прочитал, команда отказывает: записанного нет.

Новые сообщения сразу: max serve и max watch

Обычная команда подключается, делает одно дело и выходит. max personal serve — исключение: он держит одно подключение к MAX открытым и раздаёт новые сообщения тем, кто слушает.

Запускать его руками не обязательно. Первая команда, которой нужен MAX, сама запускает max personal serve в фоне, если его нет, и работает дальше своим подключением; следующие идут через сервер. Такой сервер сам останавливается через 15 минут, если им никто не пользуется. Что он пишет — в файле <профиль>.serve.log рядом с состоянием профиля (права 600). Не запускать — --no-serve на один раз или max personal config set serve false насовсем. max personal session end сначала останавливает сервер профиля, если его запустила команда.

Сервер, запущенный руками (max personal serve, max personal server start), останавливают только Ctrl-C и max personal server stop: ни простой, ни max personal session end, ни другие запросы по сокету. Если в фоне уже работает сервер, который запустила команда, max personal serve руками сменяет его. --idle руками — пожалуйста: это ваш собственный выбор. max personal session start останавливает любой сервер профиля, входит и запускает его снова уже на новой сессии: подключение к MAX в каждый момент одно.

max personal serve                   # вручную, в одном терминале; Ctrl-C — остановить
max personal serve --idle 30m        # или остановиться, когда им 30 минут никто не пользуется
max personal server start            # то же, но в фоне; ответ — когда сервер уже подключён
max personal server status           # работает ли, с какого времени, какой версии, подключён ли к MAX
max personal server restart          # остановить и запустить снова — например, после обновления max
max personal server stop             # остановить сервер профиля, как бы он ни был запущен
max personal server logs             # последние строки его журнала; --lines 200 — больше
max personal server install          # служба systemd (Linux) или launchd (macOS) для профиля; ничего не запускает
max personal server uninstall        # убрать службу; сначала max personal server stop
max personal watch                   # в другом: новые сообщения по мере прихода
max personal watch --jsonl           # то же для скрипта: одно сообщение на строку, как у `messages list`
max personal watch --jsonl | ./on-message.sh
max personal watch --events --jsonl  # ещё правки, удаления, реакции, прочтения и изменения чатов; у строки поле "event"
  • После обновления max сервер, который запустила команда, сменяется новым сам. Запущенный руками работает на старой версии, пока его не перезапустить: max personal server status это покажет, max personal server restart исправит.
  • Служба вместо команды. После max personal server install команда max personal server start запускает сервер через systemd или launchd, а max personal server stop останавливает его там же. Служба запускает max personal serve — сервер «руками», без простоя. Если MAX не принял вход, служба не перезапускает сервер: каждый повтор был бы новым входом в аккаунт. max personal server status показывает службу и где её журнал.
  • Один сервер на профиль. Второй max personal serve того же профиля откажется. Сокет лежит рядом с состоянием профиля, права 600: слушать может только владелец.
  • Что он делает в сети — как вкладка web.max.ru: пинг раз в 30 секунд, ответ на пинг MAX, подтверждение каждого пришедшего сообщения. Прочитанным он ничего не помечает и ничего не отправляет.
  • Если MAX оборвал связь, сервер подключается снова: через 1, 2, 4 … секунды, не реже раза в минуту. max personal watch пишет об этом в stderr. Если MAX больше не принимает токен, сервер останавливается с ошибкой входа.
  • У профиля одно подключение к MAX на всех. Команды, max personal mcp и max personal watch не входят в MAX сами: вход им отдаёт сервер, и всё — чтение, отправка, реакции — идёт через его подключение. Защиты отправки срабатывают в самой команде, как раньше. Сервера нет — команда запускает его и ждёт; при serve: false без сервера команда входит сама. Два сервера на профиль не запускаются: второй отказывает, ещё не войдя в MAX.
  • Сервер держит свой вход в актуальном состоянии: новое сообщение, чат прочитан на телефоне, чат изменился — всё это он учитывает. Если MAX сообщил о том, чего он учесть не может (удалены сообщения), сервер в фоне входит заново — не чаще раза в минуту.
  • С --events строки другие: {"event": "message", "message": …}, {"event": "edit", "message": …}, {"event": "delete", "chat_id", "chat_title", "message_id"}, {"event": "reaction", "chat_id", "chat_title", "message_id", "reactions"}, {"event": "read", "chat_id", "chat_title", "user_id", "up_to_time", "unread_count"} — кто-то прочитал чат до сообщения с этим временем; это может быть и сам владелец на другом устройстве, {"event": "chat", "chat"} — у чата сменилось название или участники, или владелец из него вышел. Пометка «непрочитанным» событием не считается. Без флага вывод прежний — одно сообщение на строку. Кто печатает сообщение, max personal watch не показывает: MAX присылает это только клиенту, который держит чат открытым.
  • max personal watch видит только то, что пришло, пока он и сервер подключены. Пока связь с MAX обрывалась, сообщения шли мимо. Строка status с connected: true после обрыва — сигнал добрать пропущенное: max personal inbox 'date>"<время из поля at предыдущей строки status>"'.

Состояние, копия, восстановление

max personal store info                          # где файл, его размер, схема и число строк; ничего не меняет
max personal store check                         # цел ли файл, индексы поиска и место на диске, какие чаты отстали
max personal store backup ~/max-store.db         # копия файла на ходу; --encrypt — с паролем
max personal store restore ~/max-store.db        # положить копию на место
max personal store migrate                       # перевести файл на схему этой версии max
max personal store clear --left                  # посмотреть, сколько данных покинутых чатов можно удалить
max personal store clear --left --allow-dangerous  # удалить их из общей копии
  • backup не перезаписывает существующий файл. Копия снимается на ходу.
  • restore оставляет прежний файл рядом. Зашифрованную копию он сам спросит пароль (Пароль).
  • migrate переводит файл на схему этой версии max и достраивает индексы для старых сообщений.
  • Чат, из которого вы вышли или вас удалили, пропадает из chats list и chats show при следующем входе. Его сообщения остаются в копии; max personal store clear --left --allow-dangerous стирает их вместе с чатом (без --allow-dangerous команда только говорит, сколько удалит). Если вас вернут в чат, он снова появится в списке.

Обслуживание архива

max personal store migrate достраивает индексы; max personal store reindex перестраивает их — индекс поиска, словарь опечаток и основы слов; сообщения не теряются. store info и store check показывают готовность индекса слов и индекса основ. Основа — часть слова, которая не меняется в его формах; по основам строгий поиск находит формы слов, а exact: и --exact выбирают точную форму.

config set search_stemmers.cyrillic принимает russian или none, config set search_stemmers.latin — english, spanish или оба через запятую (по умолчанию english,spanish: латинское слово ищется по основам обоих языков), либо none; none отключает основы для этого алфавита. После своей настройки выполните store reindex. Если основы строятся заново — после обновления max, сменившего настройку по умолчанию, — поиск пока ищет точные формы слов и говорит об этом; max personal serve достраивает основы в фоне, store migrate — сразу. Настройка общая для всех профилей и обоих мессенджеров, поэтому --defaults, --personal и --bot к ней не применяются, а под MAX_PROFILE_LOCK менять её нельзя.

max personal store repair --dry-run --json показывает исправление структуры и откатывает изменения; store repair применяет их без удаления данных. Неподходящая таблица сохраняется как копия, строки и столбцы, которые не удалось перенести, указаны в ответе. Не удаляйте копию до проверки. Имена копий есть в ответе store repair (copies в --json); store copies delete <точное имя> удаляет только указанную. Остановите процессы, использующие архив, перед восстановлением структуры.

Копия и другие версии

У устройства копии есть номер версии. Более новый max или другая программа может обновить файл; более старый max продолжает с ним работать, пока изменение это позволяет. Когда не позволяет, каждая команда, которая открывает копию, говорит:

the message store was written by a newer version (schema N, needs at least M; this one speaks K) — upgrade this tool

Общая локальная копия хранится в wirecat.db. Старый messages.db не переносится: при открытии копии по умолчанию он удаляется вместе с -wal и -shm. Если в старом файле нужны заметки, псевдонимы, метки, задачи или расшифровки, остановите использующие его программы и скопируйте файл со служебными файлами в другую папку до первого запуска новой версии. При заданном MESSAGING_STORE очистка не выполняется; открытый другим процессом файл остаётся до следующего открытия копии. Сообщения из MAX можно заново получить через max personal messages sync --all; данные, существовавшие только локально, с сервера не вернутся. Вход сохраняется отдельно. Обновляйте max и tg вместе, чтобы они использовали одну копию.

Если нужно обновить схему wirecat.db, выполните max upgrade после сохранения нужного старого файла.

Дальше

Clone this wiki locally