← Все посты

Drafta 1.5: Mermaid на Pele и синхронизация без кнопки

Drafta 1.5 рисует диаграммы Mermaid одним рендерером Pele и сама подхватывает изменения с сервера за секунды — без кнопки «Синхронизировать».

В Drafta 1.5 две темы, и обе — про ожидание. Диаграммы Mermaid теперь рисует один рендерер вместо двух библиотек, а библиотека заметок перестала требовать кнопку «Синхронизировать», чтобы увидеть правку, сделанную в другом месте. По отдельности это детали, вместе — приложение перестало заставлять ждать.

Рендер диаграмм попал в 1.5.0, синхронизация — в 1.5.1; 1.5.0 публично не выходил, так что в 1.5.1 обе правки приезжают сразу.

Диаграммы: было две библиотеки, стала одна

Прежний рендер был собран из двух библиотек: mermaid рисовала большинство типов диаграмм, beautiful-mermaid — оставшиеся. Две библиотеки тянули за собой два парсера и два набора стилей, и это было заметно:

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

В 1.5 оба пакета заменены одним — pele. Он один рисует все типы диаграмм, которые понимает синтаксис Mermaid, и берёт цвета из активной темы: при смене темы схема перерисовывается в новых цветах, включая цвета серий на графиках. Чанк самого рендерера в бандле занимает около 150 строк адаптера вместо трёх с половиной тысяч строк прежнего чанка mermaid, бандл стал примерно на 4,4 МБ меньше, а диаграмма появляется в разы быстрее при первом показе.

Заодно исправили ошибки: текст диаграммы, который Mermaid не может разобрать, теперь показывается в блоке ошибки самой диаграммы — для всех типов, а не только для тех, которыми занималась вторая библиотека.

Для вас это значит ровно одно: вставляете блок ```mermaid, и он рисуется быстро, в цветах вашей темы, в превью и в живом просмотре. В PDF и DOCX диаграммы по-прежнему уходят картинками.

Синхронизация: звонок вместо расписания

Раньше Drafta синхронизировалась в трёх случаях: при запуске, через три секунды после вашей собственной правки и по кнопке. Если заметку менял кто-то другой — второй Mac, Windows-клиент или MCP-сервер, через который работает агент, — открытое приложение об этом не узнавало до ручного синка. Именно поэтому в трекере появился пункт «постоянный автосинк»: агент правит заметку, а вы смотрите на старый текст.

В 1.5.1 приложение держит одно соединение с CouchDB и ждёт. Точнее, держит longpoll-запрос к фиду изменений:

GET /drafta/_changes?feed=longpoll&timeout=25000&since=<чекпойнт>&include_docs=false

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

Несколько деталей, без которых это работало бы плохо:

  • Свежий клиент на каждый звонок. Управляемый токен живёт 15 минут, а удержание — 25 секунд; проще взять новый клиент с новой авторизацией, чем ловить истечение токена на длинном соединении.
  • Без heartbeat. Ответ читается целиком, а служебные пустые строки heartbeat, которые присылает сервер в режиме длинного опроса, сломали бы разбор JSON. Вместо них — таймаут удержания и собственный таймаут запроса с запасом.
  • Откат при ошибке. Сеть пропала или прокси оборвал соединение — приложение ждёт 10 секунд, потом 20, 40 и до 60, а после первого успешного удержания возвращается к базовому ритму. Никаких сообщений об ошибке поверх редактора: синхронизация — фоновая история.
  • Синк при активации окна. Удержанный сокет в фоне может уснуть вместе с процессом; когда вы возвращаетесь в Drafta, приложение синхронизируется — но не чаще раза в 10 секунд, чтобы ⌘-Tab не превращался в сетевой тренажёр.

Кнопка «Синхронизировать» и синк через три секунды после правки остались на месте — как ручной контроль и как быстрое сохранение своего.

Сколько это занимает на деле? Проверяли на живом сервере: заметка, созданная через MCP-реплику на другой машине, появилась в открытом приложении через 0,0 секунды после того, как дошла до сервера. От вызова MCP до появления текста прошло около 4 секунд, но три из них — собственный пуш реплики, который она делает через 3 секунды после правки. Дальше ждать нечего: звонок срабатывает сразу.

Синхронизация остаётся полностью зашифрованной на клиенте: сервер видит только зашифрованные документы, а «звонок» — это чтение списка изменений, без документов.

Что это меняет

  • Агенты. Правка через MCP видна в открытом приложении за секунды: можно править заметку агентом и сразу видеть результат на экране, не нажимая ничего.
  • Несколько Mac. Изменение на одном Mac приезжает на другой само, пока Drafta открыта, — в том числе когда вы просто переключились на неё.
  • Windows. Клиент пока синхронизируется по таймеру и без синка при запуске; это отдельная задача, следующий шаг — научить и его приходить сразу при старте и раз в 30 секунд.

Один честный риск остаётся: если прокси или роутер рвут удержанное соединение раньше 25 секунд, звонок вырождается в опрос раз в 10–60 секунд. Это не хуже прежнего поведения, но и не «мгновенно». Проверить это можно только на живом маршруте — что мы и делали на KeenDNS.

Как обновиться

Откройте Drafta → Check for Updates… или дождитесь ежедневной проверки: 1.5.1 приедет сама. Сборка подписана сертификатом Apple Development без нотаризации, поэтому при первом запуске macOS попросит разрешить приложение в System Settings → Privacy & Security кнопкой Open Anyway. Обновления проверяются подписью EdDSA до установки.

Полный список изменений — в CHANGELOG и в окне обновления. Если диаграмма рисуется не так, как ожидали, или синхронизация где-то молчит дольше секунд — напишите, разберёмся.