v0.2.0
Added
-
New package: Surge XT, the free open-source hybrid synthesizer from
the Surge Synth Team. Opt-in,
Windows + macOS, standard REAPER installations only. RABBIT runs the
vendor installer (Inno Setup on Windows, productbuild-wrapped.pkg
on macOS) under elevation so the VST3, CLAP, AU (macOS) and standalone
formats land system-wide for REAPER and other DAWs to pick up. Tracks
the rolling nightly channel at
surge-synthesizer/surgereleases tagNightlyrather than the
stable 1.3.4 release (2024-08-11) — the project effectively ships
through nightlies now. Version detection layers aNIGHTLY-<date>-<sha>
token from the receipt over a Medium-confidence semver fallback read
from the vendor-installed VST3 bundle's file metadata. -
macOS elevation primitive in
rabbit-platform::elevation: wraps the
elevated command inosascript -e 'do shell script "…" with administrator privileges'so the system raises its native
AuthorizationServices dialog. First (and currently only) consumer is
the Surge XTMountDiskImageAndRunPkgInstallerrunner. -
New
PlannedExecutionKind::MountDiskImageAndRunPkgInstallerrunner:
mounts a.dmg, locates the inner.pkgvia a filename-suffix glob
matched against the mounted volume root, invokes/usr/sbin/installer -pkg <path> -target /under admin authorization, and detaches the
image whether the install succeeded or failed. -
Automatic ReaPack script-action preservation across OSARA key-map
replacement. Replacingreaper-kb.iniwithOSARA.ReaperKeyMap—
the default OSARA-recommended flow — drops everySCRline ReaPack
had registered through REAPER'sAddRemoveReaScriptAPI, so installed
ReaScripts disappear from REAPER's actions list until the user runs
"ReaPack: Synchronize packages" inside REAPER (or re-installs every
package). The unattended replacement path now reads the existing
reaper-kb.inifirst, captures all of itsSCRrecords, lets the
OSARA key map overwrite the file as before, then re-appends the
preserved lines using the written file's newline convention. Any
userKEYbinding that targeted one of those scripts keeps working —
REAPER derives the_RS<hex>action command ID deterministically
from the script path, so the re-appended SCR lines bind to the same
IDs the user already has in their key map. No opt-out: the
preservation always runs when the OSARA key map is replaced. -
Live per-package progress reporting on the wizard's Installation
progress page. The previous progress page set the gauge to 10 % when
install kicked off, then jumped straight to 100 % at the end —
everything in between was a black box even though packages like
REAPER's macOS dmg take ~30 MB of network transfer per install.
The setup pipeline now emits structuredProgressEvents
(DownloadStarted/DownloadProgress/DownloadCompleted/
InstallStarted/InstallCompleted/ConfigurationStarted/
ConfigurationCompleted) through an optionalProgressReporter
threaded down fromexecute_setup_operation_with_progressinto
download_artifacts_with_progressand
install_cached_artifacts_with_progress. The artifact downloader
swappedstd::io::copyfor a chunked read/write loop that emits a
byte-progress event every ~256 KiB or ~200 ms (whichever is rarer),
so the gauge moves smoothly during the REAPER dmg pull instead of
stalling. The wxdragon wizard forwards each event to the UI thread
viawxdragon::call_after: the gauge advances by a per-phase
fraction (weighted by completed downloads/installs plus the
in-flight byte fraction), the status label updates to "Downloading
REAPER… 12.4 MB / 30.0 MB", and a running log of completed
transitions appends to the progress details TextCtrl (screen
readers announce each new line as it lands). The no-progress
entry points (execute_setup_operation,
execute_resolved_setup_operation,download_artifacts,
install_cached_artifacts,execute_wizard_install) stay on
their existing signatures and delegate viaProgressReporter::noop,
so the CLI and existing tests are unaffected.
Fixed
-
Wizard startup detection no longer SHA-256-hashes every receipted
install file.verify_package_receiptused to verify each entry in
a package's receipt by hashing the on-disk file, which on Windows
meant 14 seconds of stalled UI just for FFmpeg (~200 MB of DLLs)
and ~1 second for REAPER on every wizard launch — plus another
round of the same after every install via the post-install rescan
hook. The receipt verifier now checks file existence and size only;
size mismatch alone catches every realistic regression the detection
layer cares about (partial overwrites, truncated files), and the
receipt's own stamped version is what gets shown either way.
Recording hashes during install is unchanged. -
FFmpeg version detection no longer freezes the wizard for tens of
seconds on Windows when an FFmpeg install is present. Probe 2
previously calledffmpeg.exe -versionviastd::process::Command
on the UI thread, which on Windows blocks for the entire AV scan of
FFmpeg's dozens of DLL dependencies — easily 20-30 s per launch on
a default-configured machine, and the same stall ran on the
post-install rescan after installing FFmpeg too. Probe 2 now scans
theffmpeg.exebinary for the contiguousshow_bannerformat
string anchored on the uniquethe FFmpeg developersliteral, and
pulls<VERSION>out between the trailingversiontoken and the
nextCopyrightmarker. That matches both the upstream FFmpeg
banner (%s version <VERSION>, Copyright (c) …) and the Gyan.dev
full-builds variant that drops the comma and pads with spaces
(%s version 8.1.1-full_build-www.gyan.dev Copyright (c) …),
so externally-installed Gyan FFmpegs now report8.1.1instead of
the libavformat-major fallback's8.0.0. SameHighconfidence as
before; the matching detector id changed fromffmpeg-cli-version
toffmpeg-binary-version-string.