Открытый код для Mail, Notes, Forms, MOffice Script, Sync и поиска (исследование, 2026-10-04)
Область: MOffice Mail (почта, календарь, контакты), MOffice Notes, MOffice Forms, MOffice Script, MOffice Sync, полнотекстовый поиск, диктовка (FlyType). Классы лицензий —
docs/12-license-policy.md. Источники данных:docs/research/oss-verified.tsv(проверка 2026-10-04), клоны изBRIEF.md, плюс новые неглубокие клоны в scratchpad (outlook-pst-rs,calcard,libdav) и запросы к crates.io/GitHub — такие строки помечены «(проверено 2026-10-04)». Пути к клонам (временные, только чтение):$S=/private/tmp/claude-501/-Users-amoros-MeridianOffice-/40d8f24c-fbfc-4943-a28d-8a3d2c115276/scratchpad/oss-src/,$P=…/scratchpad/pim/src/(тот же scratchpad).
1. Выводы (топ-10)
Методика экономии: в docs/08-roadmap.md нет оценок по
эпикам, поэтому базой служит «сделать самим» той же командой (фазы 5–7;
ориентир — 1 чел.-мес. на 1,5–2,5 тыс. строк кода парсеров/протоколов с
тестами и фаззингом) минус работа по встраиванию. Для сравнения: работы
фазы 5 — ≈21 FTE × 12 мес. ≈ 250 чел.-мес., фазы 6 — ≈240.
| № | Что берём | Лицензия (класс) | Куда в MOffice | Экономия, чел.-мес. |
|---|---|---|---|---|
| 1 | outlook-pst + compressed-rtf (Microsoft, Rust, ≈15,4 тыс. строк: NDB/LTP/Messaging, ANSI и Unicode) вместо своего парсера [MS-PST] | MIT (1) | codecs/mail/pst, msg |
5 |
| 2 | calcard (Stalwart): iCalendar + vCard чтение/запись, раскрытие RRULE, зоны Windows→IANA, JSCalendar/JSContact | Apache-2.0 OR MIT (1) | codecs/{ical,vcard}, календарь Mail |
4,5 |
| 3 | FlyType (свой): правила «полировки» диктовки RU/EN, маршрутизатор облако/локально, протокол контекста + схема сервиса STT | MIT, владелец (★) | диктовка в Write/Notes/Mail, Cloud | 4 |
| 4 | imap-codec + imap-next (типизированный кодек IMAP, sans-I/O) | MIT OR Apache-2.0 (1) | mail-core::imap |
3,5 |
| 5 | y-sweet (сервер Yjs/Yrs на Rust, хранение в S3/ФС)
как основа CRDT-части cloud-service |
MIT (1) | MOffice Sync, фаза 6 | 3,5 |
| 6 | mail-parser + mail-builder (MIME, mbox, Maildir, нормализация темы на ≈30 языках) | Apache-2.0 OR MIT (1) | codecs/mail/mime, mail-core |
3 |
| 7 | libdav (CalDAV/CardDAV, обнаружение по RFC 6764,
sync-collection) |
ISC (1) | mail-core::dav |
2,75 |
| 8 | WASM-плагины (wasmtime + Extism) вместо нативных плагинов Rust/C++ через C ABI | Apache-2.0 WITH LLVM-exception / BSD-3-Clause (1) | Script SDK, фаза 7 | 2 |
| 9 | Набор для VBA: ovba (чтение
vbaProject.bin), грамматика VB6 из grammars-v4, семантика
из ViperMonkey/oletools |
MIT / MIT / BSD-2-Clause (1) | транслятор VBA v1/v2 | 2 |
| 10 | ink-stroke-modeler (порт на Rust, с фильтром Калмана) + perfect-freehand (контур штриха) | Apache-2.0 / MIT (1) | перо Notes и Paint | 2 |
Ещё ≈7,5 чел.-мес. дают SurveyJS survey-library как образец схемы и
выражений Forms (1,5), mail-auth (1,5), tree-sitter для подсветки (1),
один движок поиска tantivy вместо пары FTS5 + tantivy (1), RustCrypto
cms для S/MIME (1), автонастройка из email-lib
(0,75), lettre для SMTP (0,75). Итого ≈40 чел.-мес. (≈8
% работ фаз 5–6). Если владелец одобрит MPL-2.0 для
onenote_parser — ещё ≈6 (раздел 4).
Главные находки по лицензиям (менять документы проекта):
- В
docs/apps/mail.mdOpenPGP идёт черезsequoia-openpgp— это LGPL-2.0-or-later (класс 2). Замена — rPGP (pgp, MIT OR Apache-2.0, 6,6 млн загрузок); класс 2 больше не нужен. ammonia4.x,css-inlineиlol_htmlтранзитивно тянутcssparserиselectors— MPL-2.0 (проверено 2026-10-04 по зависимостям на crates.io). Вcomponent-map.mdammonia указан как класс 1 — это неточно. Решение: свой санитайзер поверхhtml5ever(MIT OR Apache-2.0) со своим фильтром inline-CSS.- Запрещены (класс 3), хотя выглядят удобными:
sieve-rs(AGPL-3.0-only),evalexpr(AGPL-3.0-only),minicaldav(GPL-3.0-or-later), модели Silero (CC BY-NC-SA 4.0 — их использует сайдкар пунктуации FlyType), SurveyJS Creator/Dashboard/PDF (коммерческая лицензия). Условно (класс 2):fast-dav-rs(LGPL-3.0). - Технические ограничения, которых нет в библии: в QuickJS-ng
нет API отладчика и нет
Intl(quickjs.h,docs/docs/es_features.mdв клоне); в Yrs 0.28 нет операции перемещения элементов массива (Notes рассчитывает наmoveдля порядка страниц).
2. Таблицы по подобластям
Обозначения: ★ — звёзды GitHub, «загр.» — загрузки crates.io, «изм.»
— последний коммит/выпуск. Стратегии: adopt, fork, port, reference,
avoid (см. BRIEF). «Эк.» — экономия, чел.-мес. Данные без пометки взяты
из oss-verified.tsv; строки с новыми кандидатами проверены
2026-10-04 (crates.io API, GitHub API, файлы LICENSE в клонах).
2.1 Mail: почта, календарь, контакты
| Подобласть | Кандидат | SPDX (класс) | ★ / загр. | Изм. | Яз. | Что даёт MOffice | Стратегия | Сами пишем / риски | Эк. |
|---|---|---|---|---|---|---|---|---|---|
| MIME | mail-parser | Apache-2.0 OR MIT (1) | 459 / 4,0 млн | 2026-10-02 | Rust | разбор MIME, RFC 2047/2231, однобайтовые кодировки (CJK — через
encoding_rs), mbox и Maildir, html→text, превью |
adopt | TNEF, секции IMAP; в клоне 1.0.0, на crates.io 0.11.9 | 3 |
| MIME | mail-builder | Apache-2.0 OR MIT (1) | 83 / 1,4 млн | 2026-09-28 | Rust | сборка писем, вложения, кодирование заголовков | adopt | format=flowed, черновики |
в 3 |
| MIME | mailparse | 0BSD (0) | — / 14,6 млн | 2026-09-06 | Rust | простой парсер без обязательств | reference | терпимость к мусору ниже (не проверено) | — |
| IMAP | imap-codec + imap-next | MIT OR Apache-2.0 (1) | — / 125 тыс., 59 тыс. | 2026-07-19 | Rust | полный типизированный кодек IMAP, sans-I/O, фаззинг | adopt | синхронизация (QRESYNC, pending_ops); 2.0 пока
alpha |
3,5 |
| IMAP | async-imap | MIT OR Apache-2.0 (1) | 148 / 1,75 млн | 2026-09-30 | Rust | зрелый клиент (на нём Delta Chat) | запасной | поддержка QRESYNC (не проверено) | — |
| IMAP | imap-client, rust-imap | MIT; Apache-2.0/MIT (1) | — / 59 тыс.; 582 / 2,2 млн | 2026-05; 2025-02 | Rust | высокоуровневый клиент; синхронный клиент | reference; avoid | imap 2.4 почти не развивается |
— |
| SMTP | lettre | MIT (1) | 2267 / 19,5 млн | 2026-09-09 | Rust | SMTP, STARTTLS/implicit TLS, XOAUTH2, отправка готовых байт | adopt | очередь outbox, DSN, BDAT (не проверено) |
0,75 |
| SMTP | mail-send | Apache-2.0 OR MIT (1) | 275 / 547 тыс. | 2026-08-18 | Rust | SMTP + подпись DKIM | запасной | только tokio + rustls | — |
| Аутентификация писем | mail-auth | Apache-2.0 OR MIT (1) | 128 / 519 тыс. | 2026-09-28 | Rust | проверка DKIM, ARC, SPF, DMARC для антифишинга | adopt | DNS-запросы к домену отправителя раскрывают факт обработки письма —
по умолчанию доверять Authentication-Results |
1,5 |
| Автонастройка | email-lib
email/src/autoconfig (≈1 тыс. строк) |
MIT (1) | 44 / 98 тыс. | 2026-03-01 | Rust | ISP → .well-known → ISPDB онлайн → MX → TXT → SRV (RFC
6186) |
fork модуля | убрать http без TLS, своя база, Autodiscover v2 | 0,75 |
| Автонастройка | thunderbird/autoconfig (ISPDB) | MPL-2.0 (2) | 94 | 2026-09-24 | XML | база провайдеров | только онлайн-запрос | данные не встраивать (раздел 4) | — |
| DNS, OAuth | hickory-resolver,
oauth2 (+
oauth-lib pimalaya, MIT) |
MIT OR Apache-2.0 (1) | — / 83,8 млн; 54,9 млн | 2026-09; 2025-01 | Rust | SRV/MX/TXT; Authorization Code + PKCE, loopback | adopt | регистрация клиентов Google (CASA), Microsoft — организационный риск | — |
| iCalendar, vCard, RRULE | calcard | Apache-2.0 OR MIT (1) | 75 / 59 тыс. | 2026-09-30 | Rust | ics/vcf чтение и запись, раскрытие RRULE, зоны Windows→IANA, JSCalendar/JSContact | adopt | описание правила по-русски, round-trip X-, логика
iTIP |
4,5 |
| RRULE | rust-rrule
(rrule) |
MIT OR Apache-2.0 (1) | 94 / 1,3 млн | 2025-04-20 | Rust | ≈6 тыс. строк тестов (примеры RFC 5545, регрессии) | reference, порт тестов | развитие замедлилось (17 мес.) | в 4,5 |
| iCalendar | icalendar | MIT/Apache-2.0 (1) | 190 / 905 тыс. | 2026-09-29 | Rust | генерация и разбор без раскрытия RRULE | запасной | — | — |
| vCard | vcard4, vobject, vcard_parser | MIT OR Apache-2.0; MIT; MIT (1) | — / 53, 43, 28 тыс. | 2026-02…05 | Rust | разбор vCard 4 (RFC 6350) | reference (сверка) | vCard 2.1 с QP — проверить в calcard | — |
| iCalendar | ical.js, libical, ical
(архив) |
MPL-2.0; LGPL/MPL (2); Apache-2.0 | 1179; 366 | — | JS; C; Rust | — | avoid | есть замена класса 1 | — |
| CalDAV/CardDAV | libdav | ISC (1) | — / 49 тыс. | 2026-10-02 | Rust | клиент CalDAV/CardDAV, RFC 6764 (SRV, TXT,
.well-known), sync-collection (RFC 6578) |
adopt | free-busy-query, планирование iTIP, особенности
Google/iCloud |
2,75 |
| CalDAV | kitchen-fridge, caldav-utils | MIT (1) | — / 3,6 тыс.; 14 тыс. | 2022-01; 2023-08 | Rust | — | avoid | заброшены | — |
| CalDAV | fast-dav-rs; minicaldav | LGPL-3.0 (2); GPL-3.0-or-later (3) | — / 3,3 тыс.; 32 тыс. | 2026-09; 2023-07 | Rust | — | avoid | раздел 4–5 | — |
| JMAP (P2) | jmap-client | Apache-2.0 OR MIT (1) | — / 83 тыс. | 2026-09-28 | Rust | клиент JMAP (RFC 8620/8621) | adopt в P2 | — | ≈1 при P2 |
| OpenPGP | rPGP
(pgp) |
MIT OR Apache-2.0 (1) | 1078 / 6,6 млн | 2026-10-03 | Rust | ключи, подпись и шифрование RFC 4880/9580 | adopt | PGP/MIME (RFC 3156), Autocrypt, WKD — свои (образец —
pgp-lib pimalaya) |
снят класс 2 |
| OpenPGP | sequoia-openpgp | LGPL-2.0-or-later (2) | 455 / 1,9 млн | 2026-07-09 | Rust | — | avoid | сейчас записан в mail.md |
— |
| S/MIME | RustCrypto
formats: cms, x509-cert,
pkcs12 |
Apache-2.0 OR MIT (1) | — / 13,5 млн (cms) |
2026-01…07 | Rust | CMS SignedData/EnvelopedData, X.509, PKCS#12 | adopt | cms 0.3 — pre-release; цепочки через ОС
(rustls-platform-verifier, MIT OR Apache-2.0) |
1 |
| S/MIME | rust-openssl + OpenSSL 3 | Apache-2.0 (1) | — / 414 млн | 2026-06-12 | Rust/C | проверенная временем S/MIME | запасной | крупная C-зависимость | — |
| HTML | html5ever | MIT OR Apache-2.0 (1) | — / 116,7 млн | 2026-09-14 | Rust | DOM-разбор писем для санитайзера | adopt | свой allowlist и фильтр CSS | — |
| HTML | ammonia 4.x; css-inline; lol_html | MIT OR Apache-2.0; MIT; BSD-3-Clause, но все →
cssparser/selectors MPL-2.0 (2) |
679 / 17,5 млн | 2026-10 | Rust | готовый санитайзер, инлайн CSS, потоковая правка | reference (раздел 4) | ammonia 3.x — без cssparser |
— |
| Антифишинг | linkify, publicsuffix, unicode-security | MIT OR Apache-2.0 (1) | — / 4,1; 65,8; 15 млн | 2024–2026 | Rust | ссылки в тексте, регистрируемый домен, гомоглифы (UTS #39) | adopt | — | — |
| Антиспам | свой байес (Graham 2002; Robinson, χ²) | — | — | — | — | уже описан в mail.md 5.7 |
own | токенизатор RU/EN | — |
| Антиспам | rspamd; bayespam | Apache-2.0; MIT (1) | 2536; — / 52 тыс. | 2026-09; 2025-10 | C/Lua; Rust | признаки и правила; минимальный байес | reference | rspamd — серверный, не встраивать | — |
| Цепочки | JWZ (jwz.org) + thread_name() из mail-parser |
алгоритм; Apache-2.0 OR MIT | — | — | — | алгоритм уже в mail.md 5.2; префиксы тем на ≈30
языках |
own + adopt | добавить «Пересл:» | — |
| PST | outlook-pst +
compressed-rtf |
MIT (1) | 36 / 175 тыс., 75 тыс. | 2026-09-30 | Rust | PST ANSI/Unicode: NDB, LTP (PC/TC), папки, письма, вложения, именованные свойства; [MS-OXRTFCP] | adopt | MAPI→MIME/VEVENT/vCard, HTML из RTF ([MS-OXRTFEX]), повторения ([MS-OXOCAL]); OST 2013+ нет | 5 |
| MSG | msg_parser; свой на cfb | MIT (1) | 10 / 303 тыс.; — / 68 млн | 2026-05; 2026-09 | Rust | .msg ([MS-OXMSG]) |
reference; own | типы свойств — из outlook-pst | в 5 |
| PST | libpff | LGPL-3.0 (2) | 368 | 2026-09-17 | C | — | avoid | убрать запасной путь FFI из mail.md |
— |
| TNEF | tnef | MIT OR Apache-2.0 (1) | — / 8 тыс. | 2019-08 | Rust | базовый разбор winmail.dat |
reference | свой по [MS-OXTNEF] | — |
| mbox, Maildir | mail-parser src/mailbox/{mbox,maildir}.rs; mbox-reader |
Apache-2.0 OR MIT; MIT/Apache-2.0 (1) | — | 2026-10; 2019 | Rust | потоковое чтение | adopt (mail-parser) | варианты mboxrd/mboxcl2 — проверить | — |
2.2 Notes
| Кандидат | SPDX (класс) | ★ / загр. | Изм. | Яз. | Что даёт MOffice | Стратегия | Сами пишем / риски | Эк. |
|---|---|---|---|---|---|---|---|---|
| ink-stroke-modeler | Apache-2.0 (1) | 141 | 2026-08-02 | C++ (≈4,1 тыс. строк, absl) | сглаживание, давление/наклон, Kalman-предсказание, подавление петель | port на Rust | подбор параметров под Wacom и Apple Pencil | 1,5 |
| ink-stroke-modeler-rs | MIT OR Apache-2.0 (1) | — / 16 тыс. | 2025-05-01 | Rust | «неофициальная частичная» переписка | reference, старт порта | неполнота | в 1,5 |
| perfect-freehand | MIT (1) | 5748 | 2026-04-13 | TS | контур штриха переменной ширины (как в Excalidraw) | port (≈500 строк) | — | 0,5 |
| Excalidraw, Lorien | MIT (1) | 133 тыс.; 6,8 тыс. | 2026-09; 2025-09 | TS; GDScript | модель элементов, привязки, бесконечный холст, формат штрихов | reference | — | — |
| tantivy | MIT (1) | 16,2 тыс. / 19,2 млн | 2026-09-08 | Rust | индекс страниц, OCR, рукописи | adopt | см. 2.6 | — |
onenote.rs
(onenote_parser 2.0) |
MPL-2.0 (2) | 86 / 23 тыс. | 2026-08-06 | Rust (≈18,8 тыс. строк) | .one, .onetoc2 (десктоп и
OneDrive/FSSHTTP), штрихи, формулы, таблицы, вложения, теги |
решение владельца | .onepkg через cab (MIT) |
6 при одобрении |
| evernote2md | MIT (1) | 1113 | 2026-09-25 | Go | ENML→Markdown, ресурсы по MD5 | reference | свой ENEX на quick-xml (MIT) | 0,3 |
| Rnote, Xournal++; Joplin, Logseq, AppFlowy | GPL-3.0, GPL-2.0; AGPL-3.0 (3) | — | — | — | — | avoid | только как пользователь | — |
2.3 Forms
| Кандидат | SPDX (класс) | ★ / загр. | Изм. | Яз. | Что даёт MOffice | Стратегия | Сами пишем / риски | Эк. |
|---|---|---|---|---|---|---|---|---|
| survey-library | MIT (1) | 4888 | 2026-10-02 | TS | JSON-схема ≈20 типов вопросов, выражения
visibleIf/enableIf/requiredIf,
вычисляемые значения, валидаторы |
reference + порт выражений + импорт JSON SurveyJS | runtime на Rust | 1,5 |
| survey-creator, survey-analytics, survey-pdf | коммерческая EULA Devsoft Baltic (3/4) | 1282 | 2026-09 | TS | — | avoid | проверено 2026-10-04 по LICENSE |
— |
| formio.js; react-jsonschema-form; jsonforms | MIT; Apache-2.0; MIT (1) | 2086; 15,9 тыс.; 2744 | 2026-09…10 | JS/TS | схема компонентов с JSON Logic; JSON Schema + uiSchema; правила SHOW/HIDE | reference | — | — |
| jsonschema | MIT (1) | — / 97 млн | 2026-10-02 | Rust | проверка JSON-представления формы и манифестов
.mxt |
adopt | — | — |
| Выражения: meridian-calc (IronCalc); datalogic-rs; cel-interpreter | MIT OR Apache-2.0; Apache-2.0; MIT (1) | — / 190 тыс.; 874 тыс. | 2026-10; 2025-07 | Rust | условия и вычисления на формулах Sheets; JSON Logic; CEL | adopt (calc); запасные | evalexpr — AGPL-3.0-only (3) | — |
| formbricks, ohmyform | AGPL-3.0 и др. (3) | 13 тыс.; 2,9 тыс. | — | TS | — | avoid | — | — |
2.4 MOffice Script
| Кандидат | SPDX (класс) | ★ / загр. | Изм. | Яз. | Что даёт MOffice | Стратегия | Сами пишем / риски | Эк. |
|---|---|---|---|---|---|---|---|---|
| QuickJS-ng 0.17 | MIT (1) | 3852 | 2026-10-02 | C (quickjs.c ≈65 тыс. строк) |
ES2023+, лимиты памяти и стека, прерывание, модули, test262 в CI | adopt | нет отладчика и Intl |
в плане |
| rquickjs 0.14 | MIT (1) | 1026 / 4,8 млн | 2026-09-28 | Rust (≈27,7 тыс.) | безопасные обёртки, классы-макросы, загрузчики модулей, байткод, async | adopt | API 0.x меняется | — |
| Boa | Unlicense OR MIT (0) | 7577 / 5,2 млн | 2026-10-03 | Rust | движок без C | запасной | скорость ниже QuickJS (не проверено) | — |
| oxc 0.152 | MIT (1) | 22,9 тыс. / 1,6 млн | 2026-09-29 | Rust | стирание типов TS → ES2022, парсер для анализатора, isolated declarations | adopt | API 0.x | — |
| swc | Apache-2.0 (1) | 34,2 тыс. / 6,6 млн | 2026-10-02 | Rust | то же | запасной | крупнее | — |
| tree-sitter 0.27 + tree-sitter-typescript 0.23.2, javascript, highlight | MIT (1) | 27 тыс. / 42,7 млн | 2026-09-27 | Rust/C | инкрементальная подсветка, свёртка, структура в QML-редакторе | adopt | ABI грамматик с ядром 0.27 — проверить | 1 |
| Monaco, CodeMirror | MIT (1) | 46,8 тыс.; 7,8 тыс. | — | JS | — | avoid | требуют WebView | — |
| wasmtime 49 | Apache-2.0 WITH LLVM-exception (1) | 18,7 тыс. / 38,4 млн | 2026-10-02 | Rust | песочница: лимиты памяти, fuel/epoch-прерывание, WASI с выданными каталогами | adopt | размер (Cranelift) | в 2 |
| Extism 1.30 | BSD-3-Clause (1) | 5770 / 731 тыс. | 2026-09-02 | Rust | API плагинов поверх wasmtime, PDK для Rust/JS/Go/Python/C# и др. | adopt | — | 2 |
| wasmi; wasmer | MIT OR Apache-2.0; MIT (1) | — / 24 млн; 21,1 тыс. | 2026-09 | Rust | лёгкий интерпретатор; альтернативный рантайм | запасной | — | — |
| PyO3 + CPython 3.12 | MIT OR Apache-2.0; PSF-2.0 (1) | 16,2 тыс. / 266 млн | 2026-09-30 | Rust/C | Python-плагин в отдельном процессе | adopt | сборка CPython — раздел 4 | — |
| RustPython | MIT (1) | — / 41 тыс. | 2026-10-02 | Rust | — | avoid | слабая совместимость с колёсами | — |
| ovba 0.7 | MIT (1) | 11 / 22 тыс. | 2024-12-30 | Rust | vbaProject.bin: распаковка [MS-OVBA], поток
dir, исходники модулей |
adopt + форк | мало сопровождающих | в 2 |
| oletools (olevba) | BSD-2-Clause/MIT (1) | 3422 | 2026-02-14 | Python | извлечение VBA, подозрительные ключевые слова, p-code | port эвристик | — | — |
| ViperMonkey | BSD-2-Clause, кроме thirdparty/ (1) |
1128 | 2024-07-10 | Python | эмулятор VBA: грамматика pyparsing, семантика встроенных функций | reference + port функций в vba-compat |
развитие остановлено | — |
| grammars-v4 VB6 | MIT (1) | — | — | ANTLR | грамматика VB6 (≈ VBA) | reference для своего парсера по [MS-VBAL] | — | — |
| Rubberduck | GPL-3.0 (3) | — | — | C# | — | avoid | — | — |
2.5 Совместное редактирование (MOffice Sync)
| Кандидат | SPDX (класс) | ★ / загр. | Изм. | Яз. | Что даёт MOffice | Стратегия | Сами пишем / риски | Эк. |
|---|---|---|---|---|---|---|---|---|
| Yrs 0.28 | MIT (1) | 2160 / 3,8 млн | 2026-09-30 | Rust (≈40,6 тыс.) | Text/XmlText с атрибутами,
Map, Array, UndoManager с
origins, StickyIndex, awareness, протокол sync, weak
links |
adopt | нет move; снимки и GC |
в плане |
| Loro 1.16 | MIT (1) | 6171 / 765 тыс. | 2026-09-28 | Rust | MovableList, MovableTree, rich text, undo,
снимки |
пилот для дерева Notes/Draw | два CRDT в продукте — избегать | — |
| Automerge | MIT (1) | 6633 / 663 тыс. | 2026-09-30 | Rust | JSON-CRDT, marks (Peritext) | reference | нет встроенного undo | — |
| diamond-types | ISC (1) | 1840 / 49 тыс. | 2026-09-02 | Rust | Eg-walker, только текст | reference | крейт 1.0.0 от 2022-08 | — |
| y-octo | MIT (1) | — / 59 тыс. | 2026-09-22 | Rust | вторая реализация Yjs-совместимого CRDT (AFFiNE) | reference | — | — |
y-sweet
(y-sweet-core) |
MIT (1) | 1018 / 25 тыс. | 2025-12-04 | Rust | сервер протокола Yjs, хранение в S3/ФС, токены доступа | fork | развитие замедлилось; роли commenter/viewer — свои | 3,5 |
| Hocuspocus | MIT (1) | 2611 | 2026-10-02 | TS | хуки аутентификации и хранения, Redis, webhooks | reference | — | — |
| yrs-kvstore; y-sync (архив) | MIT (1) | — / 1,1 млн | 2024-07; 2023-11 | Rust | слой хранения; старый протокол (теперь yrs::sync) |
reference; avoid | — | — |
2.6 Полнотекстовый поиск и диктовка
| Кандидат | SPDX (класс) | ★ / загр. | Изм. | Что даёт MOffice | Стратегия | Риски | Эк. |
|---|---|---|---|---|---|---|---|
| tantivy 0.26 | MIT (1) | 16,2 тыс. / 19,2 млн | 2026-09-08 | единый индекс Mail/Notes/Hub, фразы, нечёткий поиск, фасеты | adopt | — | 1 |
| rust-stemmers | MIT/BSD-3-Clause (1) | — / 35,2 млн | 2019-11 | стемминг Snowball ru/en и ещё ≈15 языков | adopt | не развивается, но стабилен | — |
| lindera; whatlang | MIT (1) | — / 2,5 млн; 3,6 млн | 2026-09; 2025-10 | токенизация CJK; определение языка документа | adopt | словари lindera — проверить | — |
| SQLite FTS5 | Public Domain (0) | — | — | префиксные подсказки имён и адресов | adopt (узко) | второй индекс не нужен | — |
| Meilisearch; rsmorphy | BUSL-1.1 + MIT (3); MIT/Apache-2.0, словари OpenCorpora (не проверено) | 59,5 тыс.; — | — | — | avoid | — | — |
FlyType flytype-core,
flytype-protocol |
MIT, владелец (★) | — | 2026-08 | правила полировки диктовки, маршрутизатор, контекст курсора | own (перенос) | — | 4 |
| whisper-rs + whisper.cpp + модели Whisper | Unlicense (0) + MIT (1) | — / 1,4 млн | 2026-03-12 | офлайн-распознавание на трёх ОС, пунктуация «из коробки» | adopt | размер моделей | — |
| WhisperKit (argmax) | MIT (1) | — | — | офлайн на macOS (уже в FlyType) | adopt (macOS) | — | — |
| sherpa-rs + sherpa-onnx | MIT + Apache-2.0 (не проверено) | — / 92 тыс. | 2025-10 | потоковые модели ONNX | запасной | — | — |
| Модели Silero (TE — пунктуация) | CC BY-NC-SA 4.0 (3) | — | — | — | avoid | используется в punct-sidecar FlyType |
— |
3. Глубокие разборы
3.1 Почтовый стек
Итоговая сборка mail-core (все зависимости
класса 0–1):
mail-core
├── imap imap-codec + imap-next (кодек, sans-I/O) → наш движок синхронизации (mail.md 5.1)
├── smtp lettre (отправка готовых байт) ← mail-builder (сборка) ← rPGP / cms (подпись, шифрование)
├── mime mail-parser (+ mbox, Maildir, thread_name) → свой TNEF
├── auth mail-auth (DKIM/ARC/SPF/DMARC) для индикаторов антифишинга
├── dav libdav (CalDAV/CardDAV, RFC 6764) → calcard (ics/vcf, RRULE, зоны)
├── discover форк autoconfig из email-lib + своя база провайдеров + hickory-resolver
├── import outlook-pst + compressed-rtf (PST), cfb (MSG), mail-parser (mbox/Maildir)
└── safe-html html5ever + свой allowlist и фильтр CSS
Stalwart: mail-parser, mail-builder, mail-send,
mail-auth (все Apache-2.0 OR MIT; берём по MIT). Клон
$S/stalwartlabs_mail-parser (коммит 2026-10-02, ≈23,6 тыс.
строк, тексты лицензий в LICENSES/):
src/parser/{builder,header_block}.rs,src/fields/{address,content_type,date,received}.rs— терпимый разбор заголовков (адреса с ошибками, нестандартные даты), то, чтоmail.md5.5 описывает как собственную работу;src/decoders/charsets/*— таблицы однобайтовых кодировок, фичаfull_encodingподключаетencoding_rsдля CJK;src/decoders/html/*— html→text для индекса и превью;src/decoders/preview.rs— сниппеты списка;src/fields/thread.rs—thread_name(): срезаниеRe:/Fwd:на ≈30 языках (есть «отв», «ответ»; «Пересл» нет — добавить в нашей обёртке);src/mailbox/{mbox,maildir}.rs— потоковые итераторы для импорта. Нет: TNEF (application/ms-tnef) — пишем по [MS-OXTNEF] (≈0,5 чел.-мес.), секции IMAP для догрузки частей — наша обёртка над деревом частей. mail-builder закрывает сборку (multipart/alternative/related, RFC 2047/2231 в заголовках). mail-send — запасной SMTP (умеет подпись DKIM, но привязан к tokio + rustls), основной — lettre (MIT, 19,5 млн загрузок). mail-auth нужен клиенту только для проверки (DKIM, ARC, SPF, DMARC); чтобы не раскрывать DNS-запросами факт и время обработки письма, по умолчанию доверяемAuthentication-Resultsсвоего сервера, а локальную проверку включаем для писем без него.
IMAP. Два зрелых пути: async-imap (MIT
OR Apache-2.0, 1,75 млн загрузок, основа Delta Chat) и
imap-codec + imap-next (MIT OR Apache-2.0;
полностью типизированный кодек, sans-I/O, фаззинг). Рекомендуем второй:
sans-I/O ложится на наш движок синхронизации с pending_ops
(mail.md 5.1), а типизированные ответы (VANISHED (EARLIER),
MODSEQ) снижают риск ошибок на «кривых» серверах. Риск:
ветка 2.0 — alpha; наличие CONDSTORE/QRESYNC в кодеке нужно подтвердить
по коду (не проверено). pimalaya email-lib использует как
раз imap-client поверх imap-next
($S/pimalaya_core/email/Cargo.toml,
email/src/imap/mod.rs, 1359 строк) — живой пример
встраивания.
pimalaya/core ($S/pimalaya_core, коммит
2026-03-01, все крейты MIT, © soywod 2022–2024). Крейты:
email-lib 0.27 (бэкенды IMAP, Maildir, Notmuch, SMTP,
sendmail; фичи autoconfig, sync, thread, watch, oauth2, pgp),
mml-lib 1.1 (язык шаблонов писем MML из Emacs),
pgp-lib 1.0 (обёртка rPGP с поиском ключей WKD и
keyserver), oauth-lib 2.0, keyring-lib,
secret-lib, http-lib, time-lib,
process-lib, rip-starttls,
buf-stream, shellexpand-utils,
email-macros, email-testing-server,
email-tests. CalDAV/CardDAV в core нет (в
клоне их нет; у pimalaya это отдельные проекты — не проверялись). Что
брать:
| Файлы в клоне | Объём | Что даёт | Решение |
|---|---|---|---|
email/src/autoconfig/{mod,config,dns}.rs |
1039 строк | порядок: autoconfig.<домен> →
<домен>/.well-known → ISPDB онлайн → MX → TXT
mailconf → SRV |
fork; убрать http без TLS, добавить свою базу и Autodiscover v2 |
oauth/src/* |
415 строк | Authorization Code + PKCE, loopback-редирект, обновление токена | образец для mail-core::oauth поверх
oauth2 |
pgp/src/* |
1204 строки | WKD (z-base-32 + SHA-1), keyserver поверх rPGP | port идей WKD |
email/src/email/message/template/reply/mod.rs |
1427 строк | шаблоны ответа и цитирования | reference |
email/src/email/sync/{patch,hunk,report}.rs |
≈2,9 тыс. строк | двусторонняя синхронизация IMAP↔︎Maildir | reference для офлайн-кэша |
email/src/email/envelope/thread/* |
773 строки | цепочки через IMAP THREAD + petgraph |
не JWZ — не брать |
email-testing-server |
243 строки | тестовый сервер | не брать: git-зависимость на
stalwartlabs/mail-server v0.9.0 (AGPL-3.0) |
фича notmuch |
— | libnotmuch | не включать: libnotmuch под GPL-3.0 (по памяти, не проверено) |
iCalendar, RRULE, vCard: calcard вместо пары icalendar +
rrule. Клон $P/calcard (2026-09-30, версия 0.4.0,
LICENSES/{Apache-2.0,MIT}.txt):
src/icalendar/{parser,writer,builder,timezone,dates}.rs,
src/vcard/{parser,writer}.rs (≈25 тыс. строк вместе с
datecalc), src/datecalc/recurrence.rs (6217
строк) — движок RFC 5545, портированный из bttf Эндрю
Галланта (заголовок SPDX: Unlicense OR MIT),
src/datecalc/error.rs — из rust-rrule
(Apache-2.0 OR MIT). Даёт ровно то, что требуют
mail.md 5.3 и 6.1: терпимый разбор, неоднозначные часы по
RFC 5545 §3.3.5, COUNT с бюджетом итераций, зоны Windows
(timezone.rs) и встроенную tzdb (фича
tzdb-bundle). Дополнительно JSCalendar/JSContact
(пригодятся для JMAP в P2). Сами пишем: описание правила по-русски,
iTIP/iMIP-логику (REQUEST/REPLY/COUNTER, SEQUENCE), кэш экземпляров ±2
года. rust-rrule ($S/fmeringdal_rust-rrule, MIT OR
Apache-2.0, 15,9 тыс. строк, последний коммит 2025-04-20) — источник
тестов:
rrule/src/tests/{rfc_tests,rrule, regression,daylight_saving}.rs
(≈6 тыс. строк, 39 + 173 теста) переносим в корпус «2 000 RRULE»
(mail.md 8.1). Для vCard: calcard (2.1/3.0/4.0);
vcard4 (MIT OR Apache-2.0) — для перекрёстной сверки.
CalDAV/CardDAV: libdav. Клон $P/libdav
(2026-10-02, ISC, ≈10 тыс. строк): src/sd.rs — обнаружение
по RFC 6764 (SRV, TXT path=,
/.well-known/caldav),
src/dav/{propfind,find_collections,put_resource}.rs,
src/caldav/*, src/carddav/*,
src/names.rs (свойства RFC 6578
sync-collection, RFC 6638 scheduling). Сами пишем:
free-busy-query (RFC 4791 §7.10), отправку приглашений
через Schedule-Outbox, обходы особенностей Google и iCloud. Риск: DNS в
libdav сделан на крейте domain (NLnet Labs, лицензия не
проверялась), у нас — hickory; две DNS-библиотеки допустимы. Не брать:
minicaldav (GPL-3.0-or-later), fast-dav-rs
(LGPL-3.0).
Автонастройка без встраивания ISPDB (MPL-2.0).
Порядок для мастера аккаунта: (1) своя база ≈40 провайдеров (Gmail,
Outlook.com/Microsoft 365, Яндекс, Mail.ru, iCloud, Yahoo, GMX,
Fastmail, Rambler, Zoho…) — составляем сами по официальной документации
провайдеров (факты о серверах и портах не охраняются; XML-файлы ISPDB не
копируем), храним в mail-core/providers.toml, обновляем
через MOffice Update; (2)
https://autoconfig.<домен>/… и
https://<домен>/.well-known/autoconfig/… (http без
TLS — только с предупреждением: ответ можно подменить); (3) DNS SRV по
RFC 6186 и RFC 8314 (_submissions._tcp,
_imaps._tcp); (4) Autodiscover v2 (P1); (5) эвристика по
MX; (6) по явному согласию — онлайн-запрос к
autoconfig.thunderbird.net (домен пользователя уходит в
Mozilla; условия сервиса для сторонних клиентов не проверены); (7)
ручной ввод. Кандидат класса 1 для своей базы —
providers.xml из K-9 Mail/Thunderbird for Android
(Apache-2.0 — не проверено).
OpenPGP и S/MIME. rPGP (pgp, MIT OR
Apache-2.0, 6,6 млн загрузок, выпуск 2026-10-03) заменяет
sequoia-openpgp (LGPL-2.0-or-later) из mail.md
2.2. Над ним пишем сами (≈1 чел.-мес.): PGP/MIME (RFC 3156), Autocrypt
1.1 (заголовки, gossip, «предпочитать шифрование»), WKD и hkps по
образцу pimalaya/core/pgp. Код Delta Chat (MPL-2.0) —
только чтение как референс Autocrypt. S/MIME: RustCrypto
cms (SignedData/EnvelopedData), x509-cert,
pkcs12 (импорт .p12), проверка цепочки с EKU
emailProtection — через API ОС (SecTrust,
CertGetCertificateChain) и свой код для Linux; запасной путь —
openssl (Apache-2.0). Риск: cms 0.3 —
pre-release.
Санитайзер HTML. ammonia 4.x тянет
cssparser (MPL-2.0), поэтому пишем свой фильтр:
html5ever → дерево → allowlist тегов/атрибутов из
mail.md 5.6 → атрибут style и блоки
<style> разбираем своим токенизатором деклараций CSS
(≈400 строк по CSS Syntax Level 3) с allowlist свойств; ссылки —
linkify, проверка доменов — publicsuffix,
гомоглифы — unicode-security (все MIT OR Apache-2.0).
ammonia 3.x (без cssparser) — референс.
Антиспам и цепочки — свои. Байес по Graham («A Plan
for Spam», 2002) и Robinson (χ²-комбинирование, 2003) уже описан в
mail.md 5.7; rspamd (Apache-2.0) — источник идей признаков
(не встраиваем), bayespam (MIT) — минимальный образец. Цепочки — JWZ по
описанию на jwz.org (mail.md 5.2) +
thread_name() из mail-parser.
PST, MSG, mbox. Клон $P/outlook-pst-rs
(Microsoft, MIT, коммит 2026-09-14; README называет его реализацией
[MS-PST] «чистой комнаты», совместимой с mspst32.dll):
crates/pst/src/ndb/{header,root,page,block,node_id,block_id}.rs
(заголовки ANSI и Unicode, B-деревья NBT/BBT, блоки XBLOCK/SLBLOCK),
src/ltp/{heap,tree,prop_context,table_context, prop_type}.rs
(HN, BTH, PC, TC),
src/messaging/{store,folder,message,attachment,named_prop,search}.rs,
src/encode/{permute,cyclic}.rs, src/crc.rs;
crates/compressed-rtf — [MS-OXRTFCP]. Только чтение (плюс
восстановление AMap). Это закрывает слои NDB/LTP/Messaging из
mail.md 6.3; наш слой «Преобразование» (≈2 чел.-мес.): MAPI
→ MIME (PidTagTransportMessageHeaders, тела HTML/RTF/текст,
кодовые страницы), HTML из RTF по [MS-OXRTFEX], встречи → VEVENT
(PidLidAppointmentRecur → RRULE по [MS-OXOCAL]), контакты →
vCard, задачи → VTODO. OST 2013+ (страницы 4 КБ) библиотека не читает —
оставляем R*. MSG: тот же слой свойств поверх cfb (MIT) по
[MS-OXMSG]; msg_parser (MIT, 10★) — только сверка. Запасной
путь через libpff (LGPL-3.0) из mail.md 9
больше не нужен.
3.2 Notes: перо, поиск, импорт OneNote/Evernote, холст
Перо: ink-stroke-modeler → порт на Rust. Клон
$S/google_ink-stroke-modeler (Apache-2.0, коммит
2026-08-02): публичный API —
ink_stroke_modeler/{stroke_modeler,params,types}.{h,cc};
ядро — internal/wobble_smoother.cc (подавление дрожания),
internal/position_modeler.cc (модель «пружины с массой» —
перо тянет кончик), internal/stylus_state_modeler.cc
(давление, наклон, ориентация по проекции на сглаженную линию),
internal/loop_contraction_mitigation_modeler.cc (убирает
«петли» на резких поворотах),
internal/prediction/{kalman_predictor,stroke_end_predictor}.cc
+ kalman_filter/. Всего ≈4,1 тыс. строк C++ без тестов,
зависимость — Abseil. Тащить C++ и Abseil в сборку ради 4 тыс. строк
невыгодно: порт на Rust в notes-model::ink ≈1 чел.-мес.
(стартовая точка — ink-stroke-modeler-rs, MIT OR
Apache-2.0, «частичная переписка»), в заголовках файлов — «основано на
ink-stroke-modeler, © Google LLC, Apache-2.0», в NOTICE — текст Apache.
Что меняется в notes.md 5.3: шаги 1 (One-Euro) и 6
(линейная экстраполяция) заменяются моделятором с Kalman-предсказанием;
RDP-прореживание и тайловый кэш остаются нашими; построение контура — по
алгоритму perfect-freehand (MIT, Стив Руиз: streamline, thinning,
сужение концов; ≈500 строк TS → Rust) или текущим offset-путём из
notes.md. Тот же модуль использует Paint (стабилизатор
кисти) — общий крейт.
Поиск: tantivy. Индекс по схеме
notes.md 4.6 и mail.md 5.10 (один индекс на
профиль, поле kind). Токенизатор
meridian_ru_en = SimpleTokenizer →
LowerCaser → стеммер Snowball (rust-stemmers,
MIT/BSD-3-Clause) по языку поля, язык документа — whatlang
(MIT); для CJK — lindera (MIT). Нечёткий поиск —
FuzzyTermQuery (расстояние 1–2), транслит — отдельное поле.
Морфологию «как у pymorphy» не берём: rsmorphy использует словари
OpenCorpora (по памяти — CC BY-SA, не проверено) — для встраиваемых
данных это класс 3.
OneNote. Клон $S/msiemens_onenote.rs
(MPL-2.0, onenote_parser 2.0, коммит 2026-08-06, ≈18,8 тыс.
строк):
crates/parser/src/onestore/{desktop,fsshttpb,shared} —
контейнер [MS-ONESTORE] в двух упаковках (файл десктопа и загрузка из
OneDrive, FSSHTTP), src/one/property_set/* — 33 типа узлов
[MS-ONE] (page_node, outline_*,
rich_text_node, ink_*, table_*,
image_node, embedded_file_*,
math_inline_object, note_tag_*),
src/onenote/* — удобный API (книжка → разделы → страницы →
контуры, штрихи, таблицы). Не пишет файлы и не распаковывает
.onepkg (это CAB — крейт cab, MIT). Объём
своего парсера той же полноты — 6–7 чел.-мес. Варианты — в разделе
4.
Evernote ENEX — свой парсер. ENEX — XML:
<en-export> → <note>
(title, content в CDATA с ENML,
created, updated, tag,
note-attributes), <resource>
(data base64, mime,
resource-attributes/file-name, recognition); в
ENML — <en-media hash="MD5">,
<en-todo checked>, <en-crypt>.
Реализация на quick-xml (MIT)
- HTML-кодек Write для ENML ≈0,5 чел.-мес.; evernote2md (MIT, Go,
1113★) — референс разбора ресурсов и преобразования ENML; схема
шифрования
<en-crypt>(PBKDF2 + AES-128 для новых заметок, RC2 для старых — по открытым описаниям, не проверено) — реализуем сами на RustCrypto.
Холст. Excalidraw (MIT, 133 тыс. ★) — референс
модели элементов (привязки стрелок к фигурам, группы, рамки) и порядка
элементов по дробным индексам (fractional-indexing, по
памяти — не проверено по коду), что совпадает с рекомендацией для CRDT в
3.5. Lorien (MIT, Godot) — референс бесконечного холста и формата
штрихов. tldraw — запрещён (лицензия с водяным знаком). Своя работа
остаётся прежней: раскладка контейнеров, автосдвиг, лассо
(notes.md 5.1–5.4).
3.3 Forms: схема вопросов и логика
Что брать из SurveyJS. Только
survey-library (Form Library, MIT, 4888★, коммит
2026-10-02). Конструктор (survey-creator), сводки (survey-analytics) и
PDF (survey-pdf) — под коммерческой EULA Devsoft Baltic (проверено
2026-10-04 по файлам LICENSE): не подключать и не
копировать. Ценность survey-library для нас — отработанная за 10 лет
JSON-схема и язык условий; код рендера (React/Angular/Vue) не нужен.
Соответствие типов forms.md 2.1 и SurveyJS (по
документации SurveyJS, по коду не сверялось):
| MOffice | SurveyJS | MOffice | SurveyJS |
|---|---|---|---|
short-text (+ email/phone/url/number) |
text (inputType) |
likert, matrix |
matrix, matrixdropdown,
matrixdynamic |
long-text |
comment |
ranking |
ranking |
single-choice, multi-choice |
radiogroup, checkbox
(showOtherItem, showNoneItem) |
signature |
signaturepad |
dropdown |
dropdown, tagbox |
section, description |
panel, html |
scale, rating, nps |
rating (rateMin/rateMax,
звёзды) |
consent, yes-no |
boolean |
date, time, datetime,
number |
text с inputType |
file |
file |
page-break |
pages[] |
вычисляемое поле (P1) | expression, calculatedValues |
Логика. Условия SurveyJS (visibleIf,
enableIf, requiredIf, триггеры
complete/skip/setvalue) —
выражения вида {age} >= 18 and {q3} anyof ['a','b'] с
функциями iif, age, sum,
today и др. В MOffice forms.md 2.2 уже решил:
условия и вычисляемые поля — на движке формул Sheets
(meridian-calc на базе IronCalc, MIT OR Apache-2.0); ссылки
{qN} становятся переменными формулы, функции SurveyJS
отображаются на формулы (iif → IF,
age → DATEDIF(…;TODAY();"Y")). Так выражения
проверяются тем же кодом на десктопе, в WASM-рантайме веба и на сервере.
Ветвление по страницам — своя модель правил перехода с проверкой графа
(forms.md 5.1). Запасные движки выражений класса 1 —
datalogic-rs (JSON Logic, Apache-2.0) и
cel-interpreter (MIT); evalexpr —
AGPL-3.0-only, запрещён.
JSON Schema и формы расширений. formio.js (MIT)
хранит условия как JSON Logic, react-jsonschema-form (Apache-2.0) и
jsonforms (MIT) строят формы из JSON Schema + uiSchema (правила
SHOW/HIDE). Для опросов это слабее модели
SurveyJS, но для диалогов настроек расширений MOffice
Script (03-architecture.md §9.3, «декларативная
JSON-форма») формат «JSON Schema + uiSchema» — привычный стандарт:
предлагаем его подмножество с рендером на QML-компонентах Forms.
Проверка — крейт jsonschema (MIT).
Рекомендация. Своя модель .mfx (XML,
forms.md 4.2) + JSON-представление с именами свойств,
близкими к SurveyJS (visibleIf, requiredIf,
choices, validators); импорт JSON SurveyJS в
.mfx — P1 (≈0,5 чел.-мес., открывает миграцию с SurveyJS и
конвертеров Google Forms). Экономия ≈1,5 чел.-мес. — проектирование
схемы, набор типов и тест-кейсы логики берём готовыми.
3.4 MOffice Script: движок, TypeScript, подсветка, песочница, Python, VBA
Встраивание QuickJS-ng через rquickjs (клоны
$S/quickjs-ng_quickjs — MIT, 0.17.0, коммит 2026-10-02;
$S/DelSkayn_rquickjs — MIT, 0.14.0, ≈27,7 тыс. строк).
Схема из 03-architecture.md §9.5 реализуется штатными
средствами (проверено по коду):
| Требование | Чем закрывается | Где в клоне |
|---|---|---|
| память 64–256 МБ, стек 1 МБ | Runtime::set_memory_limit,
set_max_stack_size, set_gc_threshold,
memory_usage() |
rquickjs/core/src/runtime/base.rs:158–200;
quickjs.h:515–521 |
| «скрипт не отвечает» через 5 с | Runtime::set_interrupt_handler — замыкание вызывается
движком периодически, true бросает неперехватываемое
исключение |
runtime/base.rs:120–127;
JS_SetInterruptHandler в quickjs.h:1191 |
модули только из пакета .mxt |
Runtime::set_loader(resolver, loader); свои
Resolver/Loader читают только ZIP пакета;
встроенный модуль meridian —
ModuleLoader::with_module |
core/src/loader/{builtin_resolver,module_loader,bundle,compile}.rs |
без eval/Function в продакшене |
контекст собирается из выбранных intrinsics
(ContextBuilder); надёжнее — грузить только байткод,
скомпилированный при установке, и удалять глобальные
eval/Function |
core/src/context/builder.rs:59–88 |
Promise ↔︎ async Rust, поток вне UI |
AsyncRuntime/AsyncContext,
idle(), execute_pending_job() |
core/src/runtime/{async,base}.rs |
прокси-объекты API (Range, Cell) |
макросы #[rquickjs::class],
#[rquickjs::methods] |
macro/, пример examples/class-methods |
Два пробела, которых нет в библии: (1) отладчика в QuickJS-ng
нет — в quickjs.h нет API точек останова и шагов,
а 03-architecture.md §9.5 рассчитывает на «QuickJS-ng debug
API». Варианты: свой патч движка (форк MIT допустим; хук по таблице
номеров строк) — 1,5–2 чел.-мес.; движок Boa (Unlicense OR MIT, класс 0)
— наличие отладки не проверено. (2) Intl не
поддерживается (docs/docs/es_features.md:
«unlikely … will ever support Intl») — даём meridian.intl
поверх ICU4X (числа, даты, сортировка) ≈0,5 чел.-мес.
TypeScript: oxc, а не swc.
03-architecture.md §9.5 выбрал oxc (MIT), а
08-roadmap.md E1.9 говорит о «встроенном swc-подмножестве»
— расхождение, предлагаем закрепить oxc: oxc_parser →
oxc_semantic → oxc_transformer (стирание
типов, цель ES2022) → oxc_codegen (с source map для стеков
ошибок); oxc_isolated_declarations генерирует
.d.ts для пакетов магазина; тот же парсер — основа лёгкого
анализатора автодополнения. Риск — API 0.x (0.152): закрепить версию,
обновлять раз в квартал.
Подсветка без WebView: tree-sitter.
tree-sitter 0.27 + грамматики
tree-sitter-typescript 0.23.2 (TS и TSX),
tree-sitter-javascript, при Python-плагине —
tree-sitter-python, и tree-sitter-highlight
(все MIT). Схема в QML-редакторе: на каждую правку —
tree.edit() и инкрементальный
parser.parse(text, Some(&old_tree)), запросы
highlights.scm → спаны → токены темы MDS;
locals.scm/tags.scm — структура и переход к
определению. Monaco и CodeMirror не годятся — требуют WebView, который
03-architecture.md §9.3 запрещает. Риск: совместимость ABI
грамматик (выпуск 2024-11) с ядром 0.27 — проверить на прототипе.
Песочница плагинов: WASM вместо C ABI.
08-roadmap.md E7.5 планирует «плагины на Rust/C++ (ABI
через C, подписанные)» — это нативный код без изоляции. Предлагаем
основным путём WASM: wasmtime (Apache-2.0 WITH LLVM-exception) даёт
лимиты памяти (StoreLimits), времени (fuel или
epoch-прерывание) и WASI с доступом только к выданным каталогам
(соответствует праву files.path:<glob>); Extism
(BSD-3-Clause) добавляет готовый плагин-API (манифест с лимитами памяти,
таймаутом, разрешёнными хостами и путями) и PDK для Rust, Go, C, JS,
Python и др. Хост-функции = подмножество meridian.* с
проверкой прав §9.4. wasmi (MIT OR Apache-2.0) — лёгкий интерпретатор
без JIT для маленьких плагинов. Нативный C ABI оставить только для
подписанных Enterprise-модулей (ГОСТ через КриптоПро). Экономия ≈2
чел.-мес.: не нужен свой песочный процесс с IPC для нативных плагинов и
свой PDK.
Python (опционально). PyO3 (MIT OR Apache-2.0)
встраивает CPython 3.12 (PSF-2.0, класс 1) в процесс
meridian-python-host (§9.8). Сборку
python-build-standalone, указанную в архитектуре, публикуют
под MPL-2.0 (скрипты и патчи; проверено 2026-10-04) — см. раздел 4.
RustPython (MIT) не подходит: колёса с C-расширениями не работают.
VBA. Извлечение: ovba (MIT, проверено
по LICENSE 2026-10-04) читает vbaProject.bin —
CFB, распаковка [MS-OVBA], поток dir, исходники модулей;
держим форк (11★, мало сопровождающих). Эвристики «опасных» макросов при
открытии .docm/.xlsm (AutoOpen,
Shell, CreateObject, Declare) —
порт таблиц ключевых слов из olevba (oletools, BSD-2-Clause). Транслятор
VBA → TS (03-architecture.md §9.7): грамматика — по
открытой спецификации [MS-VBAL] с проверкой на грамматике VB6 из
antlr/grammars-v4 (ProLeap, MIT — проверено по заголовку
VisualBasic6Parser.g4); семантика встроенных функций
(Mid, InStr, Format,
DateAdd, Like и т.п.) для библиотеки
vba-compat — по ViperMonkey (BSD-2-Clause по заголовку
vipermonkey/vmonkey.py, кроме папки
thirdparty/; развитие остановлено в 2024). Rubberduck
(лучший парсер VBA, GPL-3.0) — запрещён.
3.5 CRDT и сервер синхронизации
Числа производительности — из открытого набора dmonad/crdt-benchmarks (README, проверено 2026-10-04): версии yjs 13.6.11, ywasm 0.9.3 (Yrs в WASM), loro 0.10.1, automerge 2.1.10; Node 20.5, Intel i5-8400. Версии старые, автор набора — создатель Yjs; для решения нужен свой замер на прототипе I21. B4 — реальная запись набора статьи (≈260 тыс. правок, по одной на транзакцию).
| Критерий | Yrs (Yjs) | Loro | Automerge | diamond-types |
|---|---|---|---|---|
| Лицензия, зрелость | MIT; 0.28, 3,8 млн загрузок; экосистема Yjs 22,9 тыс. ★ | MIT; 1.16, формат стабилен с 1.0; 765 тыс. загрузок | MIT; 663 тыс. загрузок; 6,6 тыс. ★ | ISC; крейт 1.0.0 от 2022-08, репозиторий живой; исследовательский |
Размер истории, B4 docSize |
159 929 Б (Yjs и ywasm) | 258 228 Б | 129 116 Б | нет в наборе (статья Eg-walker заявляет компактность — не проверено) |
| Время B4, применение по одной правке | Yjs 5,7 с; ywasm 28,7 с | 3,1 с | 14,3 с | нет в наборе |
Загрузка документа B4 parseTime |
Yjs 39 мс; ywasm 16 мс | 13 мс (со снимком) | 1 805 мс | — |
| B4 × 100: время / размер | Yjs 609 с / 16,0 МБ; ywasm 2 830 с / 16,0 МБ | 310 с / 25,8 МБ | не выполнен | — |
| Undo «только своих» правок | да: UndoManager с tracked origins
(yrs/src/undo.rs, 2225 строк) |
да (UndoManager) |
нет, делает приложение | нет |
| Rich text | да: Text::format, insert_embed
(types/text.rs:301–372), XmlText |
да: стили со смыслом Peritext | да: marks (Peritext) | нет, только текст |
| Перемещение элементов и узлов | нет (в types/array.rs нет
move) |
да: MovableList, MovableTree |
нет | нет |
| Протокол и сервер | sync v1 + awareness в
yrs/src/sync/{protocol,awareness}.rs; y-sweet, Hocuspocus,
y-websocket |
свой | automerge-repo (JS) | нет |
| Прочее | weak links/цитаты (types/weak.rs),
StickyIndex для курсоров |
снимки с быстрой загрузкой | JSON-модель | алгоритм Eg-walker |
Рекомендация: оставить Yrs (как в библии и
03-architecture.md §5). Довод — не скорость, а экосистема и
уже спроектированная архитектура: undo по origins (§5.3),
XmlText для абзацев Write, awareness и протокол, готовые
серверы, будущий веб-просмотрщик на Yjs. Слабое место — нет
move: notes.md 5.8 предполагает
«Y.Array с переупорядочиванием через move» для порядка
страниц, а Draw/Slides двигают фигуры между группами. Решение без
второго CRDT: порядок — дробные индексы (строковый ключ
порядка в Map, как в Figma и, по памяти, в Excalidraw);
перенос узла между родителями — поле parent с
детерминированным разрешением циклов по алгоритму Kleppmann et al. («A
highly-available move operation for replicated trees», 2021) — ≈1
чел.-мес. в meridian-history. Loro держать запасным: пилот
в I21 только если дерево Notes/Draw на Yrs окажется тяжёлым; два CRDT в
одном продукте не вводить. Automerge и diamond-types — референсы.
Сервер: форк y-sweet, идеи Hocuspocus. y-sweet (MIT,
Rust, 1018★) — сервер протокола Yjs с хранением снимков и обновлений в
S3 или на диске, токенами доступа к документу и ядром без ввода-вывода
(y-sweet-core), то есть ровно CRDT-часть
cloud-service из 03-architecture.md §5.7.
Дописываем: роли commenter/viewer с проверкой
затронутых корневых типов в каждом Update, CBOR-заголовки
кадров, журнал doc_updates в PostgreSQL,
Rebase для базовых снимков Sheets, горизонтальное
масштабирование через Redis pub/sub (идея расширения Redis из
Hocuspocus). Hocuspocus (MIT, Node.js, 2611★) — референс хуков
onAuthenticate, onLoadDocument,
onStoreDocument с отложенной записью, onChange
и webhooks; код не берём (другой язык). Риск: последний коммит y-sweet —
2025-12-04 (развитие замедлилось), поэтому именно форк, а не
зависимость. Экономия ≈3,5 чел.-мес.
3.6 Собственный код владельца: FlyType и voice-agent
FlyType (~/Mac1amoros/FlyType, MIT ©
2026 FlyType, выпуск v1.18.1). Это гибрид: нативные клиенты (macOS на
Swift с WhisperKit офлайн; Windows с системным распознаванием офлайн;
Android, iOS), бэкенд на Go (шлюз WSS/REST, STT-сайдкар Whisper/Groq,
«полировка» с LLM), Hub на Next.js. Rust-часть небольшая, но это эталон
правил:
| Крейт / файл | Объём | Что внутри | Что переносим в MOffice |
|---|---|---|---|
crates/flytype-core/src/polish/* |
≈1,5 тыс. строк | детерминированная цепочка без LLM: эхо STT → «галлюцинации» Whisper на тишине → сниппеты → словарь → слова-паразиты → самоисправления («нет, то есть…») → форматирование → пунктуация по паузам сегментов → пунктуация с учётом текста до и после курсора → исправление опечаток | целиком, в крейт meridian-dictation (fork в
монорепозиторий) |
crates/flytype-core/src/engine/{mod,router}.rs |
241 строка | трейт DictationEngine,
resolve_engine(RouterInput{mode, online, authenticated, subscription_ok})
→ облако или локально |
целиком; subscription_ok = функция редакции из MOffice
License |
crates/flytype-core/src/audio/mod.rs |
83 строки | PCM S16LE, 16 кГц, моно; проверка чанков | целиком |
crates/flytype-protocol/src/{context,messages,error}.rs |
≈370 строк | DictationContext: AppContext (приложение,
категория), TextboxContext (до курсора, выделение, после),
WritingStyle (Casual/Formal/Code/Excited), словарь;
сообщения REST/WSS |
контекст — из модели документа; протокол — для онлайн-диктовки через MOffice Cloud (фаза 6) |
crates/flytype-ffi |
201 строка | C ABI (staticlib) для Swift | не нужен (cxx-qt) |
punct-sidecar (Python) |
— | пунктуация моделью Silero TE через
torch.hub |
не переносить: модели Silero — CC BY-NC-SA 4.0
(проверено 2026-10-04 по LICENSE snakers4/silero-models),
класс 3 |
Как это ложится на MOffice: (1) Write/Notes/Mail →
«Диктовка» — TextboxContext заполняется точно из
модели документа (абзац до и после каретки, выделение), а не через
Accessibility, как в FlyType; категория — write/notes/ mail; стиль —
Formal для писем и официальных документов. (2) Офлайн на трёх
ОС — whisper.cpp (MIT) через whisper-rs
(Unlicense, 1,4 млн загрузок) и модели Whisper (MIT); на macOS —
WhisperKit (MIT, уже в FlyType). Пунктуацию Whisper ставит сам, правила
polish/punctuation.rs и pause.rs доводят её —
замена Silero не нужна. (3) Расшифровка аудио в Notes —
запись → Whisper с таймкодами сегментов → абзацы по паузам
(pause.rs) → страница с аудиовложением и привязкой «время →
абзац» (как аудиозаметки OneNote); диаризация — P2. (4)
Онлайн — сервис диктовки в MOffice Cloud по протоколу
flytype-protocol либо вход в аккаунт FlyType — решение
владельца (бизнес). Экономия ≈4 чел.-мес.: ≈2 — правила и тесты,
отлаженные на реальной диктовке RU/EN, ≈2 — готовая схема сервиса и
протокола.
voice-agent (~/Mac1amoros/voice-agent,
Python, ≈6,5 тыс. строк, файла лицензии нет — собственный код
владельца). Код не переносим (другой язык, зависимости на облачные
сервисы), берём проверенные идеи для MOffice Assist (фаза 7) и Mail:
- Журнал внешних действий
(
effect_outbox.py): у каждого внешнего сервиса — свой идемпотентный адаптер; после неоднозначного сетевого сбоя действие получает статусunknownи сверяется, а не повторяется вслепую. Применить к очереди отправки Mail (mail.md5.9 повторяет отправку при сетевой ошибке — риск дублей; перед повтором искать письмо в «Отправленных» поMessage-ID) и к действиям Assist (письмо, событие). - Одно ядро для GUI, CLI и MCP с общими схемами инструментов и правами; ролевые пресеты задают максимальный набор возможностей → профили Assist поверх прав MOffice Script (§9.4).
- Бюджеты токенов и денег (ставки, суточный лимит) → политика Assist для организаций.
- Отмена задачи с отбрасыванием поздних событий, потоковый ответ как черновик, оценка результата пользователем («да / нет с причиной / пропустить») → метрика качества Assist.
- Голосовой цикл: запись → STT → ответ → озвучивание с перебиванием (energy-VAD, pre-roll), учёт фактически прослушанной части ответа → голосовой режим Assist (P2).
- MCP-мост (13 инструментов через loopback API, без секретов; ожидание
задачи с таймаутом без отмены) → предложение: MOffice как MCP-сервер для
внешних агентов (документы, почта, календарь) в рамках прав (фаза 7). Не
переносить:
edge-tts(по памяти LGPL-3.0 — не проверено; к тому же неофициальный сервис Microsoft), распознавание Google черезSpeechRecognition(неофициальный ключ).
4. Класс 2 — решения владельца с альтернативами
| № | Компонент (лицензия) | Зачем был бы нужен | Альтернативы класса 0–1 | Рекомендация |
|---|---|---|---|---|
| 1 | onenote_parser / onenote.rs (MPL-2.0) |
импорт .one/.onetoc2 в Notes (P1, R*) |
(а) свой парсер по [MS-ONESTORE]/[MS-ONE] — 6–7 чел.-мес.; (б)
импорт облачных книжек через Microsoft Graph (страницы как HTML; нужен
OAuth и сеть); (в) перенести .one на 3.x |
Одобрить как немодифицированную зависимость в песочном процессе кодеков: копилефт MPL — пофайловый, наш код не затрагивает; обязанности — сообщить, где взять исходники MPL-файлов, и публиковать правки только этих файлов (вносить их в upstream). При отказе — (б) в 3.0 и (а) в 3.x |
| 2 | cssparser, selectors (MPL-2.0) —
транзитивно через ammonia 4.x, css-inline,
lol_html |
санитайзер HTML писем, перенос <style> в
inline |
свой фильтр inline-CSS поверх html5ever (≈0,5
чел.-мес.); ammonia 3.x без cssparser |
Не брать, писать своё: объём мал, а санитайзер — граница безопасности, которую лучше владеть целиком |
| 3 | Thunderbird ISPDB (MPL-2.0, данные) | автонастройка почтовых аккаунтов | своя база ≈40 провайдеров по документации провайдеров; DNS SRV (RFC
6186); autoconfig.<домен>; providers.xml
K-9 (Apache-2.0 — не проверено) |
Данные не встраивать; онлайн-запрос к
autoconfig.thunderbird.net — только по согласию
пользователя, записью в реестре (это обращение к сервису, а не
распространение данных) |
| 4 | python-build-standalone (MPL-2.0: скрипты и патчи CPython) | сборка CPython для Python-плагина (03-architecture.md
§9.8) |
свои скрипты сборки CPython из исходников PSF; на Windows — официальный embeddable-архив python.org (PSF) | Своя сборка (≈0,5 чел.-мес.); PBS — только как пример конфигурации, патчи не копировать |
| 5 | Qt WebEngine (LGPL-3.0/GPL-3.0 + Chromium) | «полный рендер» HTML-писем по кнопке (mail.md 5.6) |
собственный рендер (основной путь) + «Открыть во внешнем браузере» | Решить вместе с вопросом Qt в фазе 0; до решения — внешний браузер |
| 6 | libpff/pffexport (LGPL-3.0) |
эталон сверки PST в CI и запасной FFI (mail.md 6.3,
9) |
outlook-pst (MIT); эталон — выгрузка из настоящего Outlook на ферме
Windows VM (08-roadmap.md 1.3) |
FFI убрать; для CI достаточно Outlook-эталонов, решение по
pffexport не требуется |
| 7 | sequoia-openpgp, sequoia-autocrypt
(LGPL-2.0-or-later) |
OpenPGP (mail.md 2.2) |
rPGP (pgp, MIT OR Apache-2.0) |
Заменить в mail.md; решение не требуется |
| 8 | fast-dav-rs (LGPL-3.0), ical.js (MPL-2.0), libical
(LGPL/MPL) |
CalDAV, iCalendar | libdav (ISC), calcard (Apache-2.0 OR MIT) | Не нужны |
| 9 | Delta Chat core (MPL-2.0) | образец Autocrypt поверх rPGP | спецификация Autocrypt 1.1 | Только чтение как референс, код не копировать |
5. Запрещено (класс 3) и замены
| Проект | Лицензия | Где возникает соблазн | Замена |
|---|---|---|---|
sieve-rs (Stalwart) |
AGPL-3.0-only (проверено 2026-10-04) | перевод правил Mail в Sieve (mail.md 5.11) |
свой генератор и разборщик подмножества RFC 5228 (≈0,5 чел.-мес.) |
Stalwart mail-server, в т.ч. через email-testing-server
из pimalaya |
AGPL-3.0 / собственная | тестовый IMAP/SMTP/JMAP-сервер | в CI — только внешний Docker-контейнер как «чёрный ящик» без линковки (нужна оговорка в политике, раздел 7); Dovecot и Radicale — так же |
minicaldav |
GPL-3.0-or-later | CalDAV-клиент | libdav (ISC) |
evalexpr |
AGPL-3.0-only (проверено 2026-10-04) | выражения Forms и правил | формулы meridian-calc; datalogic-rs (Apache-2.0);
cel-interpreter (MIT) |
| Модели Silero (TE, STT, TTS кроме базовых CIS-TTS) | CC BY-NC-SA 4.0 / CC BY-NC (проверено 2026-10-04) | пунктуация диктовки (punct-sidecar FlyType) |
Whisper (MIT) + правила flytype-core |
SurveyJS Creator, Dashboard (survey-analytics), PDF
Generator (survey-pdf) |
коммерческая EULA Devsoft Baltic | конструктор, сводки, PDF-формы | свой конструктор на QML, сводка на MOffice Chart, PDF AcroForm через кодек PDF |
| formbricks, ohmyform | AGPL-3.0 (+ CC BY-NC у formbricks) | веб-опросы | Forms + MOffice Cloud |
| Joplin, Logseq, AppFlowy | AGPL-3.0 | заметки | только сверка UX как пользователь |
| Rnote, Xournal++ | GPL-3.0, GPL-2.0 | перо и рукописный холст | ink-stroke-modeler (порт), perfect-freehand |
| tldraw | собственная лицензия с водяным знаком | бесконечный холст | Excalidraw (MIT) как референс |
| Meilisearch | BUSL-1.1 + MIT | поиск | tantivy |
| Rubberduck VBA | GPL-3.0 | парсер VBA | [MS-VBAL] + грамматика VB6 (MIT) + ViperMonkey (BSD-2-Clause) |
libnotmuch (фича notmuch в email-lib) |
GPL-3.0 (по памяти — не проверено) | индекс Maildir | фичу не включать; индекс — tantivy |
| Словари OpenCorpora (через rsmorphy) | CC BY-SA (по памяти — не проверено) | морфология русского | стемминг Snowball (rust-stemmers) |
6. Что переносим кодом
Правило атрибуции (12-license-policy.md): MIT/BSD/ISC —
копирайт и текст лицензии в «О программе → Лицензии» и NOTICE;
Apache-2.0 — то же плюс перенос upstream-файла NOTICE (если есть) и
пометка изменений в изменённых файлах; при порте — заголовок «основано
на <проект>, © <автор>,
| Источник (лицензия) | Что берём | Куда в MOffice | Способ | NOTICE / заголовок |
|---|---|---|---|---|
| outlook-pst, compressed-rtf (MIT) | крейты crates/pst, crates/compressed-rtf
целиком |
codecs/mail/pst, codecs/mail/msg |
adopt (версия закреплена) | © Microsoft Corporation, MIT |
| mail-parser, mail-builder (Apache-2.0 OR MIT) | разбор MIME, mbox/Maildir, thread_name(); сборка
писем |
codecs/mail/mime, mail-core |
adopt | © Stalwart Labs LLC, MIT |
| mail-auth, mail-send (Apache-2.0 OR MIT) | проверка DKIM/ARC/SPF/DMARC; запасной SMTP | mail-core::auth |
adopt | © Stalwart Labs LLC, MIT |
| lettre (MIT) | SMTP-транспорт | mail-core::smtp |
adopt | © авторы lettre, MIT |
| imap-codec, imap-next (MIT OR Apache-2.0) | кодек и потоки протокола IMAP | mail-core::imap |
adopt | © авторы imap-codec, MIT |
| calcard (Apache-2.0 OR MIT), внутри — код bttf (Unlicense OR MIT) и rust-rrule (Apache-2.0 OR MIT) | iCalendar, vCard, RRULE, зоны | codecs/{ical,vcard}, pim-store |
adopt | © Stalwart Labs LLC; © Andrew Gallant; © Fredrik Meringdal, Ralph Bisschops — MIT |
| rust-rrule (MIT OR Apache-2.0) | тесты rrule/src/tests/*.rs |
корпус RRULE в tests/ |
port тестов | © Fredrik Meringdal и др., MIT |
| libdav (ISC) | клиент CalDAV/CardDAV, обнаружение RFC 6764 | mail-core::dav |
adopt | © Hugo Osvaldo Barrera, ISC |
email-lib autoconfig, oauth-lib,
pgp-lib (MIT) |
email/src/autoconfig/* (1039 строк); идеи loopback/PKCE
и WKD |
mail-core::{discover,oauth},
meridian-crypto::openpgp |
fork модуля / port идей | © soywod (Clément Douin), MIT |
rPGP pgp (MIT OR Apache-2.0) |
OpenPGP | meridian-crypto::openpgp |
adopt | © авторы rPGP, MIT |
RustCrypto cms, x509-cert,
pkcs12 (Apache-2.0 OR MIT) |
CMS, X.509, PKCS#12 | meridian-crypto::smime |
adopt | © RustCrypto Developers, MIT |
| html5ever, linkify, publicsuffix, unicode-security, hickory-resolver, oauth2 (MIT OR Apache-2.0) | разбор HTML, ссылки, домены, гомоглифы, DNS, OAuth | codecs/html, mail-core |
adopt | по каждому крейту, MIT |
| ink-stroke-modeler (Apache-2.0) | ink_stroke_modeler/** без тестов, ≈4,1 тыс. строк
C++ |
notes-model::ink (общий с Paint) |
port на Rust (старт — ink-stroke-modeler-rs, MIT OR Apache-2.0) | «основано на ink-stroke-modeler, © Google LLC, Apache-2.0» + текст Apache в NOTICE |
| perfect-freehand (MIT) | алгоритм getStroke (≈500 строк TS) |
scene::ink_outline |
port | © Stephen Ruiz Ltd, MIT |
| quick-xml, cab (MIT) | разбор XML ENEX; распаковка .onepkg |
codecs/{enex,onenote} |
adopt | MIT |
onenote.rs onenote_parser (MPL-2.0) — только
при одобрении |
крейт crates/parser без изменений |
codecs/onenote в песочном процессе |
adopt как есть | MPL-2.0: ссылка на исходники в «О программе»; правки — только upstream |
| tantivy, rust-stemmers, lindera, whatlang (MIT; MIT/BSD-3-Clause) | индекс, стемминг, CJK, язык | search |
adopt | MIT; для стеммеров — также BSD-3 Snowball |
| survey-library (MIT) | имена и семантика свойств схемы, грамматика выражений для импорта | forms-model::{schema,import_surveyjs} |
reference + port разбора выражений | © Devsoft Baltic OÜ, MIT |
| jsonschema (MIT) | проверка JSON | forms-model,
meridian-script::manifest |
adopt | MIT |
| QuickJS-ng (MIT), rquickjs (MIT) | движок JS и обёртки | meridian-script |
adopt; патч отладчика — в своём форке | © Fabrice Bellard, Charlie Gordon, Ben Noordhuis; © авторы rquickjs — MIT |
| oxc (MIT) | oxc_parser, oxc_semantic,
oxc_transformer, oxc_codegen,
oxc_isolated_declarations |
meridian-script::ts |
adopt | © авторы oxc, MIT |
| tree-sitter + грамматики TS/JS/Python + highlight (MIT) | разбор и подсветка | shell/editor |
adopt | MIT |
| wasmtime (Apache-2.0 WITH LLVM-exception), Extism (BSD-3-Clause) | рантайм и API плагинов | meridian-plugins |
adopt | Apache-2.0 + NOTICE; BSD-3 |
| PyO3 (MIT OR Apache-2.0) + CPython (PSF-2.0) | встроенный Python | meridian-python-host |
adopt; сборка CPython — своя | MIT; PSF License Agreement |
| ovba (MIT) | чтение vbaProject.bin |
codecs/ooxml/vba |
adopt + форк | © Tim Weis, MIT |
| oletools/olevba, ViperMonkey (BSD-2-Clause) | таблицы опасных ключевых слов; семантика функций VBA | codecs/ooxml/vba::scan,
script/vba-compat |
port | © Philippe Lagadec, BSD-2-Clause |
| grammars-v4 VisualBasic6 (MIT) | грамматика VB6 для сверки | script/vba-translator (тесты парсера) |
reference | © Ulrich Wolffgang (ProLeap), MIT |
| Yrs (MIT) | CRDT | meridian-history, meridian-sync |
adopt | MIT |
y-sweet, y-sweet-core (MIT) |
сервер протокола Yjs, хранение в S3/ФС, токены | services/cloud-service/sync |
fork | © Jamsocket (Drifting in Space), MIT |
| whisper-rs (Unlicense), whisper.cpp и модели Whisper (MIT), WhisperKit (MIT, macOS) | офлайн-распознавание | meridian-dictation::local |
adopt | MIT (whisper.cpp, OpenAI Whisper, argmax) |
FlyType flytype-core, flytype-protocol
(MIT, владелец) |
правила полировки, маршрутизатор, аудио, контекст | meridian-dictation |
fork в монорепозиторий | собственный код владельца — можно перелицензировать |
7. Предложения в библию и план
Лицензионные правки (обязательные):
docs/apps/mail.md2.2: OpenPGP — rPGP (pgp, MIT OR Apache-2.0) вместоsequoia-openpgp(LGPL-2.0-or-later); PGP/MIME, Autocrypt, WKD — свои поверх rPGP.docs/research/component-map.md, строка Mail: ammonia 4.x — не класс 1 (тянетcssparser/selectors, MPL-2.0); санитайзер — свой наhtml5ever. Заменитьicalendar+rruleна calcard, добавить imap-codec/imap-next (async-imap — запасной), libdav, RustCryptocms; строку «Форматы / PST» — outlook-pst (MIT, adopt) вместо «свой по [MS-PST]».docs/12-license-policy.md§6 «Модели ИИ»: явно записать Whisper (MIT) — разрешён, модели Silero (CC BY-NC / BY-NC-SA) — запрещены; добавить оговорку (решение владельца): сторонние серверы класса 2–3 (Stalwart, Dovecot) допустимы в CI только как внешние контейнеры без линковки и распространения.docs/12-license-policy.md§5:cargo denyпроверяет и транзитивные зависимости; MPL-2.0 — только черезexceptionsс записью в реестре (сразу поймаетcssparserи подобное).docs/apps/mail.md6.3 и 9: убрать запасной путь FFI кlibpff(LGPL-3.0); сверка PST — с выгрузкой настоящего Outlook на ферме Windows VM.
Технические правки: 6. 03-architecture.md §9.5: в
QuickJS-ng нет API отладчика и нет Intl. Добавить задачи:
патч отладчика в своём форке движка (1,5–2 чел.-мес., к Script API 1.0 в
релизе 1.6) и модуль meridian.intl на ICU4X (0,5
чел.-мес.). 7. 08-roadmap.md E1.9: «встроенное
swc-подмножество» заменить на oxc — как уже решено в
03-architecture.md §9.5. 8. 08-roadmap.md E7.5
и 03-architecture.md §9: основной путь нативных плагинов —
WASM (wasmtime + Extism) с лимитами и правами §9.4; C ABI — только для
подписанных Enterprise-модулей (ГОСТ). Экономия ≈2 чел.-мес. 9.
03-architecture.md §9.8: CPython собирать своими скриптами
из исходников PSF (python-build-standalone — MPL-2.0), на Windows —
официальный embeddable-архив. 10. docs/apps/notes.md 5.8 и
03-architecture.md §5.1: в Yrs нет move.
Порядок страниц и блоков — дробные индексы в Map; перенос
узлов дерева — алгоритм Kleppmann et al. (2021) в
meridian-history (≈1 чел.-мес., добавить в E6.1); Loro —
запасной пилот в I21. 11. 08-roadmap.md E5.1 говорит «FTS5
с ICU-токенизатором», а mail.md 5.10 и
notes.md 5.5 — tantivy. Предложение: один движок tantivy
для Hub/Mail/Notes (токенизатор meridian_ru_en на
Snowball), FTS5 — только префиксные подсказки имён и адресов. 12.
docs/apps/notes.md 5.3: шаги 1 (One-Euro) и 6 (линейная
экстраполяция) заменить моделятором ink-stroke-modeler с
Kalman-предсказанием; контур — алгоритм perfect-freehand; модуль общий с
Paint. 13. docs/apps/mail.md 2.1: порядок автонастройки —
своя база провайдеров → домен по https → DNS SRV (RFC 6186, 8314) →
Autodiscover v2 → MX → ISPDB онлайн только по согласию → ручной ввод.
14. docs/apps/mail.md 5.9: для неоднозначных сбоев отправки
— статус unknown и сверка по Message-ID в
«Отправленных» перед повтором (идея effect_outbox.py из
voice-agent). 15. docs/apps/mail.md 2.1 и 6.2: JMAP (P2)
становится дешёвым — jmap-client (Apache-2.0 OR MIT), ≈1
чел.-мес. 16. docs/apps/forms.md 2.2: закрепить, что
условия и вычисления — формулы meridian-calc; добавить импорт JSON
SurveyJS (P1); формы настроек расширений
(03-architecture.md §9.3) — подмножество «JSON Schema +
uiSchema». 17. 00-foundation.md §2.2: добавить подмодуль
MOffice Dictation (в составе Lingo или Assist): правила
FlyType, Whisper офлайн на трёх ОС, онлайн через Cloud; функции
«Диктовка» в Write/Notes/Mail и «Расшифровать аудио» в Notes. 18.
08-roadmap.md: снизить оценки — E5.6 (кодеки PIM) на ≈12,5
чел.-мес. (outlook-pst, calcard, mail-parser), E5.3 (протоколы Mail) на
≈9 (imap-codec, libdav, mail-auth, lettre, автонастройка), E6.2 на ≈3,5
(y-sweet); риск «собственный парсер PST» в 3.5 понизить с «средней» до
«низкой» вероятности. 19. Фаза 7 (Assist): MCP-сервер MOffice для
внешних агентов в рамках прав MOffice Script, бюджеты токенов, журнал
внешних действий и оценка результатов — по опыту voice-agent.
8. Непроверенное
- imap-codec/imap-next: наличие CONDSTORE/QRESYNC,
COMPRESS=DEFLATE,NOTIFY— по коду не проверялось; async-imap — поддержка QRESYNC. - outlook-pst: качество на корпусе из 200 реальных PST, скорость на файлах 5 ГБ, OST — оценено по README и структуре кода, не запускалось.
- calcard: round-trip неизвестных свойств
X-, vCard 2.1 с quoted-printable; libdav: лицензия DNS-крейтаdomain, работа с CalDAV Google и iCloud. - Бенчмарки CRDT — по старым версиям (loro 0.10, automerge 2.1, ywasm 0.9); для Loro 1.x, Automerge 3 и diamond-types свежих данных нет; нужен замер на прототипе I21.
- y-sweet: активность после 2025-12-04 и поддержка ролей «только чтение» — не проверены.
- QuickJS-ng: готовые форки с отладчиком не искались; наличие отладки
в Boa не проверено; запрет
evalпри загрузке только байткода — проверить на прототипе. - tree-sitter-typescript 0.23.2 и ядро tree-sitter 0.27 — совместимость ABI не проверена.
- Extism и wasmtime: параметры манифеста лимитов (память, таймаут, хосты, пути) описаны по документации, не по коду.
- SurveyJS: таблица соответствия типов и грамматика выражений — по документации, репозиторий не клонировался.
- Excalidraw и дробные индексы, схема шифрования
<en-crypt>в ENEX — по памяти и открытым описаниям. - Лицензии по памяти, без проверки в этой сессии: whisper.cpp (MIT),
sherpa-onnx (Apache-2.0), edge-tts (LGPL-3.0), libnotmuch (GPL-3.0),
словари OpenCorpora (CC BY-SA),
providers.xmlK-9 Mail (Apache-2.0); условия использованияautoconfig.thunderbird.netсторонними клиентами. - rPGP: независимые аудиты безопасности не проверялись; RustCrypto
cms0.3 — pre-release, стабильность API. - lettre: BDAT/CHUNKING и DSN; ovba: защищённые VBA-проекты и p-code.
- pimalaya: отдельные проекты CalDAV/CardDAV (вне
core) не изучались. - Все оценки экономии в чел.-мес. — экспертные (объём кода источника и
состав команды), не измерения;
08-roadmap.mdне содержит оценок по эпикам.