Skip to main content
Glama

WeChat Archive for DeepSeek Harness

English | 简体中文

Локально-ориентированный плагин архивации WeChat для macOS с принципом fail-closed. Он подключает четыре ограниченные операции к DeepSeek Harness — диагностику, проверку состояния, синхронизацию и верификацию — и включает Agent Skill, а также опциональный macOS LaunchAgent для запусков без участия человека.

Версия 0.1.0 может сканировать все таблицы Msg_* во всех обнаруженных сегментах message_N.db из непротиворечивого снапшота базы данных Mac WeChat с контрольной точкой. Она хранит воспроизводимые, проверяемые JSONL-дельты и сохраняет локально доступные контейнеры изображений, MP4-файлы и голосовые BLOB-объекты как приватные объекты с адресацией по содержимому.

Статус релиза: реализация и синтетические тесты безопасности завершены, но реальная синхронизация чатов не выполнялась (NOT_RUN) при подготовке этого релиза. Синхронизация остаётся отключённой по умолчанию, и ни один LaunchAgent не устанавливается автоматически.

Mac WeChat source
       |
       v
deterministic Python core ----> private state + JSONL deltas + media objects
       |                                      |
       +---- stdio MCP ---- DeepSeek Harness  +---- replay/hash verification
       |
       +---- one-shot scheduler ---- optional macOS LaunchAgent

Что предоставляется

Интерфейс

Операция

Записывает архивные данные?

MCP

wechat_doctor

Нет — проверяет приложение, источник, WAL, секрет и права доступа

MCP

wechat_status

Нет — сообщает ограниченные операционные метаданные

MCP

wechat_sync

Да — требует и явного согласия на сервере, и confirm=true

MCP

wechat_verify

Нет — воспроизводит историю сообщений и проверяет хэши и покрытие

Agent Skill

wechat-archive

Проводит модель через обязательный рабочий процесс безопасности

Планировщик

sync, а затем verify

Только после того, как человек установит LaunchAgent

Результаты MCP предоставляют информацию о статусе, количестве, покрытии и целостности. Они не раскрывают имена контактов, идентификаторы учётных записей, содержимое сообщений, секреты или приватные пути к базам данных.

Related MCP server: message-container

Границы целостности и конфиденциальности

  • Аргументы инструментов не могут выбрать учётную запись, путь в файловой системе, SQL-запрос, исполняемый файл или секрет.

  • Плагин никогда не перехватывает ключ, не подключается к LLDB, не переподписывает и не заменяет WeChat, не завершает приложение и не игнорирует WAL.

  • Синхронизация завершается ошибкой и не публикует новый снимок, если WeChat запущен, WAL содержит транзакционные кадры или имеет повреждённый короткий заголовок, приложение не имеет закреплённой официальной подписи, секрет недействителен или источник изменяется во время сбора данных.

  • Для каждой зашифрованной базы данных ключ выводится независимо, и она проверяется через HMAC. Расшифрованные промежуточные файлы являются приватными, проверяются с помощью SQLite quick_check и удаляются после завершения работы.

  • Неизменяемые JSONL-дельты сбрасываются на диск (fsync) до фиксации транзакции индекса. Верификация воспроизводит полную историю и хэширует каждый зарегистрированный медиа-объект, включая исторические.

  • Секреты должны храниться в связке ключей macOS (Keychain). Им не место в параметрах инструментов, аргументах команд, переменных окружения, журналах, конфигурации в Git или файлах релиза.

Что означает SOURCE_FAITHFUL_V1

Изображения всегда сохраняют свои сырые байты .dat. Вариант декодированного изображения записывается только тогда, когда его подтверждает надёжная сигнатура файла или одно однозначное однобайтовое XOR-преобразование. Видео должны содержать сигнатуру MP4 ftyp. Голосовые BLOB-объекты сохраняются без заявлений о совместимости с транскрипцией или воспроизведением.

Извлечение эмодзи, обычные вложения, медиа, не загруженные на этот Mac, и некоторые приватные контейнеры остаются нерешёнными. Поэтому публичный результат намеренно содержит media_complete=false. SOURCE_FAITHFUL_V1 означает, что локально доступные исходные байты были сохранены и проверены; это не означает полностью декодированный или воспроизводимый мультимодальный экспорт.

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

Требования

  • macOS

  • Python 3.10 или новее

  • Node.js 24 или новее

  • pnpm 11

  • uv

  • libzstd для декодирования полезной нагрузки сообщений, сжатой zstd; без него исходные сжатые байты сохраняются в формате base64

  • Официальная установка WeChat и доступ к вашим собственным локальным данным учётной записи

Используйте этот проект только с данными, которые вы уполномочены архивировать. Архив чатов содержит личную информацию других людей, даже если он относится к вашей собственной учётной записи; храните архив локально, с контролем доступа и вне Git.

Установка ядра и MCP-сервера

Из рабочей копии этого репозитория:

cd /path/to/wechat-archive
PROJECT_DIR="$(pwd -P)"
CONFIG_PATH="${HOME}/Library/Application Support/WeChatArchive/config.json"

uv venv
uv pip install -e '.[test]'
pnpm --dir mcp-server install --frozen-lockfile

mkdir -p "$(dirname "$CONFIG_PATH")"
chmod 700 "$(dirname "$CONFIG_PATH")"
cp config.example.json "$CONFIG_PATH"
chmod 600 "$CONFIG_PATH"

Отредактируйте приватную конфигурацию, используя config.example.json в качестве схемы. Оба пути source.root и archive.root должны быть абсолютными, каноническими и раздельными. Корень архива не должен находиться внутри дерева исходников. В производственной конфигурации следует использовать провайдера Keychain. Провайдер file существует только для миграции из существующего обычного файла, принадлежащего пользователю, с режимом 0600; символические ссылки отклоняются.

Получение ключа и восстановление приложения намеренно находятся вне этого плагина. Следуйте контролируемой границе, описанной в docs/BOOTSTRAP.md, а не помещайте ключ в историю оболочки и не просите агента модифицировать WeChat.

Сначала запустите предварительную проверку только для чтения:

.venv/bin/wechat-archive --config "$CONFIG_PATH" doctor

Команда записывает в stdout ровно один JSON-объект wechat-archive.command/v1. Только READY разрешает отдельно подтверждённую синхронизацию. См. Архитектура и целостность для описания модели состояний.

Установка в DeepSeek Harness

Инсталлятор работает в режиме пробного запуска (dry-run), если не указан --install:

python3 scripts/install_dsh.py
python3 scripts/install_dsh.py --install

Он управляет только одним помеченным блоком в профиле Harness и одной символической ссылкой ~/.dsh/skills/wechat-archive на эту рабочую копию. Он не изменяет исходный checkout DeepSeek Harness и не перезаписывает посторонний Skill. Перед изменением текущего профиля он создаёт одну резервную копию с режимом 0600.

Harness предоставляет следующие имена:

  • mcp__wechat__wechat_doctor

  • mcp__wechat__wechat_status

  • mcp__wechat__wechat_sync

  • mcp__wechat__wechat_verify

Включённая безопасная накладка задаёт WECHAT_ARCHIVE_ALLOW_SYNC=0. Поэтому установка включает диагностику только для чтения и проверку состояния, но не синхронизацию. После прохождения всех проверок на реальной машине оператор должен явно установить согласие сервера в 1, перезапустить процесс MCP и по-прежнему вызывать wechat_sync с confirm=true.

Удаление также по умолчанию выполняется в режиме пробного запуска:

python3 scripts/uninstall_dsh.py
python3 scripts/uninstall_dsh.py --uninstall

Необязательная периодичесая синхронизация

Планируемый сбор данных вызывает детерминированное ядро напрямую; он не полагается на вкладку браузера, языковую модelь или заущенный разговор в Harness. Следующие команды только отображают и проверяют ежедневный LaunchAgent на 03:15. Они не устанавливают его:

REVIEW_DIR="${TMPDIR:-/tmp}/wechat-archive-review"
REVIEW_PLIST="${REVIEW_DIR}/local.wechat-archive.sync.plist"
mkdir -p "$REVIEW_DIR"

python3 scripts/render_launchagent.py \
  --project-root "$PROJECT_DIR" \
  --python "$PROJECT_DIR/.venv/bin/python" \
  --config "$CONFIG_PATH" \
  --hour 3 --minute 15 \
  --sync-timeout-seconds 1800 \
  --verify-timeout-seconds 7200 \
  --output "$REVIEW_PLIST"
plutil -lint "$REVIEW_PLIST"
python3 scripts/install_launchagent.py --plist "$REVIEW_PLIST"

Последняя команда по-прежнему является пробным запуском. Только следующее явное действие устанавливает и инициализирует задание:

python3 scripts/install_launchagent.py --plist "$REVIEW_PLIST" --install

Не устанавливайте его, пока doctor не сообщит READY и пока подтверждённая вручную последовательность sync, за которой следует verify, не выполнится успешно. Каждый запланированный запуск сначала выполняет синхронизацию, а затем полную верификацию. Если WeChat активен или WAL не пуст, запуск безопасно завершается и может повториться в следующее запланированное время.

Синхронизация и полная верификация имеют отдельные ограниченные тайм-ауты: по умолчанию 30 минут и два часа, настраиваемые до восьми часов. Полная верификация читает все исторические медиа-объекты, поэтому выбирайте её тайм-аут исходя из размера архива.

Верификация и проверки релиза

Все тесты репозитория используют синтетические тестовые данные. Не заменяйте их реальными данными чатов.

.venv/bin/python -m pytest -q
pnpm --dir mcp-server test
python3 scripts/check_manifest.py --scan-content
python3 scripts/build_release.py \
  --output "${TMPDIR:-/tmp}/wechat-archive-0.1.0.tar.gz"

Успешное завершение процесса не является достаточным доказательством реального архива. Условие приёмки — SYNCED или NO_CHANGE, непосредственно за которым следует VERIFIED, при ожидаемом покрытии источника. См. полный список критериев приёмки.

Лицензия и сторонние материалы

Код проекта выпущен под лицензией MIT. Проверенные или указанные апстрим-проекты и их лицензии перечислены в THIRD_PARTY_NOTICES.md. Реальные чаты, базы данных, ключи, медиа, журналы, локальная конфигурация и исторические архивы передачи никогда не являются частью релиза.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude to access and search local messages and contacts across multiple platforms (iMessage, Discord, Gmail, Slack) via a local-first datastore, ensuring data never leaves the Mac.
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI clients to read and search macOS Messages history through a read-only MCP interface.
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to search and retrieve from your local macOS iMessage history using hybrid retrieval with context expansion, all processed locally without sending data off-device.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents on macOS to securely read and search the local Messages database, catch up on missed messages via a persistent inbox, and send texts or files to allowlisted chats, with optional voice note transcription and text-to-speech.
    10
    9 npm
    MIT