Add cloud sync desktop integration — DTOs, P/Invoke, and service layer (1.25.0)
Details
Phase 6 of the Cloud Sync Implementation Plan. Adds the .NET desktop integration layer for S3-backed cloud sync:
- CloudSyncModels.cs: DTOs for CloudSyncStatus, CloudQuota, CloudWorkspaceInfo, CloudAuthTokens, CloudShareInfo, SharedWithMeInfo, CloudDeviceInfo, and SyncTier enum
- PrivStackError.cs: Added error codes 28-33 (InvalidArgument, CloudSyncError, QuotaExceeded, ShareDenied, EnvelopeError, CloudAuthError) matching Rust FFI enum
- NativeLibrary.cs: 27 P/Invoke declarations for all privstack_cloudsync_* FFI exports (auth, key management, workspaces, sync engine, sharing, devices)
- ICloudSyncService.cs: Interface abstracting the cloud sync FFI surface for DI and testability
- CloudSyncService.cs: FFI wrapper implementing ICloudSyncService with DeserializeAndFree/MarshalAndFree helpers, lifecycle hooks (FlushIfSyncing on shutdown), and IDisposable cleanup
- Workspace.cs: Added SyncTier and CloudWorkspaceId properties
- ServiceRegistration.cs: Registered ICloudSyncService → CloudSyncService singleton
Add privstack-cloud crate for S3-backed cloud sync (1.7.0)
Details
New crate with 12 modules: API client (JWT auth, token refresh on 401),
S3 transport (STS credentials, upload/download), credential manager
(auto-refresh), adaptive outbox (solo 60s / collab 5s flush modes),
sync engine (tokio::select event loop), envelope manager (DEK sharing
orchestration), compaction (snapshot generation, >50 batch threshold),
sharing workflow (create/accept/revoke/cascade), blob sync (encrypted
upload/download with quota tracking), config, types, and error handling.
Dependencies: aws-sdk-s3, aws-sdk-sts, reqwest, crypto_box, sha2.
Replace DataGrid with shared TableGrid in Data plugin browse view (1.14.0)
Details
Migrated DatasetBrowseView from the native Avalonia DataGrid to the shared
TableGrid control from PrivStack.UI.Adaptive. This brings the Data plugin's
table display in line with the Notes plugin's table blocks, providing a
consistent table UX across the app.
Created DatasetTableGridSource (ITableGridDataSource adapter) that bridges
IDatasetService CRUD operations to the TableGrid control. Supports both
editable dataset mode (cell editing, row/column add/delete) and read-only
SQL view mode. Saved view sort overrides are preserved through the adapter.
The view is significantly simplified — filter bar, pagination controls,
loading indicator, column rebuilding, sorting handlers, clipboard paste,
and cell edit wiring are all now handled internally by TableGrid. The
code-behind drops from 172 lines to 60, and the XAML from 95 to 60.
TableGrid provides additional capabilities not previously available in
the Data plugin browse view: export (CSV/TSV/JSON/Markdown), freeze panes,
column resize grips, infinite scroll mode, context menus for row/column
operations, keyboard cell navigation, and URL detection in cells.
Add Relation variant to SdkPropertyType enum (1.25.0)
Details
Add Relation to the SdkPropertyType enum to support entity-linking
properties. Plugins will be able to define properties that reference
entities from any ILinkableItemProvider (contacts, tasks, notes, etc).
The new enum value is appended after Url to preserve ordinal mapping
with the Desktop PropertyType enum. SDK version bumped to 1.25.0.
Remove structural borders from PluginSidebar and PluginToolbar, use recessed surfaces (1.24.0)
Details
PluginSidebar: remove right border, use ThemeSurfaceRecessedBrush background,
transparent border brush, bind resize handle pill to ThemeBorderSubtleBrush.
PluginToolbar: remove bottom border, increase padding for breathing room,
use ThemeFontSizeHeading2 (22px) for title, transparent border brush.
Bump Directory.Build.props SDK version to 1.24.0.
Get notified about new releases