Guard BackupService and vault unlock for client mode
Details
- BackupService: skip scheduled backups in client mode (server handles
its own backups). Previously, SettingsViewModel's DI resolution
triggered BackupService constructor which immediately started the
backup timer — even in client mode.
- PluginRegistry.EnsurePluginVaultsUnlocked: skip in client mode since
vault state is managed by the server. The NativeLib vault calls would
fail (or succeed silently via catch) since the native runtime isn't
initialized in client mode.
Register EmbeddingService and IEmbeddingService in Desktop DI
Details
EmbeddingService (ONNX embedding model) and its IEmbeddingService
interface were never registered in Desktop's DI container. The Server
project registered a no-op HeadlessEmbeddingService, but Desktop was
missing the mapping entirely. This caused RagSearchService resolution
to fail when CommandPaletteViewModel built AI commands during
MainWindowViewModel construction.
Pre-existing bug surfaced by client mode startup where the full
DI resolution chain is exercised earlier than in standalone mode.
Migrate Files plugin from local ErrorMessage/SuccessMessage to unified IToastService
Details
Replace inline ErrorMessage and SuccessMessage observable properties with
centralized Toast() helper that delegates to _host.Toast.Show(). This removes
the custom auto-dismiss timer (OnSuccessMessageChanged) and inline TextBlock
toast UI from FilesView.axaml, aligning with the shell's unified toast system
already adopted by Calendar and other plugins.
Changes:
- Add private Toast() helper method using _host.Toast.Show()
- Replace all ErrorMessage assignments with Toast(..., ToastType.Error)
- Replace all SuccessMessage assignments with Toast(..., ToastType.Success)
- Remove ErrorMessage and SuccessMessage observable properties
- Remove OnSuccessMessageChanged partial method (3-second auto-dismiss)
- Remove ErrorMessage TextBlock from vault unlock panel in AXAML
- Remove SuccessMessage/ErrorMessage TextBlocks from status bar in AXAML
Migrate Calendar from local toasts to unified IToastService
Details
Replace custom ErrorMessage/SuccessMessage observable properties and
inline toast borders with the shell's IToastService (same pattern Tasks
uses). This gives Calendar consistent animated toasts with type-specific
styling and auto-dismiss timers managed by the shell.
Removed: ErrorMessage/SuccessMessage properties, OnErrorMessageChanged/
OnSuccessMessageChanged auto-clear handlers, inline success/error
Border elements from CalendarView.axaml.
Added: Toast() helper method routing to Host.Toast with StatusMessage
fallback (matching Tasks pattern).
Fix client mode startup: license check and error handling
Details
In client mode, ShowMainWindow crashed at LicenseExpirationService because
PrivStackService.GetLicenseStatus() requires the native runtime to be
initialized — which it isn't in client mode. The exception was silently
swallowed by the fire-and-forget task, leaving the app with no visible
window.
- Add license_status field to /api/v1/status endpoint response
- Parse and store server license status during TryEnterClientMode()
- Add CheckLicenseStatusFromServer() to LicenseExpirationService for
applying license status from a remote server string
- Use server-provided license status in client mode ShowMainWindow
- Add ContinueWith error handler on fire-and-forget EnterClientModeAsync
to log failures instead of silently swallowing them
Get notified about new releases