Skip to content
github-actions[bot] edited this page Oct 14, 2026 · 1 revision

Поиск

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

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

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

  • Локальная копия (её ещё называют архивом) — база на этом компьютере, где max хранит каждое прочитанное или скачанное сообщение (локальная копия). Большинство поисков читают только её.
  • Запрос — то, что вы ищете: обычные слова или слова с полями вроде from: и date:. Запросы за вас пишет ИИ-агент; весь язык — в справке по языку запросов.
  • Покрытие (coverage) — что поиск мог увидеть: сколько чатов и сообщений сохранено и какие чаты ни разу не скачаны или отстали.

Если помните вопрос, а не точные слова

Попросите ИИ-агента найти сообщения, отвечающие на вопрос, и показать основания ответа. Например: «Найди время ежедневной выгрузки проекта Маяк в его чате и проверь, менялось ли расписание». Агент может искать частичные совпадения слов и прямые ответы, затем проверить найденные сообщения. Для этого нужна скачанная история; модель скачивать не требуется.

Для управления из командной строки:

max personal search messages 'Во сколько ежедневная выгрузка проекта Маяк? chat:990' --discover --json

Это поиск только в локальном архиве. Ограничения чата, автора и даты сохраняются. В MCP передайте discover: true инструменту поиска сообщений. items[].discovery.missing_terms показывает отсутствующие слова, а parent связывает прямой ответ с подходящим родителем. Высокая оценка не означает уверенность в ответе: первым может оказаться вопрос, предложение или старое решение. Прочитайте основания и проверьте покрытие архива, прежде чем считать факт отсутствующим.

Без --discover действует обычный строгий поиск. Boolean-синтаксис, фразы в кавычках, wildcard, AST, --exact и --newest сохраняют строгую семантику. Режим не совмещается с legacy, регулярными выражениями или --backend server. Поиск разговоров по смыслу остаётся отдельным поиском по темам.

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

Весь поиск — в одной группе команд, max personal search. Если не знаете, где было написано, начните с search all.

Задача Команда
Искать сразу в сообщениях, почте и заметках max personal search all '<запрос>'
Искать только сообщения мессенджеров, без --discover, в одном чате — и на сервере MAX max personal search messages '<запрос>'
Искать только почту, которую импортировал memo max personal search mail '<запрос>'
Искать заметки из memo или из папки max personal search notes '<запрос>'
Найти обсуждение по тому, о чём оно было max personal search conversations '<вопрос>' (поиск по темам)
Посчитать совпадения по чатам, людям, дням или часам max personal stats messages show '<запрос>'
Сохранить поиск и запускать его снова max personal searches create, max personal search messages --saved <имя>
max personal search all 'договор аренды'                 # сообщения, почта и заметки, лучшее первым
max personal search all 'договор' --only messages,notes  # без почты
max personal search messages 'договор chat:Друзья'     # только сообщения мессенджеров, без почты
max personal search mail 'счёт'                          # только почта, которую привёл memo sync --mail
max personal search notes 'бюджет' --type internal       # только заметки, написанные в memo
max personal search conversations 'переезд на дачу'      # разговоры, близкие по смыслу

search all у каждой находки пишет, что это — сообщение (msg:…) или заметка (note:…). search messages никогда не возвращает почту, а search mail — сообщения мессенджеров; вместе их ищет только search all. В search messages NOT has:attachment, has:voice и has:file в запросе оставляют только текст, голосовые или файлы; --type у search notes — заметки из memo или из папки (internal|file). У почты chat: выбирает цепочку писем, а from: — отправителя. Если поле не подходит — kind:/topic: для почты или chat:/from: для заметок — search all пропускает этот источник и объясняет почему.

Почта и заметки попадают в архив через memo: memo sync --mail и memo import. Без них search all ищет только сообщения.

Дальше на этой странице — поиск сообщений, max personal search messages. Без --discover поиск в одном чате спрашивает ещё и сервер MAX (ниже).

Попробуйте поиск в одном чате

Начните с фразы и одного чата. В примере поиск читает сохранённую историю, не обращаясь к мессенджеру.

Ваш запрос:

Найди сообщение «счёт оплачен» в чате Книжный клуб. Покажи совпадение и пробелы в истории.

Команда:

max personal search messages '"счёт оплачен" chat:"Книжный клуб"' --backend archive --json

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

Найдено одно сообщение в сохранённой истории.

Участник Сообщение
Алиса Тестова Счёт оплачен вчера.

История неполная: другие совпадения могут отсутствовать. Могу открыть это сообщение и переписку вокруг него.

Пустой результат не доказывает, что сообщения никогда не было. Проверьте пробелы в истории, прежде чем расширять поиск. Все примеры на странице вымышлены.

Сначала подготовьте архив

Хороший поиск возможен, только когда чаты скачаны. Сервер MAX ищет лишь в одном названном чате, а всё остальное читает только архив: поиск по всем чатам, подсчёт stats, поиск по темам, has:, filename:, regex, presets, метки и формы слов. Начните со скачивания всех чатов:

max personal messages sync --all --background     # последние 90 дней каждого чата, в фоне
max personal store jobs show                    # сколько уже скачано

Один запуск скачивает не больше 1200 сообщений на чат по умолчанию; повторите команду, чтобы продолжить. --since-time 365d — дальше в прошлое; один чат — max personal messages sync Друзья (скачать историю чата). Дальше архив держит свежим max personal serve.

Каждый поиск говорит, что он просмотрел. Если архив мог бы держать больше или ничего не нашлось, в терминале одна строка: сколько сообщений и чатов просмотрено, сколько чатов не скачано или отстаёт, и команда, которая это исправит:

searched 12,430 messages in 37 chats — 5 never fetched; `max personal messages sync --all --background` fetches them

С --json то же — запись coverage в missing и шаг messages.sync в next. Если ничего не нашлось, а next задан, выполните эту команду (или попросите агента), прежде чем решать, что сообщения нет.

Запрос пишите в одинарных кавычках, чтобы оболочка не трогала кавычки и скобки внутри. Имена в примерах замените своими чатами и людьми.

Слова и фразы

max personal search messages счёт
max personal search messages '"счёт оплачен"'             # слова подряд
max personal search messages 'кафе OR библиотека'
max personal search messages '(кафе OR библиотека) NOT шумно'
max personal search messages 'квартир*'                   # все слова, которые начинаются на «квартир»

Слова рядом должны быть в сообщении все. Поиск находит формы слов: квартира найдёт «квартиру». Кавычки сохраняют порядок слов, но тоже допускают другие формы. Для точной формы используйте exact:квартира или добавьте --exact для слов без указанного поля. Явное text: по-прежнему ищет формы. Регистр, ударения, ё и е не различаются. Опечатки автоматически не исправляются. Формы определяются настройками языка архива.

Люди и чаты

max personal search messages 'from:"Алиса Тестова" счёт'
max personal search messages 'from:("Алиса Тестова" OR "Борис Тестов") библиотека'
max personal search messages 'from:me date:7d'            # что вы писали за неделю
max personal search messages 'chat:"Книжный клуб" библиотека'
max personal search messages 'паспорт kind:private'       # только личные переписки

kind: принимает private (личные), group, channel, saved (Избранное) и bot. Искать во всех аккаунтах архива — --source all.

Даты

max personal search messages 'date:today'
max personal search messages 'библиотека date:yesterday'
max personal search messages 'счёт date:7d'               # от 7 дней назад до сейчас; также 30m, 2h
max personal search messages 'счёт date:[2026-01-01 TO 2026-02-01}' --timezone Europe/Madrid

today, yesterday и календарные даты — это дни в часовом поясе компьютера; --timezone выбирает другой. В диапазоне [ и ] включают этот день, { и } исключают.

Файлы и ссылки

max personal search messages 'has:file'
max personal search messages 'filename:*.pdf'
max personal search messages 'filename:*договор*'         # часть имени
max personal search messages 'size>10MB'
max personal search messages 'size:[1KB TO 300KB]'
max personal search messages 'has:photo chat:"Книжный клуб"'
max personal search messages 'has:link AND "github.com"'  # ссылка на сайт

Файл находится по имени и размеру, даже если в сообщении нет текста. filename: сравнивает имя целиком, без учёта регистра, ударений и ё. Размеры — в KB, MB и GB по 1024. MAX не сообщает тип файла, поэтому ищите по расширению: filename:*.pdf, а не mime:. has: принимает ещё attachment, video, audio, voice, sticker, contact, location и poll. Ссылка считается, если она в тексте или только в карточке ссылки.

Текст внутри файлов

content: ищет текст внутри вложений: PDF, документа Word, скана. Сначала текст нужно извлечь в архив — это делает max или ваш агент. Подробнее о файлах — вложения.

max personal attachments extract --chat "Книжный клуб" --download --output-dir ./files
max personal search messages 'content:договор'
max personal attachments list 'chat:"Книжный клуб" is:needs_text'
max personal attachments text set "Книжный клуб" 204 --text-file ./scan.txt

attachments extract читает на этом компьютере обычные текстовые файлы, DOCX и PDF с текстовым слоем. --download требует --output-dir; без них извлечение читает уже скачанные файлы. Если в сообщении несколько вложений, укажите одно через --attachment, начиная с 1.

Локальное извлечение читает также UTF-16 с BOM, уверенно определённые старые кодировки, ODT, ODS, XLSX, PPTX и EPUB — без модели и без дополнительной установки. Порядок листов, слайдов и глав сохраняется, как и сохранённые значения ячеек; формулы не вычисляются, текст внутри картинок не читается. Неоднозначную кодировку должен проверить или перевести ваш агент. Исходные файлы не меняются. Для DOCX, ODT, ODS, XLSX, PPTX и EPUB предел — 1000 частей архива и 50 МиБ в распакованном виде, не больше 10 МиБ на одну текстовую часть XML/HTML; испорченный или неполный результат не индексируется как полный текст. Неудачное локальное чтение можно повторить; текст агента и прежний хороший индекс защищены.

Для PDF нужен необязательный пакет unpdf, для DOCX — mammoth, установленный там же, где max. При глобальной установке npm: npm install -g unpdf mammoth. Если пакета нет, команда сообщает об этом; текст может записать агент.

Фото и сканы текстового слоя не имеют. Агент по умолчанию читает их своими средствами OCR или зрения и записывает текст через attachments text set. attachments list --needs-text даёт ему сохранённый путь, ссылку на сообщение и номер вложения; команда показывает пути и состояние текста, но не сам текст. Проверьте запись поиском content:. Если агент работает на другом компьютере, путь на MCP-сервере не передаёт ему файл: для чтения нужен доступ к файлу. Такой агент может получить байты сохранённого файла частями и проверить их хеш через attachments show; сама передача текст не распознаёт и не индексирует, поэтому текст всё равно записывается через attachments text set.

Много сканов сразу можно передать выбранному вами сервису моделей. Укажите провайдера и модель со зрением в models.ocr; ключ хранится обычной командой models text key set. В примере замените your-vision-model именем своей модели.

max personal config set models.ocr.provider openai
max personal config set models.ocr.model your-vision-model
max personal models text key set openai
max personal attachments extract --chat "Книжный клуб" --ocr --concurrency 4 --limit 100 --json

--ocr передаёт изображения выбранному сервису; без него модель не вызывается. Одновременно — от 1 до 8 запросов, по умолчанию 4. Лимит файлов — 1–500, по умолчанию 100; cursor из ответа продолжает ограниченный обход. Сканы PDF требуют необязательных unpdf и @napi-rs/canvas; за один документ обрабатывается не больше 20 страниц. Страницы с текстовым слоем остаются локальными. Повтор использует хеш файла и выбранную модель. Текст агента и прежний индекс сохраняются при ошибке или отмене OCR. Проверьте failed и статусы отдельных файлов; после ограничения провайдера новые запросы этого запуска прекращаются. --offline с --ocr несовместим.

Файлы, которые у вас уже есть. max personal attachments extract --chat <чат> --from-dir ./files читает одну папку, без вложенных папок. Нужен однозначно совпадающий исходный файл или полный набор файлов с именами загрузчика. Не сочетайте --from-dir с --download или --output-dir. max personal messages download <чат> <id> --extract извлекает текст только из файлов, скачанных этим запуском; --all --extract делает то же для всего запуска. Изменившиеся файлы видны по хешу, а текст, записанный агентом, сохраняется. Через MCP ограниченное извлечение возвращает cursor для продолжения и сведения о файлах, без их текста.

Из --from-dir нельзя читать известные файлы и папки с учётными данными, собственные папки CLI и хранилище сообщений; обычные скрытые рабочие папки разрешены. При загрузке через MCP output_dir также должен быть вне защищённых мест. У чтения текста PDF нет отдельного предела страниц или 30-секундного срока; действуют отмена команды и ограничения размера файла и текста.

Пароли, коды и карты

max personal search messages 'preset:secret kind:saved'   # что-то похожее на пароль или токен в Избранном
max personal search messages 'preset:card'

Preset находит сообщения, которые похожи на пароль, код входа, ключ API, номер карты или IBAN, паспорт, телефон, email или ссылку. Проверяется только вид: это не доказывает, что пароль работает или карта настоящая. Полный список — в языке запросов.

Метки

max personal tags add work --chat "Книжный клуб"
max personal tags add work --contact "Борис Тестов"
max personal tags list tag:work type:chat
max personal search messages 'tag:work счёт'
max personal search messages 'счёт NOT tag:work'
max personal tags remove work --chat "Книжный клуб"

Метка — ваша собственная пометка на чате, человеке или одном сообщении (--message <id> --chat <чат>). Она хранится только в локальном архиве и в MAX не отправляется. tag:work находит сообщения с меткой work, сообщения в чате с этой меткой и сообщения от человека с этой меткой. Метка — 1–32 символа: латинские буквы a–z, цифры и дефис.

Метки групп и каналов можно получить автоматически — по названию, имени и описанию, без сообщений и без модели:

max personal metadata refresh --chat "Книжный клуб"   # прочитать описание чата из MAX (сам чат не меняется)
max personal metadata refresh --only-missing          # все сохранённые группы и каналы, у которых описание ещё не читалось
max personal tags auto --dry-run                      # что получилось бы, без записи
max personal tags auto                                # записать автоматические метки
max personal tags list sources:auto                  # только автоматические

Автоматическая метка не трогает ваши: повторный запуск убирает только устаревшие автоматические. Если вы сами поставите метку, которую уже дала автоматика, она станет вашей.

max personal tags auto обрабатывает до 50 чатов за запуск; --limit поднимает предел до 500, а --chat выбирает чаты (его можно повторить). --dry-run берёт сохранённые описания. Чтобы перед разметкой прочитать свежие, добавьте --refresh-metadata без --dry-run. Сохранённое описание показывает max personal metadata get --chat <чат>.

Сохранённые поиски и история

max personal searches create meetings 'библиотека OR кафе' --chat "Книжный клуб"
max personal search messages --saved meetings
max personal search messages --saved meetings 'date:today'   # слова добавляются через AND
max personal stats messages show --saved meetings --by day
max personal searches list
max personal searches history --limit 10
max personal search messages --saved 42                   # строка истории, по её номеру

searches create сохраняет запрос с опциями и ничего не запускает; занятое имя — только с --replace. Опции, набранные вместе с --saved, заменяют сохранённые. Сохранённый текст разбирается заново при каждом запуске, поэтому date:7d всегда значит последние 7 дней. searches show печатает один поиск, searches delete удаляет.

Каждый успешный поиск и подсчёт попадает в историю: запрос и опции, но не найденные сообщения. Хранятся последние 1000 запусков. --no-record не записывает один запуск, в MCP — record: false; searches clear очищает историю, сохранённые поиски остаются. Эта история отдельна от записей max personal runs.

Сохранённые поиски и история лежат в архиве, общем для max и tg: обе программы видят одни и те же, и delete или clear в одной меняет их и в другой. Метки остаются при своём аккаунте.

Подсчёт: stats messages show

max personal stats messages show счёт                          # сколько в каждом чате
max personal stats messages show 'date:7d' --by sender
max personal stats messages show 'from:me' --by day --timezone Europe/Madrid
max personal stats messages show --by hour                     # все сохранённые сообщения

stats messages show считает сообщения, которые нашёл бы search messages с тем же запросом, каждое один раз. --by chat (по умолчанию) и --by sender — больше всего сверху; --by day и --by hour — по порядку. Если часть чатов сохранена не целиком, числа — нижняя граница, и stderr говорит, сколько таких чатов.

Поиск на сервере MAX: --backend

Когда в запросе есть слова и не задан --discover, max по умолчанию спрашивает и сервер, и архив (--backend both). --discover всегда читает только архив, в том числе с --backend both.

С чатом (chat: в запросе) сервер ищет в этом чате. Без чата сервер ищет во всех чатах так же, как строка поиска на web.max.ru: одним запросом, и из каждого чата возвращает одно сообщение — лучшее совпадение. Остальные совпадения в этих чатах находит архив, если они в нём есть. Название чата и публичные каналы в ответ не попадают.

max personal search messages 'счёт chat:"Книжный клуб"'                    # архив и сервер MAX, один чат
max personal search messages 'счёт'                                          # архив и сервер MAX, все чаты
max personal search messages 'счёт chat:"Книжный клуб"' --backend server   # только то, что нашёл сервер
max personal search messages 'счёт' --backend archive                        # только архив

Сервер находит слово и по началу, но не другие его формы: книгу не найдёт «книга». Поэтому max берёт его ответ как кандидатов: сохраняет их в архив и проверяет вашим запросом по правилам архива. exact:, -слово, кавычки и порядок результатов значат то же, что и без сервера, а сообщение не повторяется. max ждёт сервер не дольше 5 секунд (--server-time, до 60 с) и ничего не помечает прочитанным.

С --json у каждого сообщения есть found_in (archive, server или both). При поиске в обоих источниках недоступный сервер или профиль только для чтения оставляют ответ из архива. Явный --backend server отказывает, если профиль не разрешает серверный поиск. Разрешение — messages.server-search.

Сначала скачать новое: --sync-first

max personal search messages 'счёт chat:"Книжный клуб"' --sync-first

--sync-first сначала скачивает новые сообщения, ничего не помечая прочитанным: не больше 5 чатов, 500 сообщений и 30 секунд. Пределы меняют --max-chats, --max-messages, --sync-time. Если скачивание не удалось или кончилось раньше, вы всё равно получаете результат из архива — с отметкой об устаревшем покрытии и сведениями о скачивании.

Сообщения вокруг находки

--newest упорядочивает по времени, а не по близости, а --context 2 показывает по два сообщения до и после каждого найденного (по умолчанию 2 в терминале и 0 в остальных режимах).

--thread показывает вокруг каждой находки цепочку ответов и ответы на неё вместо соседей по времени. Он идёт по связям ответов, сохранённым в архиве, а у messages context тоже заменяет соседей по времени. Пределы: 8 переходов, 50 сообщений, 65 536 байт и сутки по обе стороны. Их меняют --thread-hops, --thread-messages, --thread-bytes, --thread-within. Если связей нет, используется контекст по времени; устаревшие связи помечаются и не обходятся. messages context с --offline читает только сохранённое.

Результат в JSON

В терминале max печатает ленту для чтения. --json возвращает один объект с сообщениями и тем, где искали; --jsonl — только сообщения, построчно. Поля ответа — в справке по языку запросов.

Если ничего не нашлось

Пустой ответ значит «нет в архиве, где искали», а не «никогда не отправлялось». Что сохранено, покажет max personal store status, дополнить — max personal messages sync. С --json ответ говорит, какие чаты просмотрены и насколько они полны, даже без совпадений. Если max просит max personal store migrate, индекс слов ещё строится; поиск без слов (has:file, date:today) работает уже сейчас.

Пробелы в истории чата. max personal store gaps plan <чат> на этом компьютере показывает разрывы между сохранёнными кусками истории. Пропуски номеров сообщений и тишина сами по себе не означают потерянную историю; края сохранённой истории остаются unknown. Проверьте план, затем max personal store gaps repair <чат> --fingerprint <хеш> скачает разрывы. По умолчанию — до 5 разрывов, 500 сообщений и 30 секунд; пределы задают --max-gaps, --limit, --repair-time, --page-size и --pause. Повторный запуск проверяет оставшиеся разрывы и не удаляет сообщение только потому, что MAX его не вернул. Неоднозначные страницы с одинаковым временем остаются незавершёнными. --background запускает задание, за которым следят store jobs show, store jobs list и store jobs cancel. Для ремонта нужны разрешение store.gaps.repair и чтение сообщений; план к серверу не подключается. Через MCP эти команды находятся через max_tools_search, план и задания читаются через max_read, ремонт — через max_write.

Подготовить поиск по темам при скачивании. max personal messages sync <чат> --catch-up сразу после загрузки строит разговоры и локальные векторы только этого чата — для поиска по темам. По умолчанию это выключено; настройка профиля search_catch_up: true включает, а --no-catch-up отменяет на один запуск. Границы: --catch-up-chunks 500 --catch-up-messages 10000 --catch-up-time 30s. Модель автоматически не скачивается, удалённый сервис не вызывается. Поле prepared отдельно сообщает, завершилась ли подготовка; скачанная история сохраняется в любом случае.

Дальше

  • Поиск по темам — найти обсуждение по тому, о чём оно было, когда слов не помните.
  • Язык запросов — каждое поле, оператор, предел и ответ в JSON.
  • Как устроен поиск — техническая страница: индекс слов, граф разговоров, векторы и порядок результатов.

Clone this wiki locally