import_pst_core takes &AppHandle/&dyn Store directly instead of the
State<AppState> extractor, so the startup auto-sync pass (lib.rs) can
run the same import logic without going through a Tauri command.
Backing fields for remembering the imported .pst path across sessions
and an opt-in startup auto-resync (T6.2). #[serde(default)] so an
existing settings.json without these keys still deserializes.
expand_rrule reused dtstart's raw UTC time-of-day for every occurrence,
so a weekly meeting spanning a DST transition (e.g. created in winter
CST, recurring into summer CDT) drifted an hour once displayed in the
machine's local timezone.
Rewrites occurrence generation on chrono's Local/NaiveDate (already a
transitive dependency via sqlx, now promoted to direct) instead of
hand-rolled epoch-day arithmetic: each occurrence keeps dtstart's local
wall-clock hour/minute, re-resolving the UTC offset per occurrence date
so DST is applied correctly for that specific day. civil_from_days/
weekday_from_epoch_day/is_leap_year/days_in_month are no longer needed
(chrono's NaiveDate replaces them) and are removed.
RRULE was previously ignored entirely, so a recurring meeting only ever
stored its first occurrence — invisible to any later date filter/lookup.
Adds RRULE parsing + occurrence expansion (DAILY/WEEKLY/MONTHLY/YEARLY,
INTERVAL/COUNT/UNTIL/BYDAY/BYMONTHDAY/BYMONTH) covering every pattern
found in a real 7.2GB mailbox (ADR-0008), each occurrence stored as its
own row keyed by "{uid}@{ymd}" so re-import dedup still applies.
Also fixes a real parser bug found via that mailbox: this libpst build
joins multi-value BYDAY with `;` instead of RFC 5545's `,`
(BYDAY=MO;TU;WE;TH;FR), which previously made RRULE parsing bail out
silently for any event with more than one weekday.
Indefinite rules (no COUNT/UNTIL — only YEARLY holidays in practice) are
capped at 10 years/500 occurrences; ponytail-flagged as the ceiling to
raise if a real series needs more.
readpst writes some failure messages to stdout rather than stderr, so a
failing run with empty stderr surfaced as a blank "parse failed: " error
with no diagnostic content.
Tauri commands reject with a {kind, message} object, not a native Error,
so `e instanceof Error ? e.message : String(e)` always fell through to
String(e) -> "[object Object]", hiding the actual readpst failure reason.
keyring 3.x feature-gates its OS backends OFF by default, so with no feature the
credential store fell back to a mock where set/get don't share state: every
password write appeared to succeed but read back empty, so no Basic auth was
sent and WebDAV/Nextcloud auth always 401'd. windows-native pulls the real
Windows Credential Manager. Also affected MCP/hosted-AI keys + OAuth tokens.
Provider-aware Server URL placeholder/hint (Nextcloud/ownCloud: enter just the
server URL); Test in edit mode passes the target id so the backend reuses the
stored credential.
For nextcloud/owncloud, WebDavTarget now derives the canonical
…/remote.php/dav/files/<user>/ path from the entered server URL (origin only, so
a pasted full path normalizes too); other providers use the URL verbatim.
test_sync_target also reuses the stored password when editing an existing
webdav target (unless a new one is typed), so Test works after a URL fix without
re-entering the password. Fixes the confusing 'bare host connects, full URL
fails' behavior (the former was a 404 false-positive, the latter a blank-secret
401).
Each webdav target gets an Edit button that loads it into the form; save routes
to update_sync_target. Password left blank keeps the stored one; kind is locked
during edit. Fixes not being able to correct a mistyped Server URL.
row_to_info now returns upload_transcript/notes/summary/recording,
trigger_on_finalize, allow_plaintext_lan, encrypt_before_upload so the UI can
pre-fill an edit form accurately (still never the secret, FR-SYNC-6).
extract_7z_flat replaces extract_zip_flat; NPU + DirectML now default to
git.dou.bet raw/branch/main/runtime/{openvino,directml}.7z with pinned SHA-256s
(DirectML no longer requires WA_DIRECTML_RUNTIME_URL). Adds an extraction test
against the real bundle (proves LZMA2+BCJ decode + flatten).
The NPU/DirectML runtime bundles are now LZMA2+BCJ 7z archives; zip was only used
for the old .zip bundle. sevenz-rust2 pinned to 0.7.0 (newer needs rustc>MSRV).
Set color-scheme on the theme roots so native controls render in the active
theme, and give the header template <select> an explicit elevated background +
themed <option> colors — an author-styled select's popup otherwise defaults to
white in dark mode.
The fixed-width settings panel overflowed horizontally because the tab nav
didn't wrap, pushing the X close button off the edge and adding a horizontal
scrollbar. nav now flex-wraps. Adds an About section: version, build commit,
and a link to the source repo (opened via open_url).
Mirrors the NPU package card, shown only when hardware_status marks DirectML
applicable; downloads model+runtime via download_directml_package and reloads
hardware to flip to Ready.
True only when staging DirectML would light up a present GPU this build can't
otherwise accelerate: npu compiled, no Vulkan baked in, and an AMD/Intel GPU
present (or NVIDIA without CUDA).
load_transcriber dispatches OnnxOpenVino/OnnxDirectML through one OnnxTranscriber
block. download_and_extract_runtime is parameterized (sha + readiness) so the new
stage_directml_runtime reuses it; hardware_status reports a directml package field.
load() now selects OpenVINO (NPU) or DirectML (AMD/Intel GPU) by BackendId over
the same ONNX artifacts; ensure_runtime_env takes the target runtime DLL. Adds
an opt-in directml_transcribes_speech spike for on-GPU validation.
load_transcriber now resolves the accel path instead of assuming a GPU
BackendId has a working offload. Only requests whisper GPU offload for
WhisperCuda/WhisperVulkan; NPU goes to the ONNX engine; everything else decodes
on CPU and reports the backend actually used.
whisper.cpp bakes in one GPU backend at compile time, so a BackendId alone
can't say how a vendor is served. Add AccelPath + resolve_accel(_with) as the
single source of truth over (compiled features x runtime readiness), and derive
BackendInfo.available from it in the DXGI + NPU paths. Closes the gap where a
present-but-unsupported GPU was marked available and best() routed to a no-op
GPU. Pure resolve_accel_with is unit-tested across all vendor/feature combos.