NotariumДокументация
Версия документации: latest
RU

Импорт

Импорт затаскивает существующую базу знаний в пространство (space) одним аплоадом: выгрузки claude.ai и ChatGPT, MCP memory-server, проекты и память Claude, а также обычные Markdown- и текстовые файлы. Формат распознаётся по содержимому, а не по имени файла, так что вам не нужно ничего готовить вручную — движок сам разберёт архив и разложит его по папкам.

Импорт — зеркало экспорта: экспорт читает файлы-истину с диска, импорт парсит источник и пишет заметки обычным путём записи. Каждая заметка попадает в пространство ровно так же, как если бы её создал человек в редакторе, — с версионированием, провенансом и индексацией.

Какие форматы понимает

Один архив Claude или ChatGPT обычно содержит несколько видов данных сразу; импорт распознаёт и переносит всё, что умеет:

ИсточникФайл в выгрузкеЧто становится заметкой
Беседы Claudeconversations.jsonОдна заметка на разговор, сообщения как ### Human/Assistant
Беседы ChatGPTconversations.json (в т.ч. шардированный conversations-000.json…)Одна заметка на разговор, транскрипт по времени
MCP-памятьmemory.json (JSONL)Заметка на сущность; связи → [[wikilinks]]
Проекты Claudeprojects.json или projects/<uuid>.jsonПапка проекта: документы + инструкции
Память Claudememories.jsonЗаметка на каждый блок памяти аккаунта
Дизайн-чаты Claudedesign_chats/<uuid>.jsonОдна заметка на чат
Markdown / текст.md, .txtОдна заметка, тело файла = тело заметки

Формат определяется анализом содержимого (все сервисы шлют файл с именем conversations.json, поэтому имя ненадёжно). Пустые сообщения и разговоры без единого содержательного фрагмента не создают «сиротских» заметок — число пропущенных видно в сводке импорта. Если внутри архива попался нераспознанный JSON, он тоже попадает в сводку как unsupported — потеря данных всегда видна в сводке, а не происходит незаметно.

Как импортировать

Импорт живёт на вкладке Import в настройках пространства (/s/<space>/management/import). Каждая опция — отдельная секция:

  • Файл — выберите файл выгрузки (conversations.json, ZIP-выгрузку целиком или memory.json). Отдельный .md/.txt импортируется перетаскиванием (см. ниже), а не через этот диалог.
  • Skip existing notes — что делать при повторном импорте (см. ниже).
  • Memory entries — куда класть сущности памяти (см. ниже).

Долгий импорт идёт устойчивой задачей (durable job): прогресс-бар с живым счётчиком записанных заметок, фаза и кнопка Cancel. Можно уйти со вкладки и вернуться — импорт продолжит идти в фоне, а по возвращении вы снова увидите прогресс или итоговую сводку.

Перетащите файл в окно

Отдельный аплоад-диалог не обязателен: перетащите .md- или .txt-файл прямо в окно приложения — он станет заметкой. Дроп на папку в дереве кладёт заметку в неё, дроп в область содержимого — в папку открытой заметки или в корень. Это тот же пайплайн импорта, просто второй вход в него.

Опция «Skip existing notes»

Имя файла заметки детерминировано и завязано на идентичность источника. Благодаря этому повторный импорт того же экспорта перезаписывает те же файлы, а не плодит дубли, — и полсотни разговоров «Untitled» не сталкиваются друг с другом.

  • Выключено (по умолчанию для повторной заливки — upsert) — существующие заметки перезаписываются по пути, идемпотентно.
  • Включено — заметки, чей путь уже существует, пропускаются. Это кейс «дозалил обновлённую историю — не перезатирай уже поправленное вручную».

Опция «Memory entries»

Сущности из memory.json можно направить в одно из трёх мест:

  • folder — видимые пользовательские заметки под корневой папкой импорта.
  • space — в скрытый mount памяти агента пространства (.notarium/memory): такие записи не показываются в дереве, ленте и поиске, но доступны агенту через recall.
  • skip — не импортировать память вовсе.
Память пространства, не глобальный домен

Вариант space кладёт записи в память агента конкретного пространства. Отдельного UI-браузера этой памяти внутри пространства нет — она видна агенту через recall. Это память конкретного пространства, а не глобальный персональный домен памяти (тот открывается линзой Memory в дереве-проводнике) — в него этот импорт не пишет.

Как раскладываются данные

Импорт создаёт предсказуемое дерево папок внутри выбранного корня:

conversations/claude/     — беседы Claude
conversations/chatgpt/    — беседы ChatGPT
projects/<проект>/        — проекты Claude (+ docs/, prompt-template.md)
memory/claude/            — память аккаунта Claude
memory/<тип-сущности>/    — сущности из memory.json
design-chats/<проект>/    — дизайн-чаты Claude

Даты сохраняются как данные

Наивный импорт датировал бы всю историю «сегодня», и лента свалила бы сотни бесед в одну кучу. Notarium вместо этого протягивает дату создания как данные: у каждой заметки во frontmatter пишется created: со временем, когда разговор реально произошёл. Лента раскладывает импортированную историю по настоящим дням, а связка «экспорт → импорт» сохраняет даты — перенос идёт без потерь.

Поле «Created» можно и поправить вручную из редактора (метаданные заметки) — например, при миграции или корректировке историчности. Время последнего изменения (modified) при этом остаётся реальным временем правки файла и не редактируется.

Как это работает под капотом

Импорт устроен так, чтобы выдержать и гигабайтные архивы, и обрыв связи:

  • Потоковая обработка. Аплоад стримится на диск, ZIP распаковывается по одному члену, JSON-массив бесед парсится поэлементно — один разговор за раз. Пиковая память не зависит от размера архива, поэтому 600-МБ выгрузка не роняет сервер.
  • Устойчивая задача. Когда у хоста есть служебная БД (норма для self-host), импорт по умолчанию — устойчивая задача: аплоад сохраняется в staging, а фоновый воркер пишет заметки вне запроса. Закрытая вкладка, потерянное соединение и даже рестарт сервера не теряют прогресс.
  • Кооперативность. Массовый импорт не монополизирует сервер: запись уступает интерактивным запросам, фоновая индексация приостанавливается на время потока и догоняет после. Поиск и навигация остаются отзывчивыми даже во время заливки тысяч заметок.
flowchart LR
  src([Архив / файл]) -->|аплоад| stage[Staging на диске]
  stage -->|задача import| worker[Фоновый воркер]
  worker -->|write-path| notes[(Markdown-заметки)]
  worker -.->|прогресс| ui([Вкладка Import])
Импорт без служебной БД

На хосте без служебной БД (а она отсутствует только в режиме AUTH_MODE=none) слоя задач нет: импорт идёт синхронным потоковым путём в рамках одного запроса, с тем же ядром и живым счётчиком. Прогресс и сводка выглядят так же; отличается лишь то, что импорт не переживёт рестарт сервера.

Границы

  • Отмена, но не пауза. Задачу можно отменить (кооперативно), но не поставить на паузу и возобновить.
  • Индикатор — indeterminate. Число заметок в архиве заранее неизвестно, поэтому прогресс показывает фазу и живой счётчик записанных заметок, а не проценты и ETA.
  • Прерванный аплоад начинается заново. Устойчивость включается после того, как байты доехали: если заливка большого архива оборвалась, она начинается заново.
  • Бинарные вложения не импортируются. Текст из вложений встраивается в тело заметки, а сами бинарные файлы — нет (так же, как в экспорте).
  • Импорт ложится в корень пространства. В диалоге импорта целевая папка не выбирается — заметки попадают в корень; при перетаскивании корень определяется зоной дропа.

Дальше

  • Экспорт — забрать пространство или папку обратно архивом Markdown.
  • Агенты и MCP — как агент работает с импортированной памятью через recall.