VFLIN
ВойтиСкачать

docs · docs/90-meta/INSTALLER.md · перевод от 2026-09-11 · с английской ревизии c096151ca9dc

Установка и первый запуск

один неподписанный установщик для Windows, что куда ставится, первый запуск, который скачивает ядро, SmartScreen

Что это. Установщик Tauri NSIS, без подписи (решение владельца — docs/70-market/PROCUREMENT_TO_SHIP.md), который ставит GUI (VFlin Antik.exe) и рядом с ним три sidecar-программы: демон vflind.exe, CLI vflin.exe, MCP-сервер vflin-mcp.exe. Ядра в установщике нет: оболочка скачивает его при первом запуске из источника пакетов, записанного в install-манифест сборки (A87: core.ensure). Все числа ниже измерены на этой машине 2026-09-05; доказательство (§5) выполнено на чистом VFLIN_HOME.

1. Собрать с нуля

# prerequisites: Rust (MSVC toolchain), Node 24 + pnpm, the NSIS bundler Tauri fetches on first use
cd ui && pnpm install
# the source the installed product will fetch the core from; a CDN placeholder when unset
export VFLIN_PACKAGE_SOURCE="https://cdn.example/core"        # or file:///D:/vflin-core-pkg for a local proof
pnpm tauri build

tauri build запускает beforeBuildCommandpnpm build && node scripts/build-sidecars.mjs, — который собирает веб-бандл, затем собирает три sidecar-программы в release из корневого workspace (с учётом CARGO_TARGET_DIR, если он задан, иначе в корневой target/), копирует их в ui/src-tauri/binaries/<name>-<host triple>.exe (так Tauri называет файлы для bundle.externalBin) и пишет ui/src-tauri/resources/install.json ({"packageSource": …}). Обе папки внесены в gitignore: бинарники — это артефакты, а манифест может нести путь конкретной машины. Затем собирается крейт приложения (свой отдельный workspace в ui/src-tauri, свой target/), и NSIS упаковывает ui/src-tauri/target/release/bundle/nsis/VFlin Antik_0.1.0_x64-setup.exe.

Размеры (2026-09-05, эта машина): sidecar-программы vflind.exe 14.2 MB · vflin.exe 2.9 MB · vflin-mcp.exe 2.4 MB (19.5 MB); установщик VFlin Antik_0.1.0_x64-setup.exe 7.4 MB (установщик от 2026-07-26, только с GUI, весил 2.8 MB); tauri build rc=0 за 321 s вместе с веб-бандлом, шагом sidecar-программ и крейтом приложения в release. Ядра внутри нет: первый запуск скачивает пакет 127.7 MB (A87) из источника, записанного в манифест.

2. Что куда ставится

путь
приложение и sidecar-программы (установка для текущего пользователя, NSIS currentUser) %LOCALAPPDATA%\VFlin Antik\VFlin Antik.exe, vflind.exe, vflin.exe, vflin-mcp.exe, resources\install.json
папка данных — хранилище демона, файл обнаружения, журналы, установленное ядро ~/.vflin (%USERPROFILE%\.vflin) или $VFLIN_HOME, если он задан
файл обнаружения, который читает каждый клиент ~/.vflin/local-api.json{port, token, pid, apiVersion}, доступен только пользователю
журнал демона · stdout/stderr sidecar-программы ~/.vflin/daemon.log · ~/.vflin/logs/vflind.out.log
ядро после установки ~/.vflin/core/<vflin-core-…>/chrome.exe + core-manifest.json; на него указывает ~/.vflin/core/current.json

Почему ~/.vflin, а не %LOCALAPPDATA%\VFlin. Бриф оставил корень за тем, что демон уже пишет. Демон, оболочка, CLI (vflin-client) и MCP-сервер — все определяют $VFLIN_HOME, а без него ~/.vflin; %LOCALAPPDATA%\VFlin не читает никто, а живое хранилище оператора — 121 профиль — лежит в ~/.vflin. Сменить значение по умолчанию значило бы мигрировать это хранилище, а это решение, а не умолчание установщика. Один корень, четыре читателя, без изменений. (docs/30-core/CORE_PACKAGE.md в первом черновике указывал %LOCALAPPDATA%; исправлено.)

3. Что делает первый запуск

  1. Оболочка запускает демон (daemon_ensure, команда Tauri на Rust): она спрашивает у демона из файла обнаружения system/health — устаревший файл, чей автор уже завершился, ничего не отвечает и не считается, — а если никто не ответил, запускает vflind.exe из папки рядом с приложением, отсоединённым (своя группа процессов, без окна консоли, VFLIN_HOME передаётся дальше, stdout/stderr — в ~/.vflin/logs/vflind.out.log), и до 20 s ждёт health, прежде чем интерфейс прочитает файл обнаружения. Две оболочки, одновременно пришедшие к одному выводу, запускают не больше одного демона: демон отказывается стартовать на хранилище, которое уже обслуживает другой демон (он спрашивает у того health с токеном из файла, пишет в журнал “another vflind already serves this store” и завершается с кодом 0). Эта проверка стоит перед стартовыми проходами сверки намеренно: эти проходы переводят каждый профиль из RUNNING в DIRTY в предположении, что ни один демон не работает, так что второй экземпляр объявил бы открытые браузеры первого остановленными.
  2. Оболочка устанавливает ядро (core_bootstrap): читает resources/install.json, вызывает core.ensure {source}, опрашивает core.status каждые 500 ms и на каждое изменение отправляет Tauri-событие core-progress с задачей (stage, bytesDone, bytesTotal, state); возвращает итоговую задачу. На машине, где ядро уже есть, это пустая операция за миллисекунды (noop:true). После успешной установки демон сохраняет сработавший источник как packageSource в ~/.vflin/core.json — поэтому следующему vflin core ensure аргумент не нужен, а установщик никогда не пишет файлы демона. Экран первого запуска, который показывает это событие, — работа дизайна (G40/дальше); метод и событие — здесь.
  3. Закрытие окна не останавливает демон. В нём живут браузеры оператора, а упорядоченный выход демона закрывает и запечатывает каждый из них (A86). Остановка — явная: daemon_stop_all в оболочке → system.shutdown в Local API (vflin system shutdown в CLI, vflin_system_shutdown для агента) — путь прощания, где ответ называет, сколько ядер он закрывает. У отсоединённого демона нет консоли, куда можно послать Ctrl-C, поэтому это метод API, а не сигнал.
  4. После перезагрузки демон не запущен (автозапуск не регистрируется — см. §6); следующий запуск приложения снова запускает его, за секунды, и ядро уже на месте. Перезагрузка после установки не нужна.

4. Что пользователь видит при установке (без подписи)

Windows SmartScreen: «Система Windows защитила ваш компьютер» (“Windows protected your PC” в английской Windows) без имени издателя. Нажмите Подробнее → Выполнить в любом случае (More info → Run anyway). Это известная цена выпуска без сертификата подписи кода (PROCUREMENT_TO_SHIP.md §3: сертификат тоже не убирает предупреждение сразу; убирает его репутация). Некоторые антивирусы помечают неподписанные установщики при первой встрече; sha256 установщика опубликован рядом с ним, чтобы скачанный файл можно было проверить вручную.

5. Доказательство — чистое хранилище, установщик, первый запуск

Измерено 2026-09-05 скриптом a88_proof.py: установщик запущен в тихом режиме (/S), УСТАНОВЛЕННОЕ приложение запущено с VFLIN_HOME, указывающим на мою пустую папку (~/.vflin владельца не тронут), источник в install-манифесте — пакет A87 (file:///D:/vflin-a87-pkg-xz).

шаг результат
установщик /S rc=0, 4.0 s, VFlin Antik.exe 11.0 MB, vflind.exe 14.2 MB, vflin.exe 2.9 MB, vflin-mcp.exe 2.4 MB
приложение запущено → демон поднялся сам да, 3.8 s, pid демона 60892
демон — это УСТАНОВЛЕННАЯ sidecar-программа %USERPROFILE%\AppData\Local\VFlin Antik\vflind.exe
core.ensure запущен приложением по install.json installed=True, activeSource=package, задача завершена за 10.1 s
sha256 установленного chrome.dll == A87 d2996cbb…2346, совпадает
packageSource сохранён демоном file:///D:/vflin-a87-pkg-xz
первый профиль запущен (с окном) из УСТАНОВЛЕННОГО ядра start 200 за 6.7 s; исполняемый файл в ~/core/vflin-core-…
vflin system shutdown принято; демон завершился за 24.8 s; shutdown: closed 1 of 1 core(s) gracefully, 1 sealed to LOCAL_CACHED, in 24.0s; chrome left 0

Перезагрузка не понадобилась ни разу; приложение само запустило демон, демон сам установил ядро, и первый профиль запустился из установленного ядра с тем же хэшем chrome.dll, который A87 измерил в трёх местах.

6. Чего это не делает (намеренно или пока)

  • Нет автозапуска. Демон стартует, когда стартует приложение. Запуск при входе в систему (Task Scheduler / ключ Run) позволил бы браузерам пережить и закрытие приложения, И повторный вход пользователя — но это запись автозапуска, которую установщик вносит в сеанс пользователя, и это отдельное решение (строка 2 ALPHA_PLAN его перечисляет; здесь оно не принято).
  • Нет подписи, нет обновлений. ALPHA_PLAN, строка 10, и закупки.
  • local-unlock.json не входит в сборку — это локальный фактор разработчика, он остаётся файлом, который создаёт оператор; check-no-secrets проверяет дерево.
  • CLI и MCP-сервер установлены, но не добавлены в PATH: полный путь — %LOCALAPPDATA%\VFlin Antik\vflin.exe; mcpServers.command MCP-клиента указывает на …\vflin-mcp.exe (MCP_SKILL_PACK.md). Добавить папку в PATH пользователя — одна строка NSIS-хука, здесь не написанная.